New upstream version 5.4.1+really5.3.2~repack
authorIOhannes m zmölnig <zmoelnig@umlautS.umlaeute.mur.at>
Wed, 5 Dec 2018 15:59:29 +0000 (16:59 +0100)
committerIOhannes m zmölnig <zmoelnig@umlautS.umlaeute.mur.at>
Wed, 5 Dec 2018 15:59:29 +0000 (16:59 +0100)
943 files changed:
BREAKING-CHANGES.txt
ChangeList.txt
LICENSE.md [deleted file]
README.md
doxygen/Doxyfile
examples/Assets/Box2DTests/Chain.h
examples/Audio/AudioAppDemo.h
examples/Audio/AudioLatencyDemo.h
examples/Audio/AudioRecordingDemo.h
examples/Audio/AudioSettingsDemo.h
examples/Audio/AudioSynthesiserDemo.h
examples/Audio/MPEDemo.h
examples/Audio/MidiDemo.h
examples/Audio/PluckedStringsDemo.h
examples/Audio/SimpleFFTDemo.h
examples/BLOCKS/BlocksDrawingDemo.h
examples/BLOCKS/BlocksMonitorDemo.h
examples/BLOCKS/BlocksSynthDemo.h
examples/DSP/ConvolutionDemo.h
examples/DSP/FIRFilterDemo.h
examples/DSP/GainDemo.h
examples/DSP/IIRFilterDemo.h
examples/DSP/OscillatorDemo.h
examples/DSP/OverdriveDemo.h
examples/DSP/SIMDRegisterDemo.h
examples/DSP/StateVariableFilterDemo.h
examples/DSP/WaveShaperTanhDemo.h
examples/DemoRunner/Builds/Android/app/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/build.gradle
examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml
examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Chain.h
examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/DemoRunner.java
examples/DemoRunner/Builds/Android/build.gradle
examples/DemoRunner/Builds/LinuxMakefile/Makefile
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/MacOSX/Info-App.plist
examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2013/resources.rc
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2015/resources.rc
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2017/resources.rc
examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/iOS/Info-App.plist
examples/DemoRunner/DemoRunner.jucer
examples/DemoRunner/JuceLibraryCode/AppConfig.h
examples/DemoRunner/JuceLibraryCode/JuceHeader.h
examples/DemoRunner/Source/Demos/DemoPIPs2.cpp
examples/DemoRunner/Source/Demos/JUCEDemos.cpp
examples/DemoRunner/Source/Main.cpp
examples/DemoRunner/Source/UI/MainComponent.cpp
examples/GUI/AnimationAppDemo.h
examples/GUI/AnimationDemo.h
examples/GUI/BouncingBallWavetableDemo.h
examples/GUI/CameraDemo.h
examples/GUI/CodeEditorDemo.h
examples/GUI/ComponentDemo.h
examples/GUI/ComponentTransformsDemo.h
examples/GUI/DialogsDemo.h
examples/GUI/FlexBoxDemo.h
examples/GUI/FontsDemo.h
examples/GUI/GraphicsDemo.h
examples/GUI/GridDemo.h
examples/GUI/HelloWorldDemo.h
examples/GUI/ImagesDemo.h
examples/GUI/KeyMappingsDemo.h
examples/GUI/LookAndFeelDemo.h
examples/GUI/MDIDemo.h
examples/GUI/MenusDemo.h
examples/GUI/MultiTouchDemo.h
examples/GUI/OpenGLAppDemo.h
examples/GUI/OpenGLDemo.h
examples/GUI/OpenGLDemo2D.h
examples/GUI/PropertiesDemo.h
examples/GUI/VideoDemo.h
examples/GUI/WebBrowserDemo.h
examples/GUI/WidgetsDemo.h
examples/GUI/WindowsDemo.h
examples/Plugins/AUv3SynthPluginDemo.h
examples/Plugins/ArpeggiatorPluginDemo.h
examples/Plugins/AudioPluginDemo.h
examples/Plugins/DSPModulePluginDemo.h
examples/Plugins/GainPluginDemo.h
examples/Plugins/InterAppAudioEffectPluginDemo.h
examples/Plugins/MultiOutSynthPluginDemo.h
examples/Plugins/NoiseGatePluginDemo.h
examples/Plugins/SamplerPluginDemo.h
examples/Plugins/SurroundPluginDemo.h
examples/Utilities/AnalyticsCollectionDemo.h
examples/Utilities/Box2DDemo.h
examples/Utilities/ChildProcessDemo.h
examples/Utilities/CryptographyDemo.h
examples/Utilities/InAppPurchasesDemo.h
examples/Utilities/JavaScriptDemo.h
examples/Utilities/LiveConstantDemo.h
examples/Utilities/MultithreadingDemo.h
examples/Utilities/NetworkingDemo.h
examples/Utilities/OSCDemo.h
examples/Utilities/PushNotificationsDemo.h
examples/Utilities/SystemInfoDemo.h
examples/Utilities/TimersAndEventsDemo.h
examples/Utilities/UnitTestsDemo.h
examples/Utilities/ValueTreesDemo.h
examples/Utilities/XMLandJSONDemo.h
extras/AudioPerformanceTest/AudioPerformanceTest.jucer
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
extras/AudioPerformanceTest/Builds/Android/app/build.gradle
extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml
extras/AudioPerformanceTest/Builds/Android/app/src/main/java/com/juce/audioperformancetest/AudioPerformanceTest.java
extras/AudioPerformanceTest/Builds/Android/build.gradle
extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/VisualStudio2017/AudioPerformanceTest_App.vcxproj
extras/AudioPerformanceTest/Builds/VisualStudio2017/AudioPerformanceTest_App.vcxproj.filters
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/JuceLibraryCode/AppConfig.h
extras/AudioPerformanceTest/JuceLibraryCode/JuceHeader.h
extras/AudioPluginHost/AudioPluginHost.jucer
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
extras/AudioPluginHost/Builds/Android/app/build.gradle
extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml
extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/AudioPluginHost.java
extras/AudioPluginHost/Builds/Android/build.gradle
extras/AudioPluginHost/Builds/LinuxMakefile/Makefile
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/MacOSX/Info-App.plist
extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/iOS/Info-App.plist
extras/AudioPluginHost/JuceLibraryCode/AppConfig.h
extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp
extras/AudioPluginHost/JuceLibraryCode/JuceHeader.h
extras/AudioPluginHost/Source/Filters/FilterGraph.cpp
extras/AudioPluginHost/Source/Filters/FilterGraph.h
extras/AudioPluginHost/Source/Filters/FilterIOConfiguration.cpp
extras/AudioPluginHost/Source/Filters/InternalFilters.cpp
extras/AudioPluginHost/Source/Filters/InternalFilters.h
extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp
extras/AudioPluginHost/Source/UI/MainHostWindow.cpp
extras/BinaryBuilder/BinaryBuilder.jucer
extras/BinaryBuilder/Builds/LinuxMakefile/Makefile
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/VisualStudio2017/BinaryBuilder_ConsoleApp.vcxproj
extras/BinaryBuilder/Builds/VisualStudio2017/BinaryBuilder_ConsoleApp.vcxproj.filters
extras/BinaryBuilder/JuceLibraryCode/AppConfig.h
extras/BinaryBuilder/JuceLibraryCode/JuceHeader.h
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle
extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml
extras/NetworkGraphicsDemo/Builds/Android/app/src/main/java/com/juce/networkgraphicsdemo/JUCENetworkGraphicsDemo.java
extras/NetworkGraphicsDemo/Builds/Android/build.gradle
extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2013/NetworkGraphicsDemo_App.vcxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2013/NetworkGraphicsDemo_App.vcxproj.filters
extras/NetworkGraphicsDemo/Builds/VisualStudio2017/NetworkGraphicsDemo_App.vcxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2017/NetworkGraphicsDemo_App.vcxproj.filters
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/JuceLibraryCode/AppConfig.h
extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp
extras/NetworkGraphicsDemo/JuceLibraryCode/JuceHeader.h
extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer
extras/NetworkGraphicsDemo/README.txt
extras/NetworkGraphicsDemo/Source/Demos.h
extras/NetworkGraphicsDemo/Source/Main.cpp
extras/NetworkGraphicsDemo/Source/SlaveComponent.h
extras/Projucer/Builds/LinuxMakefile/Makefile
extras/Projucer/Builds/MacOSX/Info-App.plist
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2013/resources.rc
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2015/resources.rc
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2017/resources.rc
extras/Projucer/JuceLibraryCode/AppConfig.h
extras/Projucer/JuceLibraryCode/BinaryData.cpp
extras/Projucer/JuceLibraryCode/BinaryData.h
extras/Projucer/JuceLibraryCode/JuceHeader.h
extras/Projucer/Projucer.jucer
extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h
extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h
extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h
extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h
extras/Projucer/Source/Application/jucer_Application.cpp
extras/Projucer/Source/Application/jucer_Application.h
extras/Projucer/Source/Application/jucer_AutoUpdater.cpp
extras/Projucer/Source/Application/jucer_CommandLine.cpp
extras/Projucer/Source/Application/jucer_CommandLine.h
extras/Projucer/Source/Application/jucer_MainWindow.cpp
extras/Projucer/Source/Application/jucer_MainWindow.h
extras/Projucer/Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp
extras/Projucer/Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp
extras/Projucer/Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs [deleted file]
extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp
extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h
extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h
extras/Projucer/Source/CodeEditor/jucer_LiveBuildCodeEditor.h
extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp
extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h
extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h
extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h
extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h
extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h
extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h
extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h
extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h
extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp
extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h
extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h
extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp
extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp
extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h
extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp
extras/Projucer/Source/Licenses/jucer_LicenseController.cpp
extras/Projucer/Source/Licenses/jucer_LicenseController.h
extras/Projucer/Source/Licenses/jucer_LicenseThread.h
extras/Projucer/Source/LiveBuildEngine/jucer_ActivityList.h
extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.cpp
extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h
extras/Projucer/Source/LiveBuildEngine/jucer_ErrorList.h
extras/Projucer/Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h
extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h
extras/Projucer/Source/Project/UI/Sidebar/jucer_LiveBuildTab.h
extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h
extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp
extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h
extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp
extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h
extras/Projucer/Source/Project/jucer_Module.cpp
extras/Projucer/Source/Project/jucer_Module.h
extras/Projucer/Source/Project/jucer_Project.cpp
extras/Projucer/Source/Project/jucer_Project.h
extras/Projucer/Source/Project/jucer_ProjectType.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp
extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp
extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h
extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h [deleted file]
extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp
extras/Projucer/Source/Settings/jucer_StoredSettings.cpp
extras/Projucer/Source/Settings/jucer_StoredSettings.h
extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp
extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp
extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h
extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp
extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h
extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h
extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h
extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp
extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h
extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp [new file with mode: 0644]
extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h [new file with mode: 0644]
extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h
extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h [deleted file]
extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp
extras/Projucer/Source/Wizards/jucer_NewProjectWizard.h
extras/Projucer/Source/Wizards/jucer_NewProjectWizardComponent.h
extras/Projucer/Source/Wizards/jucer_ProjectWizard_AudioPlugin.h
extras/Projucer/Source/Wizards/jucer_TemplateThumbnailsComponent.h
extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/JuceLibraryCode/AppConfig.h
extras/UnitTestRunner/JuceLibraryCode/JuceHeader.h
extras/UnitTestRunner/Source/Main.cpp
extras/UnitTestRunner/UnitTestRunner.jucer
extras/WindowsDLL/Builds/VisualStudio2017/WindowsDLL_StaticLibrary.vcxproj
extras/WindowsDLL/Builds/VisualStudio2017/WindowsDLL_StaticLibrary.vcxproj.filters
extras/WindowsDLL/JuceLibraryCode/AppConfig.h
extras/WindowsDLL/JuceLibraryCode/JuceHeader.h
extras/WindowsDLL/WindowsDLL.jucer
modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp
modules/juce_analytics/juce_analytics.h
modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp [deleted file]
modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h [deleted file]
modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp
modules/juce_audio_basics/effects/juce_LinearSmoothedValue.h
modules/juce_audio_basics/juce_audio_basics.cpp
modules/juce_audio_basics/juce_audio_basics.h
modules/juce_audio_basics/midi/juce_MidiBuffer.cpp
modules/juce_audio_basics/midi/juce_MidiFile.cpp
modules/juce_audio_basics/midi/juce_MidiFile.h
modules/juce_audio_basics/midi/juce_MidiMessage.cpp
modules/juce_audio_basics/midi/juce_MidiMessage.h
modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp
modules/juce_audio_basics/mpe/juce_MPEInstrument.h
modules/juce_audio_basics/mpe/juce_MPEMessages.cpp
modules/juce_audio_basics/mpe/juce_MPEMessages.h
modules/juce_audio_basics/mpe/juce_MPENote.h
modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp
modules/juce_audio_basics/mpe/juce_MPESynthesiser.h
modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp
modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h
modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp
modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp
modules/juce_audio_basics/synthesisers/juce_Synthesiser.h
modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp
modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h
modules/juce_audio_devices/juce_audio_devices.cpp
modules/juce_audio_devices/juce_audio_devices.h
modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp
modules/juce_audio_devices/native/juce_MidiDataConcatenator.h
modules/juce_audio_devices/native/juce_android_Audio.cpp
modules/juce_audio_devices/native/juce_android_Oboe.cpp
modules/juce_audio_devices/native/juce_android_OpenSL.cpp
modules/juce_audio_devices/native/juce_ios_Audio.cpp
modules/juce_audio_devices/native/juce_linux_ALSA.cpp
modules/juce_audio_devices/native/juce_linux_Bela.cpp
modules/juce_audio_devices/native/juce_linux_Midi.cpp
modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp
modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp
modules/juce_audio_devices/native/juce_win32_ASIO.cpp
modules/juce_audio_devices/native/juce_win32_Midi.cpp
modules/juce_audio_devices/native/juce_win32_WASAPI.cpp
modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp
modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
modules/juce_audio_formats/format/juce_AudioFormatReader.cpp
modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp
modules/juce_audio_formats/format/juce_AudioFormatWriter.h
modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp
modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp
modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h
modules/juce_audio_formats/juce_audio_formats.h
modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h [deleted file]
modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp [deleted file]
modules/juce_audio_plugin_client/VST/juce_VSTCallbackHandler.h
modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
modules/juce_audio_plugin_client/juce_audio_plugin_client.h
modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp [deleted file]
modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h
modules/juce_audio_plugin_client/utility/juce_PluginHostType.h
modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp
modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp
modules/juce_audio_processors/format/juce_AudioPluginFormat.h
modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/README.md [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp [deleted file]
modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h [deleted file]
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp
modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h
modules/juce_audio_processors/format_types/juce_VST3Common.h
modules/juce_audio_processors/format_types/juce_VST3Headers.h
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h
modules/juce_audio_processors/format_types/juce_VSTCommon.h
modules/juce_audio_processors/format_types/juce_VSTInterface.h [new file with mode: 0644]
modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h
modules/juce_audio_processors/juce_audio_processors.cpp
modules/juce_audio_processors/juce_audio_processors.h
modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp
modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
modules/juce_audio_processors/processors/juce_AudioProcessor.h
modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp
modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h
modules/juce_audio_processors/processors/juce_AudioProcessorListener.h
modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h
modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp [deleted file]
modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h [deleted file]
modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp
modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp
modules/juce_audio_processors/scanning/juce_PluginListComponent.h
modules/juce_audio_processors/utilities/juce_AudioParameterBool.h
modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h
modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h
modules/juce_audio_processors/utilities/juce_AudioParameterInt.h
modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h
modules/juce_audio_processors/utilities/juce_AudioProcessorParameters.cpp
modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp
modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h
modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h [deleted file]
modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h
modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp
modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp
modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h
modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp
modules/juce_audio_utils/gui/juce_AudioThumbnail.h
modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h
modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp
modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h
modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp
modules/juce_audio_utils/juce_audio_utils.h
modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp
modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp
modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h
modules/juce_audio_utils/players/juce_SoundPlayer.cpp
modules/juce_blocks_basics/blocks/juce_Block.cpp
modules/juce_blocks_basics/blocks/juce_Block.h
modules/juce_blocks_basics/blocks/juce_BlockConfigManager.h
modules/juce_blocks_basics/juce_LittleFootFunctions.dox
modules/juce_blocks_basics/juce_blocks_basics.cpp
modules/juce_blocks_basics/juce_blocks_basics.h
modules/juce_blocks_basics/littlefoot/juce_LittleFootCompiler.h
modules/juce_blocks_basics/littlefoot/juce_LittleFootRemoteHeap.h
modules/juce_blocks_basics/littlefoot/juce_LittleFootRunner.h
modules/juce_blocks_basics/protocol/Protocol Format.txt
modules/juce_blocks_basics/protocol/juce_BlocksProtocolDefinitions.h
modules/juce_blocks_basics/protocol/juce_HostPacketBuilder.h
modules/juce_blocks_basics/protocol/juce_HostPacketDecoder.h
modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp
modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.h
modules/juce_blocks_basics/topology/juce_RuleBasedTopologySource.cpp
modules/juce_blocks_basics/topology/juce_RuleBasedTopologySource.h
modules/juce_blocks_basics/topology/juce_Topology.h
modules/juce_blocks_basics/topology/juce_TopologySource.h
modules/juce_box2d/box2d/Collision/b2DynamicTree.cpp
modules/juce_box2d/juce_box2d.cpp
modules/juce_box2d/juce_box2d.h
modules/juce_core/containers/juce_Array.h
modules/juce_core/containers/juce_ArrayAllocationBase.h
modules/juce_core/containers/juce_ArrayBase.cpp [deleted file]
modules/juce_core/containers/juce_ArrayBase.h [deleted file]
modules/juce_core/containers/juce_HashMap.h
modules/juce_core/containers/juce_NamedValueSet.cpp
modules/juce_core/containers/juce_NamedValueSet.h
modules/juce_core/containers/juce_OwnedArray.cpp [deleted file]
modules/juce_core/containers/juce_OwnedArray.h
modules/juce_core/containers/juce_ReferenceCountedArray.cpp [deleted file]
modules/juce_core/containers/juce_ReferenceCountedArray.h
modules/juce_core/containers/juce_Variant.cpp
modules/juce_core/containers/juce_Variant.h
modules/juce_core/files/juce_DirectoryIterator.h
modules/juce_core/files/juce_File.cpp
modules/juce_core/files/juce_File.h
modules/juce_core/files/juce_FileInputStream.cpp
modules/juce_core/files/juce_FileOutputStream.h
modules/juce_core/files/juce_MemoryMappedFile.h
modules/juce_core/files/juce_TemporaryFile.h
modules/juce_core/javascript/juce_JSON.cpp
modules/juce_core/javascript/juce_Javascript.cpp
modules/juce_core/juce_core.cpp
modules/juce_core/juce_core.h
modules/juce_core/logging/juce_FileLogger.h
modules/juce_core/maths/juce_Expression.cpp
modules/juce_core/maths/juce_Expression.h
modules/juce_core/maths/juce_MathsFunctions.h
modules/juce_core/maths/juce_NormalisableRange.h
modules/juce_core/maths/juce_Range.h
modules/juce_core/maths/juce_StatisticsAccumulator.h
modules/juce_core/memory/juce_Atomic.h
modules/juce_core/memory/juce_HeapBlock.h
modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h [deleted file]
modules/juce_core/memory/juce_Memory.h
modules/juce_core/memory/juce_MemoryBlock.h
modules/juce_core/memory/juce_ReferenceCountedObject.h
modules/juce_core/memory/juce_ScopedPointer.h
modules/juce_core/memory/juce_SharedResourcePointer.h
modules/juce_core/memory/juce_WeakReference.h
modules/juce_core/misc/juce_ConsoleApplication.cpp [deleted file]
modules/juce_core/misc/juce_ConsoleApplication.h [deleted file]
modules/juce_core/misc/juce_RuntimePermissions.h
modules/juce_core/misc/juce_StdFunctionCompat.cpp
modules/juce_core/misc/juce_StdFunctionCompat.h
modules/juce_core/native/java/AndroidVideo.java [deleted file]
modules/juce_core/native/java/JuceAppActivity.java
modules/juce_core/native/juce_android_Files.cpp
modules/juce_core/native/juce_android_JNIHelpers.h
modules/juce_core/native/juce_android_Network.cpp
modules/juce_core/native/juce_android_SystemStats.cpp
modules/juce_core/native/juce_curl_Network.cpp
modules/juce_core/native/juce_linux_SystemStats.cpp
modules/juce_core/native/juce_mac_Files.mm
modules/juce_core/native/juce_mac_Network.mm
modules/juce_core/native/juce_mac_Strings.mm
modules/juce_core/native/juce_mac_SystemStats.mm
modules/juce_core/native/juce_mac_Threads.mm
modules/juce_core/native/juce_osx_ObjCHelpers.h
modules/juce_core/native/juce_posix_IPAddress.h [deleted file]
modules/juce_core/native/juce_posix_NamedPipe.cpp
modules/juce_core/native/juce_posix_SharedCode.h
modules/juce_core/native/juce_win32_Files.cpp
modules/juce_core/native/juce_win32_Network.cpp
modules/juce_core/native/juce_win32_SystemStats.cpp
modules/juce_core/network/juce_IPAddress.cpp
modules/juce_core/network/juce_IPAddress.h
modules/juce_core/network/juce_MACAddress.cpp
modules/juce_core/network/juce_MACAddress.h
modules/juce_core/network/juce_NamedPipe.cpp
modules/juce_core/network/juce_Socket.cpp
modules/juce_core/network/juce_Socket.h
modules/juce_core/network/juce_URL.cpp
modules/juce_core/network/juce_URL.h
modules/juce_core/network/juce_WebInputStream.h
modules/juce_core/streams/juce_BufferedInputStream.cpp
modules/juce_core/streams/juce_FileInputSource.h
modules/juce_core/streams/juce_InputStream.h
modules/juce_core/streams/juce_MemoryInputStream.cpp
modules/juce_core/streams/juce_MemoryInputStream.h
modules/juce_core/streams/juce_MemoryOutputStream.cpp
modules/juce_core/streams/juce_MemoryOutputStream.h
modules/juce_core/streams/juce_SubregionStream.cpp
modules/juce_core/streams/juce_URLInputSource.h
modules/juce_core/system/juce_CompilerSupport.h
modules/juce_core/system/juce_PlatformDefs.h
modules/juce_core/system/juce_StandardHeader.h
modules/juce_core/system/juce_SystemStats.cpp
modules/juce_core/system/juce_SystemStats.h
modules/juce_core/text/juce_LocalisedStrings.h
modules/juce_core/text/juce_String.cpp
modules/juce_core/text/juce_String.h
modules/juce_core/text/juce_StringArray.cpp
modules/juce_core/text/juce_StringArray.h
modules/juce_core/threads/juce_ChildProcess.h
modules/juce_core/threads/juce_CriticalSection.h
modules/juce_core/threads/juce_HighResolutionTimer.h
modules/juce_core/threads/juce_InterProcessLock.h
modules/juce_core/threads/juce_ReadWriteLock.cpp
modules/juce_core/threads/juce_ReadWriteLock.h
modules/juce_core/threads/juce_SpinLock.h
modules/juce_core/threads/juce_Thread.cpp
modules/juce_core/threads/juce_Thread.h
modules/juce_core/threads/juce_ThreadPool.cpp
modules/juce_core/threads/juce_ThreadPool.h
modules/juce_core/threads/juce_WaitableEvent.h
modules/juce_core/time/juce_Time.cpp
modules/juce_core/time/juce_Time.h
modules/juce_core/xml/juce_XmlDocument.cpp
modules/juce_core/xml/juce_XmlDocument.h
modules/juce_core/xml/juce_XmlElement.cpp
modules/juce_core/zip/juce_GZIPCompressorOutputStream.h
modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp
modules/juce_core/zip/juce_GZIPDecompressorInputStream.h
modules/juce_core/zip/juce_ZipFile.h
modules/juce_cryptography/encryption/juce_BlowFish.h
modules/juce_cryptography/encryption/juce_Primes.h
modules/juce_cryptography/encryption/juce_RSAKey.cpp
modules/juce_cryptography/juce_cryptography.h
modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp
modules/juce_data_structures/juce_data_structures.h
modules/juce_data_structures/undomanager/juce_UndoManager.cpp
modules/juce_data_structures/undomanager/juce_UndoManager.h
modules/juce_data_structures/values/juce_ValueTree.cpp
modules/juce_data_structures/values/juce_ValueTree.h
modules/juce_data_structures/values/juce_ValueWithDefault.h
modules/juce_dsp/containers/juce_AudioBlock.h
modules/juce_dsp/containers/juce_SIMDRegister.h
modules/juce_dsp/containers/juce_SIMDRegister_Impl.h
modules/juce_dsp/containers/juce_SIMDRegister_test.cpp
modules/juce_dsp/filter_design/juce_FilterDesign.cpp
modules/juce_dsp/filter_design/juce_FilterDesign.h [changed mode: 0644->0755]
modules/juce_dsp/frequency/juce_Convolution.cpp
modules/juce_dsp/frequency/juce_Convolution.h
modules/juce_dsp/frequency/juce_FFT.cpp
modules/juce_dsp/juce_dsp.h
modules/juce_dsp/maths/juce_FastMathApproximations.h
modules/juce_dsp/maths/juce_LookupTable.h
modules/juce_dsp/native/juce_avx_SIMDNativeOps.h
modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h
modules/juce_dsp/processors/juce_FIRFilter.h
modules/juce_dsp/processors/juce_FIRFilter_test.cpp
modules/juce_dsp/processors/juce_IIRFilter.cpp
modules/juce_dsp/processors/juce_IIRFilter.h
modules/juce_dsp/processors/juce_IIRFilter_Impl.h
modules/juce_dsp/processors/juce_Oversampling.cpp
modules/juce_dsp/processors/juce_Oversampling.h
modules/juce_dsp/processors/juce_ProcessorDuplicator.h
modules/juce_dsp/processors/juce_StateVariableFilter.h
modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp
modules/juce_events/broadcasters/juce_AsyncUpdater.cpp
modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp
modules/juce_events/interprocess/juce_ConnectedChildProcess.h
modules/juce_events/interprocess/juce_InterprocessConnection.h
modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp [deleted file]
modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h [deleted file]
modules/juce_events/juce_events.cpp
modules/juce_events/juce_events.h
modules/juce_events/messages/juce_ApplicationBase.cpp
modules/juce_events/messages/juce_ApplicationBase.h
modules/juce_events/messages/juce_Initialisation.h
modules/juce_events/messages/juce_MessageListener.cpp
modules/juce_events/messages/juce_MessageManager.cpp
modules/juce_events/messages/juce_MessageManager.h
modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h
modules/juce_events/native/juce_android_Messaging.cpp
modules/juce_events/native/juce_mac_MessageManager.mm
modules/juce_events/native/juce_win32_Messaging.cpp
modules/juce_events/native/juce_win32_WinRTWrapper.cpp
modules/juce_events/native/juce_win32_WinRTWrapper.h
modules/juce_events/timers/juce_Timer.cpp
modules/juce_graphics/colour/juce_Colour.cpp
modules/juce_graphics/colour/juce_Colour.h
modules/juce_graphics/colour/juce_PixelFormats.h
modules/juce_graphics/contexts/juce_GraphicsContext.cpp
modules/juce_graphics/contexts/juce_GraphicsContext.h
modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp
modules/juce_graphics/effects/juce_DropShadowEffect.cpp
modules/juce_graphics/effects/juce_DropShadowEffect.h
modules/juce_graphics/fonts/juce_CustomTypeface.cpp
modules/juce_graphics/fonts/juce_CustomTypeface.h
modules/juce_graphics/fonts/juce_Font.cpp
modules/juce_graphics/fonts/juce_Typeface.cpp
modules/juce_graphics/fonts/juce_Typeface.h
modules/juce_graphics/geometry/juce_AffineTransform.cpp
modules/juce_graphics/geometry/juce_AffineTransform.h
modules/juce_graphics/geometry/juce_BorderSize.h
modules/juce_graphics/geometry/juce_Line.h
modules/juce_graphics/geometry/juce_Parallelogram.h
modules/juce_graphics/geometry/juce_Path.cpp
modules/juce_graphics/geometry/juce_PathStrokeType.cpp
modules/juce_graphics/geometry/juce_Point.h
modules/juce_graphics/geometry/juce_Rectangle.h
modules/juce_graphics/geometry/juce_RectangleList.h
modules/juce_graphics/image_formats/juce_JPEGLoader.cpp
modules/juce_graphics/image_formats/juce_PNGLoader.cpp
modules/juce_graphics/images/juce_Image.cpp
modules/juce_graphics/images/juce_Image.h
modules/juce_graphics/juce_graphics.cpp
modules/juce_graphics/juce_graphics.h
modules/juce_graphics/native/juce_RenderingHelpers.h
modules/juce_graphics/native/juce_android_Fonts.cpp
modules/juce_graphics/native/juce_android_GraphicsContext.cpp
modules/juce_graphics/native/juce_freetype_Fonts.cpp
modules/juce_graphics/native/juce_linux_Fonts.cpp
modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h
modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm
modules/juce_graphics/native/juce_mac_Fonts.mm
modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp
modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h
modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp
modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp
modules/juce_graphics/native/juce_win32_Fonts.cpp
modules/juce_graphics/placement/juce_Justification.h
modules/juce_graphics/placement/juce_RectanglePlacement.cpp
modules/juce_graphics/placement/juce_RectanglePlacement.h
modules/juce_gui_basics/buttons/juce_ArrowButton.cpp
modules/juce_gui_basics/buttons/juce_ArrowButton.h
modules/juce_gui_basics/buttons/juce_Button.h
modules/juce_gui_basics/buttons/juce_DrawableButton.cpp
modules/juce_gui_basics/buttons/juce_DrawableButton.h
modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp
modules/juce_gui_basics/buttons/juce_HyperlinkButton.h
modules/juce_gui_basics/buttons/juce_ImageButton.cpp
modules/juce_gui_basics/buttons/juce_ImageButton.h
modules/juce_gui_basics/buttons/juce_ShapeButton.cpp
modules/juce_gui_basics/buttons/juce_ShapeButton.h
modules/juce_gui_basics/buttons/juce_TextButton.cpp
modules/juce_gui_basics/buttons/juce_TextButton.h
modules/juce_gui_basics/buttons/juce_ToggleButton.cpp
modules/juce_gui_basics/buttons/juce_ToggleButton.h
modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp
modules/juce_gui_basics/components/juce_Component.cpp
modules/juce_gui_basics/components/juce_Component.h
modules/juce_gui_basics/components/juce_Desktop.cpp [new file with mode: 0644]
modules/juce_gui_basics/components/juce_Desktop.h [new file with mode: 0644]
modules/juce_gui_basics/components/juce_ModalComponentManager.cpp
modules/juce_gui_basics/components/juce_ModalComponentManager.h
modules/juce_gui_basics/desktop/juce_Desktop.cpp [deleted file]
modules/juce_gui_basics/desktop/juce_Desktop.h [deleted file]
modules/juce_gui_basics/desktop/juce_Displays.cpp [deleted file]
modules/juce_gui_basics/desktop/juce_Displays.h [deleted file]
modules/juce_gui_basics/drawables/juce_DrawablePath.h
modules/juce_gui_basics/drawables/juce_DrawableRectangle.h
modules/juce_gui_basics/drawables/juce_SVGParser.cpp
modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp
modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp
modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h
modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp
modules/juce_gui_basics/filebrowser/juce_FileChooser.h
modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp
modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h
modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp
modules/juce_gui_basics/juce_gui_basics.cpp
modules/juce_gui_basics/juce_gui_basics.h
modules/juce_gui_basics/keyboard/juce_KeyPress.cpp
modules/juce_gui_basics/keyboard/juce_KeyPress.h
modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp
modules/juce_gui_basics/keyboard/juce_ModifierKeys.h
modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp
modules/juce_gui_basics/layout/juce_ComponentAnimator.h
modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp
modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h
modules/juce_gui_basics/layout/juce_ConcertinaPanel.h
modules/juce_gui_basics/layout/juce_Grid.cpp
modules/juce_gui_basics/layout/juce_GridUnitTests.cpp
modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp
modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h
modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp
modules/juce_gui_basics/layout/juce_ScrollBar.cpp
modules/juce_gui_basics/layout/juce_ScrollBar.h
modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp
modules/juce_gui_basics/layout/juce_TabbedButtonBar.h
modules/juce_gui_basics/layout/juce_TabbedComponent.cpp
modules/juce_gui_basics/layout/juce_TabbedComponent.h
modules/juce_gui_basics/layout/juce_Viewport.cpp
modules/juce_gui_basics/layout/juce_Viewport.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h
modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp
modules/juce_gui_basics/menus/juce_MenuBarModel.cpp
modules/juce_gui_basics/menus/juce_MenuBarModel.h
modules/juce_gui_basics/menus/juce_PopupMenu.cpp
modules/juce_gui_basics/misc/juce_BubbleComponent.cpp
modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp
modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp
modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp
modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h
modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h
modules/juce_gui_basics/mouse/juce_MouseCursor.h
modules/juce_gui_basics/mouse/juce_MouseEvent.cpp
modules/juce_gui_basics/mouse/juce_MouseEvent.h
modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp
modules/juce_gui_basics/mouse/juce_SelectedItemSet.h
modules/juce_gui_basics/native/juce_android_ContentSharer.cpp
modules/juce_gui_basics/native/juce_android_Windowing.cpp
modules/juce_gui_basics/native/juce_common_MimeTypes.cpp
modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp
modules/juce_gui_basics/native/juce_ios_FileChooser.mm
modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm
modules/juce_gui_basics/native/juce_ios_Windowing.mm
modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp
modules/juce_gui_basics/native/juce_mac_FileChooser.mm
modules/juce_gui_basics/native/juce_mac_MainMenu.mm
modules/juce_gui_basics/native/juce_mac_MouseCursor.mm
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
modules/juce_gui_basics/native/juce_mac_Windowing.mm
modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp
modules/juce_gui_basics/native/juce_win32_Windowing.cpp
modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h
modules/juce_gui_basics/positioning/juce_RelativePointPath.h
modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h
modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp
modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h
modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp
modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h
modules/juce_gui_basics/properties/juce_PropertyComponent.cpp
modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h
modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp
modules/juce_gui_basics/properties/juce_TextPropertyComponent.h
modules/juce_gui_basics/widgets/juce_ComboBox.cpp
modules/juce_gui_basics/widgets/juce_ComboBox.h
modules/juce_gui_basics/widgets/juce_Label.cpp
modules/juce_gui_basics/widgets/juce_Label.h
modules/juce_gui_basics/widgets/juce_Slider.cpp
modules/juce_gui_basics/widgets/juce_Slider.h
modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp
modules/juce_gui_basics/widgets/juce_TextEditor.cpp
modules/juce_gui_basics/widgets/juce_TreeView.h
modules/juce_gui_basics/windows/juce_AlertWindow.cpp
modules/juce_gui_basics/windows/juce_CallOutBox.cpp
modules/juce_gui_basics/windows/juce_CallOutBox.h
modules/juce_gui_basics/windows/juce_ComponentPeer.cpp
modules/juce_gui_basics/windows/juce_ComponentPeer.h
modules/juce_gui_basics/windows/juce_DialogWindow.h
modules/juce_gui_basics/windows/juce_DocumentWindow.cpp
modules/juce_gui_basics/windows/juce_DocumentWindow.h
modules/juce_gui_basics/windows/juce_ResizableWindow.cpp
modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp
modules/juce_gui_basics/windows/juce_TooltipWindow.cpp
modules/juce_gui_basics/windows/juce_TooltipWindow.h
modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h
modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp
modules/juce_gui_extra/code_editor/juce_CodeDocument.h
modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h
modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp
modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h
modules/juce_gui_extra/embedding/juce_NSViewComponent.h
modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h [deleted file]
modules/juce_gui_extra/embedding/juce_UIViewComponent.h
modules/juce_gui_extra/embedding/juce_XEmbedComponent.h
modules/juce_gui_extra/juce_gui_extra.cpp
modules/juce_gui_extra/juce_gui_extra.h
modules/juce_gui_extra/misc/juce_ColourSelector.cpp
modules/juce_gui_extra/misc/juce_ColourSelector.h
modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h
modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp
modules/juce_gui_extra/misc/juce_LiveConstantEditor.h
modules/juce_gui_extra/misc/juce_PushNotifications.h
modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp
modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp
modules/juce_gui_extra/native/juce_android_PushNotifications.cpp
modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp
modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp
modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp
modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp
modules/juce_gui_extra/native/juce_mac_AppleRemote.mm
modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp
modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm
modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp
modules/juce_opengl/geometry/juce_Matrix3D.h
modules/juce_opengl/juce_opengl.cpp
modules/juce_opengl/juce_opengl.h
modules/juce_opengl/native/juce_OpenGLExtensions.h
modules/juce_opengl/native/juce_OpenGL_android.h
modules/juce_opengl/native/juce_OpenGL_linux_X11.h
modules/juce_opengl/native/juce_OpenGL_osx.h
modules/juce_opengl/native/juce_OpenGL_win32.h
modules/juce_opengl/opengl/juce_OpenGLContext.cpp
modules/juce_opengl/opengl/juce_OpenGLContext.h
modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp
modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h
modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp
modules/juce_opengl/opengl/juce_OpenGLImage.cpp
modules/juce_osc/juce_osc.h
modules/juce_osc/osc/juce_OSCAddress.cpp
modules/juce_osc/osc/juce_OSCAddress.h
modules/juce_osc/osc/juce_OSCArgument.cpp
modules/juce_osc/osc/juce_OSCArgument.h
modules/juce_osc/osc/juce_OSCMessage.cpp
modules/juce_osc/osc/juce_OSCMessage.h
modules/juce_osc/osc/juce_OSCReceiver.cpp
modules/juce_osc/osc/juce_OSCReceiver.h
modules/juce_osc/osc/juce_OSCSender.cpp
modules/juce_osc/osc/juce_OSCSender.h
modules/juce_osc/osc/juce_OSCTypes.cpp
modules/juce_osc/osc/juce_OSCTypes.h
modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h
modules/juce_product_unlocking/juce_product_unlocking.h
modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp
modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp
modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h
modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp
modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp
modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp
modules/juce_video/capture/juce_CameraDevice.cpp
modules/juce_video/capture/juce_CameraDevice.h
modules/juce_video/juce_video.h
modules/juce_video/native/juce_android_CameraDevice.h
modules/juce_video/native/juce_android_Video.h [deleted file]
modules/juce_video/native/juce_ios_CameraDevice.h
modules/juce_video/native/juce_mac_CameraDevice.h
modules/juce_video/native/juce_mac_Video.h
modules/juce_video/native/juce_win32_CameraDevice.h
modules/juce_video/native/juce_win32_Video.h
modules/juce_video/playback/juce_VideoComponent.cpp
modules/juce_video/playback/juce_VideoComponent.h

index 94086eefb0cc78925ac215d6ceaf7dfab95558ca..937d84996982dad76615c060b8143cffe13ee52e 100644 (file)
@@ -5,183 +5,6 @@ Develop
 =======\r
 \r
 \r
-Version 5.4.0\r
-=============\r
-\r
-Change\r
-------\r
-The use of WinRT MIDI functions has been disabled by default for any version\r
-of Windows 10 before 1809 (October 2018 Update).\r
-\r
-Possible Issues\r
----------------\r
-If you were previously using WinRT MIDI functions on older versions of Windows\r
-then the new behaviour is to revert to the old Win32 MIDI API.\r
-\r
-Workaround\r
-----------\r
-Set the preprocessor macro JUCE_FORCE_WINRT_MIDI=1 (in addition to the\r
-previously selected JUCE_USE_WINRT_MIDI=1) to allow the use of the WinRT API on\r
-older versions of Windows.\r
-\r
-Rationale\r
----------\r
-Until now JUCE's support for the Windows 10 WinRT MIDI API was experimental,\r
-due to longstanding issues within the API itself. These issues have been\r
-addressed in the Windows 10 1809 (October 2018 Update) release.\r
-\r
-\r
-Change\r
-------\r
-The VST2 SDK embedded within JUCE has been removed.\r
-\r
-Possible Issues\r
----------------\r
-1. Building or hosting VST2 plug-ins requires header files from the VST2 SDK,\r
-   which is no longer part of JUCE.\r
-2. Building a VST2-compatible VST3 plug-in (the previous default behaviour in\r
-   JUCE) requires header files from the VST2 SDK, which is no longer part of\r
-   JUCE. When a new JUCE plug-in project is created the option\r
-   JUCE_VST3_CAN_REPLACE_VST2 will be set to zero.\r
-\r
-Workaround\r
-----------\r
-1. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or\r
-   older) VST3 SDK or JUCE version 5.3.2. You should put the VST2 SDK in your\r
-   header search paths or use the "VST (Legacy) SDK Folder" fields in the\r
-   Projucer.\r
-2. For new plug-in projects where you will be releasing both a VST2 and VST3\r
-   version, and you want the VST3 plug-in to replace the VST2 plug-in in\r
-   hosts that support it, then you should enable the JUCE_VST3_CAN_REPLACE_VST2\r
-   option.\r
-\r
-Rationale\r
----------\r
-Distributing VST2 plug-ins requires a VST2 license from Steinberg. Following\r
-Steinberg's removal of the VST2 SDK from their public SDKs we are also removing\r
-the VST2 SDK from the JUCE codebase.\r
-\r
-\r
-Change\r
-------\r
-The AudioProcessorValueTreeState::createAndAddParameter function has been\r
-deprecated.\r
-\r
-Possible Issues\r
----------------\r
-Deprecation warnings will be seen when compiling code which uses this function\r
-and eventually builds will fail when it is later removed from the API.\r
-\r
-Workaround\r
-----------\r
-Previous calls to\r
-\r
-createAndAddParameter (paramID, paramName, ...);\r
-\r
-can be directly replaced with\r
-\r
-using Parameter = AudioProcessorValueTreeState::Parameter;\r
-createAndAddParameter (std::make_unique<Parameter> (paramID, paramName, ...));\r
-\r
-but an even better approach is to use the new AudioProcessorValueTreeState\r
-constructor where you can pass both RangedAudioParameters and\r
-AudioProcessorParameterGroups of RangedAudioParameters to the\r
-AudioProcessorValueTreeState and initialise the ValueTree simultaneously.\r
-\r
-Rationale\r
----------\r
-The new createAndAddParameter method is much more flexible and enables any\r
-parameter types derived from RangedAudioParameter to be managed by the\r
-AudioProcessorValueTreeState.\r
-\r
-\r
-Change\r
-------\r
-The Projucer's per-exporter Android SDK/NDK path options have been removed.\r
-\r
-Possible Issues\r
----------------\r
-Projects that previously used these fields may no longer build.\r
-\r
-Workaround\r
-----------\r
-Use the Projucer's global paths settings to point to these directories, either\r
-by opening the "Projucer/File->Global Paths..." menu item or using the\r
-"--set-global-search-path" command-line option.\r
-\r
-Rationale\r
----------\r
-Having multiple places where the paths could be set was confusing and could\r
-cause unexpected mismatches.\r
-\r
-\r
-Change\r
-------\r
-SystemStats::getDeviceDescription() will now return the device code on iOS e.g.\r
-"iPhone7, 2" for an iPhone 6 instead of just "iPhone".\r
-\r
-Possible Issues\r
----------------\r
-Code that previously relied on this method returning either explicitly "iPhone"\r
-or "iPad" may no longer work.\r
-\r
-Workaround\r
-----------\r
-Modify this code to handle the new device code string e.g. by changing:\r
-SystemStats::getDeviceDescription() == "iPhone";\r
-to\r
-SystemStats::getDeviceDescription().contains ("iPhone");.\r
-\r
-Rationale\r
----------\r
-The exact device model can now be deduced from this information instead of just\r
-the device family.\r
-\r
-\r
-Change\r
-------\r
-DragAndDropContainer::performExternalDragDropOfFiles() and\r
-::performExternalDragDropOfText() are now asynchronous on Windows.\r
-\r
-Possible Issues\r
----------------\r
-Code that previously relied on these operations being synchronous and blocking\r
-until completion will no longer work as the methods will return immediately and\r
-run asynchronously.\r
-\r
-Workaround\r
-----------\r
-Use the callback argument that has been added to these methods to register a\r
-lambda that will be called when the operation has been completed.\r
-\r
-Rationale\r
----------\r
-The behaviour of these methods is now consistent across all platforms and the\r
-method no longer blocks the message thread on Windows.\r
-\r
-\r
-Change\r
-------\r
-AudioProcessor::getTailLengthSeconds can now return infinity for\r
-VST/VST3/AU/AUv3.\r
-\r
-Possible Issues\r
----------------\r
-If you are using the result of getTailLengthSeconds to allocate a buffer in\r
-your host, then your host will now likely crash when loading a plug-in with an\r
-infinite tail time.\r
-\r
-Workaround\r
-----------\r
-Rewrite your code to not use the result of getTailLengthSeconds directly to\r
-allocate a buffer.\r
-\r
-Rationale\r
----------\r
-Before this change there was no way for a JUCE plug-in to report an infinite\r
-tail time.\r
-\r
-\r
 Version 5.3.2\r
 =============\r
 \r
@@ -239,7 +62,7 @@ the Network Graphics Demo have been moved into the extras directory.
 \r
 Possible Issues\r
 ---------------\r
-1. Due to the large number of changes that have occurred in the JUCE Git\r
+1. Due to the large number of changes that have occured in the JUCE Git\r
    repository, pulling this version may result in a messy folder structure with\r
    empty directories that have been removed.\r
 2. The JUCE Demo project is no longer in the JUCE repository.\r
@@ -628,25 +451,6 @@ truncating those numbers.
 Version 5.1.0\r
 =============\r
 \r
-Change\r
-------\r
-The JUCE_COMPILER_SUPPORTS_LAMBDAS preprocessor macro has been removed.\r
-\r
-Possible Issues\r
----------------\r
-If your project is using JUCE_COMPILER_SUPPORTS_LAMBDAS in your source code\r
-then it will likely evaluate to "false" and you could end up unnecessarily\r
-using code paths which avoid lambda functions.\r
-\r
-Workaround\r
-----------\r
-Remove the usage of JUCE_COMPILER_SUPPORTS_LAMBDAS from your code.\r
-\r
-Rationale\r
----------\r
-Lambda functions are now available on all platforms that JUCE supports.\r
-\r
-\r
 Change\r
 ------\r
 The option to set the C++ language standard is now located in the project\r
@@ -654,7 +458,7 @@ settings instead of the build configuration settings.
 \r
 Possible Issues\r
 ---------------\r
-Projects that had a specific version of the C++ language standard set for\r
+Projects that had a specific verison of the C++ language standard set for\r
 exporter build configurations will instead use the default (C++11) when\r
 re-saving with the new Projucer.\r
 \r
index 3594e821378cf29c03ba22591c389114698de484..54ae34b6eef5e0c1e4cbff5204467058893b56dd 100644 (file)
@@ -1,28 +1,9 @@
+\r
 == Major JUCE features and updates ==\r
 \r
 This file just lists the more notable headline features. For more detailed info\r
 about minor changes and bugfixes, please see the git log!\r
 \r
-Version 5.4.1\r
-  - Fixed a VST2 compilation error in VS2013\r
-  - Projucer:  Fixed some live-build compilation errors\r
-  - Fixed a bug in the Oversampling class\r
-  - MPE:  Made MPESynthesiserVoice::noteOnTime public\r
-  - Fixed some bugs in the Unity plug-in wrapper\r
-  - Fixed some VS2015 compiler errors\r
-\r
-Version 5.4.0\r
-  - macOS Mojave and iOS 12 support\r
-  - Windows hiDPI support\r
-  - Unity native plug-in support\r
-  - Microsoft BLE MIDI support\r
-  - Plug-in parameter groups\r
-  - Support for production-ready Android OBOE\r
-  - Video playback support on Android and iOS\r
-  - AudioProcessorValueTreeState improvements\r
-  - Support for Android Studio 3.2\r
-  - Various bug-fixes, improvements and documentation updates\r
-\r
 Version 5.3.2\r
   - Removed the OSX 10.5 and 10.6 deployment target options from the Projucer and enabled more C++11 features across all platforms\r
   - Replaced all usage of ScopedPointer with std::unique_ptr\r
@@ -115,6 +96,7 @@ Version 5.2.0
   - Improved the performance of 3D rendering when multiple OpenGL contexts are used at the same time\r
   - Tweaked the rate at which EdgeTable grows its internal storage, to improve performance rendering large and complex paths\r
 \r
+\r
 Version 5.1.2\r
   - Fixed multiple plugin-resizing bugs\r
   - Added support for AUv3 MIDI and screen size negotiation\r
@@ -352,3 +334,4 @@ Version 3.2.0
     and valueTreeChildOrderChanged() methods to include more info about\r
     exactly what changed\r
   - Over 400 minor changes, bug-fixes, documentation improvements, etc.\r
+\r
diff --git a/LICENSE.md b/LICENSE.md
deleted file mode 100644 (file)
index c60278b..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# The JUCE 5 Library
-
-**BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE
-TO THE [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
-AND [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy), WHICH
-ARE BINDING AGREEMENTS BETWEEN YOU AND ROLI, LTD. IF YOU DO NOT AGREE TO THE
-TERMS, DO NOT USE THE JUCE LIBRARY.**
-
-We now have tier-leveled license terms for JUCE 5, with different terms for
-each available license: JUCE Personal (for developers or startup businesses
-with revenue under 50K USD "Revenue Limit"; free), JUCE Indie (for small
-businesses with under 200K Revenue Limit; $35/month), JUCE Pro (no Revenue
-Limit; $65/month), and JUCE Educational (no Revenue Limit; free for bona fide
-educational institutes). All licenses allow you to commercially release
-applications so long as you do not exceed the Revenue Limit and pay applicable
-Fees. Once your business hits the Revenue Limit for your JUCE license, you will
-either have to upgrade your JUCE license or release your Applications under the
-[GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html),
-which means, among other things, that your code can be freely copied and
-distributed.
-
-You agree to give notice to the end-users of your Applications that we may
-track the IP addresses associated with their use of the Applications using JUCE
-solely for our internal purposes in providing JUCE, unless you are a paying
-JUCE customer and opt-out of such tracking. You agree to fully comply with all
-laws, including relating to the collection of information from children and the
-[Children’s Online Privacy Protection Act
-(COPPA)](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule).
-
-JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
-EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE, ARE DISCLAIMED.
-
-The juce_audio_basics, juce_audio_devices, juce_blocks_basics, juce_core and
-juce_events modules are permissively licensed under the terms of the [ISC
-license](http://www.isc.org/downloads/software-support-policy/isc-license).
-
-For more information, visit the website:
-[www.juce.com](https://www.juce.com)
-
-FULL JUCE TERMS:
-- [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
-- [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy)
\ No newline at end of file
index 7cd17e04ee33e15e0d437c2905ea94ab99716eae..2bfc4c7bc462f6a3cc57dfbfd80c2952e0b5c272 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,63 +1,47 @@
-![alt text](https://d30pueezughrda.cloudfront.net/juce/JUCE_banner.png "JUCE")
-
-JUCE is an open-source cross-platform C++ application framework used for rapidly 
-developing high quality desktop and mobile applications, including VST, AU (and AUv3), 
-RTAS and AAX audio plug-ins. JUCE can be easily integrated with existing projects or can 
-be used as a project generation tool via the [Projucer](https://juce.com/discover/projucer), 
-which supports exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio, 
-Code::Blocks, CLion and Linux Makefiles as well as containing a source code editor and 
-live-coding engine which can be used for rapid prototyping. 
-
-## Getting Started
-The JUCE repository contains a [master](https://github.com/weareroli/JUCE/tree/master) 
-and [develop](https://github.com/weareroli/JUCE/tree/develop) branch. The develop branch 
-contains the latest bugfixes and features and is periodically merged into the master 
-branch in stable [tagged releases](https://github.com/WeAreROLI/JUCE/releases) 
-(the latest release containing pre-built binaries can be also downloaded from the 
-[JUCE website](https://shop.juce.com/get-juce)).
-
-The repository doesn't contain a pre-built Projucer so you will need to build it
-for your platform - Xcode, Visual Studio and Linux Makefile projects are located in 
-[extras/Projucer/Builds](/extras/Projucer/Builds) 
-(the minumum system requirements are listed in the __System Requirements__ section below). 
-The Projucer can then be used to create new JUCE projects, view tutorials and run examples. 
-It is also possible to include the JUCE modules source code in an existing project directly, 
-or build them into a static or dynamic library which can be linked into a project.
-
-For further help getting started, please refer to the JUCE 
-[documentation](https://juce.com/learn/documentation) and 
-[tutorials](https://juce.com/learn/tutorials).
-
-## System Requirements
-#### Building JUCE Projects
-- __macOS__: macOS 10.11 and Xcode 7.3.1
-- __Windows__: Windows 8.1 and Visual Studio 2013 64-bit
-- __Linux__: GCC 5.0
-
-#### Minimum Deployment Targets
-- __macOS__: macOS 10.7
-- __Windows__: Windows Vista
-- __Linux__: Mainstream Linux distributions
-
-## Contributing
-For bug reports and features requests, please visit the [JUCE Forum](https://forum.juce.com/) - 
-the JUCE developers are active there and will read every post and respond accordingly. When
-submitting a bug report, please ensure that it follows the 
-[issue template](/.github/ISSUE_TEMPLATE.txt). 
-We don't accept third party GitHub pull requests directly due to copyright restrictions 
-but if you would like to contribute any changes please contact us.
-
-## License
-The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_blocks_basics, juce_core 
-and juce_events) are permissively licensed under the terms of the 
-[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/). 
-Other modules are covered by a 
-[GPL/Commercial license](https://www.gnu.org/licenses/gpl-3.0.en.html).
-
-There are multiple commercial licensing tiers for JUCE 5, with different terms for each:
-- JUCE Personal (developers or startup businesses with revenue under 50K USD) - free
-- JUCE Indie (small businesses with revenue under 200K USD) - $35/month
-- JUCE Pro (no revenue limit) - $65/month
-- JUCE Eductational (no revenue limit) - free for bona fide educational institutes
-
-For full terms see [LICENSE.md](LICENSE.md).
\ No newline at end of file
+# The JUCE 5 Library
+
+**BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE
+TO THE [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
+AND [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy), WHICH
+ARE BINDING AGREEMENTS BETWEEN YOU AND ROLI, LTD. IF YOU DO NOT AGREE TO THE
+TERMS, DO NOT USE THE JUCE LIBRARY.**
+
+JUCE is an all-encompassing C++ framework for developing cross-platform
+software. JUCE is used by hundreds of companies to develop powerful,
+cross-platform audio, interactive, embedded or graphic applications.
+
+We now have tier-leveled license terms for JUCE 5, with different terms for
+each available license: JUCE Personal (for developers or startup businesses
+with revenue under 50K USD "Revenue Limit"; free), JUCE Indie (for small
+businesses with under 200K Revenue Limit; $35/month), JUCE Pro (no Revenue
+Limit; $65/month), and JUCE Educational (no Revenue Limit; free for bona fide
+educational institutes). All licenses allow you to commercially release
+applications so long as you do not exceed the Revenue Limit and pay applicable
+Fees. Once your business hits the Revenue Limit for your JUCE license, you will
+either have to upgrade your JUCE license or release your Applications under the
+[GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html),
+which means, among other things, that your code can be freely copied and
+distributed.
+
+You agree to give notice to the end-users of your Applications that we may
+track the IP addresses associated with their use of the Applications using JUCE
+solely for our internal purposes in providing JUCE, unless you are a paying
+JUCE customer and opt-out of such tracking. You agree to fully comply with all
+laws, including relating to the collection of information from children and the
+[Children’s Online Privacy Protection Act
+(COPPA)](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule).
+
+JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, ARE DISCLAIMED.
+
+The juce_audio_basics, juce_audio_devices, juce_blocks_basics, juce_core and
+juce_events modules are permissively licensed under the terms of the [ISC
+license](http://www.isc.org/downloads/software-support-policy/isc-license).
+
+For more information, visit the website:
+[www.juce.com](https://www.juce.com)
+
+FULL JUCE TERMS:
+- [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
+- [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy)
index 1c0b6796d39b21813bc6b3f76b055ae9de61b83b..84a0fb85d5c66b6b3d9283cc456576bbe1b05431 100644 (file)
@@ -228,8 +228,7 @@ TAB_SIZE               = 4
 # "Side Effects:". You can put \n's in the value part of an alias to insert
 # newlines.
 
-ALIASES                = "tags{1}=" \
-                         "topictag{1}=\1" \
+ALIASES                = "topictag{1}=\1" \
                          "box{1}=<dl class=\"section attention\"><dt>\1</dt><dd>" \
                          "endbox=</dd></dl>" \
                          "c_void=@s_code{void}" \
index e98390aa9085d768bb927b6db7652d5ef6411b3c..be4d5c9f97eac16252e1706908ffac84f8d25924 100644 (file)
@@ -24,7 +24,7 @@ class Chain : public Test
 public:\r
     Chain()\r
     {\r
-        b2Body* ground = {};\r
+        b2Body* ground = NULL;\r
         {\r
             b2BodyDef bd;\r
             ground = m_world->CreateBody(&bd);\r
index f08e5750272a7b8331c87455611c26e89471a8e7..d1db7ab1a151cfe477dd6ff6e9a8815296241826 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AudioAppDemo\r
 \r
index 45bc329d83e5e8bbd24b89c85b91a3937417a970..45733d37d45eb02bbe682daef5dea59950dee326 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AudioLatencyDemo\r
 \r
@@ -153,7 +151,7 @@ public:
                     auto inputSamp = 0.0f;\r
 \r
                     for (auto j = numInputChannels; --j >= 0;)\r
-                        if (inputChannelData[j] != nullptr)\r
+                        if (inputChannelData[j] != 0)\r
                             inputSamp += inputChannelData[j][i];\r
 \r
                     recordingBuffer[recordedSampleNum] = inputSamp;\r
@@ -164,7 +162,7 @@ public:
                 auto outputSamp = (playingSampleNum < testSound.getNumSamples()) ? playBuffer[playingSampleNum] : 0.0f;\r
 \r
                 for (auto j = numOutputChannels; --j >= 0;)\r
-                    if (outputChannelData[j] != nullptr)\r
+                    if (outputChannelData[j] != 0)\r
                         outputChannelData[j][i] = outputSamp;\r
 \r
                 ++playingSampleNum;\r
@@ -174,7 +172,7 @@ public:
         {\r
             // We need to clear the output buffers, in case they're full of junk..\r
             for (int i = 0; i < numOutputChannels; ++i)\r
-                if (outputChannelData[i] != nullptr)\r
+                if (outputChannelData[i] != 0)\r
                     zeromem (outputChannelData[i], sizeof (float) * (size_t) numSamples);\r
         }\r
     }\r
index 159ee16f2f843ecfd74c67d1c0e891abfeff6326..8266a0d1d7c89a5966142108c29e788bad0c623a 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AudioRecordingDemo\r
 \r
@@ -78,13 +76,15 @@ public:
         {\r
             // Create an OutputStream to write to our destination file...\r
             file.deleteFile();\r
+            std::unique_ptr<FileOutputStream> fileStream (file.createOutputStream());\r
 \r
-            if (auto fileStream = std::unique_ptr<FileOutputStream> (file.createOutputStream()))\r
+            if (fileStream.get() != nullptr)\r
             {\r
                 // Now create a WAV writer object that writes to our output stream...\r
                 WavAudioFormat wavFormat;\r
+                auto* writer = wavFormat.createWriterFor (fileStream.get(), sampleRate, 1, 16, {}, 0);\r
 \r
-                if (auto writer = wavFormat.createWriterFor (fileStream.get(), sampleRate, 1, 16, {}, 0))\r
+                if (writer != nullptr)\r
                 {\r
                     fileStream.release(); // (passes responsibility for deleting the stream to the writer object that is now using it)\r
 \r
index 5118b6b60238ce86324d6cfd7f4294927140cae8..d93377bc0febec64cfa97e3e5c348297ac64f740 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AudioSettingsDemo\r
 \r
index ddb90b1bd7c0baf4459167cb6053689901831952..5e1e7cad52405d999661989c5872e067f416fe1e 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AudioSynthesiserDemo\r
 \r
index d6c7fa3c692326eca713b5139b66ac0a5e0a5709..e1e2c5c4ec0757f62215102701c0b5fcf71acf52 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        MPEDemo\r
 \r
index 3d3df92cf0a6458422da2a6bd6491bca171770d7..4f576711eb2c9ca7c12fa6890235a2d75c6bba88 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone, androidstudio\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        MidiDemo\r
 \r
@@ -61,13 +59,19 @@ struct MidiDeviceListEntry : ReferenceCountedObject
     using Ptr = ReferenceCountedObjectPtr<MidiDeviceListEntry>;\r
 };\r
 \r
+//==============================================================================\r
+struct MidiCallbackMessage : public Message\r
+{\r
+    MidiCallbackMessage (const MidiMessage& msg) : message (msg) {}\r
+    MidiMessage message;\r
+};\r
 \r
 //==============================================================================\r
 class MidiDemo  : public Component,\r
                   private Timer,\r
                   private MidiKeyboardStateListener,\r
                   private MidiInputCallback,\r
-                  private AsyncUpdater\r
+                  private MessageListener\r
 {\r
 public:\r
     //==============================================================================\r
@@ -148,6 +152,21 @@ public:
         sendToOutputs (m);\r
     }\r
 \r
+    void handleMessage (const Message& msg) override\r
+    {\r
+        // This is called on the message loop\r
+\r
+        auto& mm = dynamic_cast<const MidiCallbackMessage&> (msg).message;\r
+        String midiString;\r
+        midiString << (mm.isNoteOn() ? String ("Note on: ") : String ("Note off: "));\r
+        midiString << (MidiMessage::getMidiNoteName (mm.getNoteNumber(), true, true, true));\r
+        midiString << (String (" vel = "));\r
+        midiString << static_cast<int> (mm.getVelocity());\r
+        midiString << "\n";\r
+\r
+        midiMonitor.insertTextAtCaret (midiString);\r
+    }\r
+\r
     void paint (Graphics&) override {}\r
 \r
     void resized() override\r
@@ -241,9 +260,11 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    struct MidiDeviceListBox : public ListBox,\r
-                               private ListBoxModel\r
+    class MidiDeviceListBox : public ListBox,\r
+                              private ListBoxModel\r
     {\r
+    public:\r
+        //==============================================================================\r
         MidiDeviceListBox (const String& name,\r
                            MidiDemo& contentComponent,\r
                            bool isInputDeviceList)\r
@@ -263,6 +284,7 @@ private:
                            : parent.getNumMidiOutputs();\r
         }\r
 \r
+        //==============================================================================\r
         void paintListBoxItem (int rowNumber, Graphics& g,\r
                                int width, int height, bool rowIsSelected) override\r
         {\r
@@ -337,30 +359,12 @@ private:
     void handleIncomingMidiMessage (MidiInput* /*source*/, const MidiMessage& message) override\r
     {\r
         // This is called on the MIDI thread\r
-        const ScopedLock sl (midiMonitorLock);\r
-        incomingMessages.add (message);\r
-        triggerAsyncUpdate();\r
-    }\r
-\r
-    void handleAsyncUpdate() override\r
-    {\r
-        // This is called on the message loop\r
-        Array<MidiMessage> messages;\r
-\r
-        {\r
-            const ScopedLock sl (midiMonitorLock);\r
-            messages.swapWith (incomingMessages);\r
-        }\r
-\r
-        String messageText;\r
-\r
-        for (auto& m : messages)\r
-            messageText << m.getDescription() << "\n";\r
 \r
-        midiMonitor.insertTextAtCaret (messageText);\r
+        if (message.isNoteOnOrOff())\r
+            postMessage (new MidiCallbackMessage (message));\r
     }\r
 \r
-    void sendToOutputs (const MidiMessage& msg)\r
+    void sendToOutputs(const MidiMessage& msg)\r
     {\r
         for (auto midiOutput : midiOutputs)\r
             if (midiOutput->outDevice.get() != nullptr)\r
@@ -472,11 +476,11 @@ private:
     TextEditor midiMonitor  { "MIDI Monitor" };\r
     TextButton pairButton   { "MIDI Bluetooth devices..." };\r
 \r
-    std::unique_ptr<MidiDeviceListBox> midiInputSelector, midiOutputSelector;\r
-    ReferenceCountedArray<MidiDeviceListEntry> midiInputs, midiOutputs;\r
+    std::unique_ptr<MidiDeviceListBox> midiInputSelector;\r
+    std::unique_ptr<MidiDeviceListBox> midiOutputSelector;\r
 \r
-    CriticalSection midiMonitorLock;\r
-    Array<MidiMessage> incomingMessages;\r
+    ReferenceCountedArray<MidiDeviceListEntry> midiInputs;\r
+    ReferenceCountedArray<MidiDeviceListEntry> midiOutputs;\r
 \r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiDemo)\r
index d53701a33ea43dca21217cdbbde47157ed43ebd2..cf3b02b967520a986b7f51f90d81d97d03862cfb 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        PluckedStringsDemo\r
 \r
index 4fa8d5d0f48267e6d50ee4009fee28cf3ba68724..2f99a29c1a4019c5760b0b099887dd473b7c3c2f 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        SimpleFFTDemo\r
 \r
index b9d5d119a7bca0bf6822e80cec887edc7c23a7e5..5ea9708c255954a152cc4681a96112ef45a7036c 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        BlocksDrawingDemo\r
 \r
@@ -313,8 +311,6 @@ public:
        #endif\r
 \r
         setSize (600, 600);\r
-\r
-        topologyChanged();\r
     }\r
 \r
     ~BlocksDrawingDemo()\r
@@ -323,7 +319,6 @@ public:
             detachActiveBlock();\r
 \r
         lightpadComponent.removeListener (this);\r
-        topologySource.removeListener (this);\r
     }\r
 \r
     void resized() override\r
index 2f3d02ca21fa4c08ca42cc2b14f6df4463058bf5..7c32040b70743c1d59cc9f12d8eacdb8e6682263 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        BlocksMonitorDemo\r
 \r
@@ -605,13 +603,6 @@ public:
        #endif\r
 \r
         setSize (600, 600);\r
-\r
-        topologyChanged();\r
-    }\r
-\r
-    ~BlocksMonitorDemo()\r
-    {\r
-        topologySource.removeListener (this);\r
     }\r
 \r
     void paint (Graphics&) override {}\r
index 0745c82cfa596412643508aa941dc1f4ad23545d..3476b759d4d9fa625ab90a2c34ef4f1c534ce1d7 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        BlocksSynthDemo\r
 \r
@@ -354,11 +352,7 @@ public:
     }\r
 \r
 private:\r
-   #ifndef JUCE_DEMO_RUNNER\r
     AudioDeviceManager audioDeviceManager;\r
-   #else\r
-    AudioDeviceManager& audioDeviceManager { getSharedAudioDeviceManager (0, 2) };\r
-   #endif\r
     Synthesiser synthesiser;\r
 \r
     //==============================================================================\r
@@ -607,16 +601,12 @@ public:
        #endif\r
 \r
         setSize (600, 400);\r
-\r
-        topologyChanged();\r
     }\r
 \r
     ~BlocksSynthDemo()\r
     {\r
         if (activeBlock != nullptr)\r
             detachActiveBlock();\r
-\r
-        topologySource.removeListener (this);\r
     }\r
 \r
     void paint (Graphics& g) override\r
index 2f99f3e01ff075dfbcc97256218724665fd1d3a5..d9db0aef0bc50c0027c00723f37a9f1b7f4e203a 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        ConvolutionDemo\r
 \r
index 3964271fe955ee9ea6b88e271aaebfad765156d8..bcb9ce55109396ba5eb71676ccdf23564de0cf1f 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        FIRFilterDemo\r
 \r
index cd4566f463f5f83ed4007b6d083f433baf7578e4..72ee5eb3002f340c5d91c36289c85dcd62371085 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        GainDemo\r
 \r
index 2bad711f2f86453677000cdcec8dcd1590049596..fe885fe3f28d4e2bb052f17c78392dba35f233d5 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        IIRFilterDemo\r
 \r
index 1199242b7b38b924e278a733f1b9b0a7722b3fca..28945a3d04e587f4e4ba6ab3e1d44a0d4d3fcffb 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        OscillatorDemo\r
 \r
index ba4f19e6427191b43519fc565f0d3dd8ad8a5338..8b929c5232f0126b31da7e7a61d7ae5c2b2d5270 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        OverdriveDemo\r
 \r
index 4b37b5b061f69366df46113c095395798856610b..da338865fe06a4394f25385a69b8fa8a201ed0fa 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        SIMDRegisterDemo\r
 \r
index 416a67486ec83eb1e1b9e5089ffe37b35710d866..ac4d98f66d9f64a10c62fd6646dc6915b58e25c4 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        StateVariableFilterDemo\r
 \r
index 46a62a21bc43f6ccf010ac214f4a021a899102ae..2da75a7af59155caf152c3ded0d6865e966706c2 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        WaveShaperTanhDemo\r
 \r
index 9a22d9439fa5ca4e47c2c63f162f5986faa352e9..e6ad817f028e87a2495410dcf9e1cb02687c6ca6 100644 (file)
@@ -8,7 +8,7 @@ SET(BINARY_NAME "juce_jni")
 add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")\r
 set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression")\r
 \r
-add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_demorunner_DemoRunner" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/demorunner/DemoRunner\"" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSNAME=com_juce_demorunner_SharingContentProvider" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH=\"com/juce/demorunner/SharingContentProvider\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=5.4.1" "-DJUCE_APP_VERSION_HEX=0x50401")\r
+add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_demorunner_DemoRunner" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/demorunner/DemoRunner\"" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSNAME=com_juce_demorunner_SharingContentProvider" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH=\"com/juce/demorunner/SharingContentProvider\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=5.3.2" "-DJUCE_APP_VERSION_HEX=0x50302")\r
 \r
 include_directories( AFTER\r
     "../../../JuceLibraryCode"\r
@@ -56,8 +56,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
@@ -321,91 +319,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
@@ -417,6 +330,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+    "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
@@ -430,8 +344,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
@@ -450,7 +362,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
-    "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
@@ -620,8 +531,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
     "../../../../../modules/juce_core/containers/juce_Array.h"\r
     "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
     "../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
@@ -631,11 +540,9 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
-    "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
-    "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
     "../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
@@ -682,7 +589,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
     "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
     "../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
-    "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_Memory.h"\r
     "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
@@ -693,8 +599,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
     "../../../../../modules/juce_core/memory/juce_Singleton.h"\r
     "../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
     "../../../../../modules/juce_core/misc/juce_Result.cpp"\r
     "../../../../../modules/juce_core/misc/juce_Result.h"\r
     "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
@@ -725,7 +629,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
     "../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
     "../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
-    "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
     "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
     "../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
     "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
@@ -959,8 +862,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
     "../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
@@ -1190,12 +1091,10 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
@@ -1456,7 +1355,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
-    "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
     "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
@@ -1569,7 +1467,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"\r
     "../../../../../modules/juce_video/capture/juce_CameraDevice.h"\r
     "../../../../../modules/juce_video/native/juce_android_CameraDevice.h"\r
-    "../../../../../modules/juce_video/native/juce_android_Video.h"\r
     "../../../../../modules/juce_video/native/juce_ios_CameraDevice.h"\r
     "../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"\r
     "../../../../../modules/juce_video/native/juce_mac_Video.h"\r
@@ -1624,8 +1521,6 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/ju
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1889,91 +1784,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1985,6 +1795,7 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1998,8 +1809,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/proces
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2018,7 +1827,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/utilit
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2188,8 +1996,6 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Ab
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2199,11 +2005,9 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Li
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2250,7 +2054,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2261,8 +2064,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Scoped
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2293,7 +2094,6 @@ set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_St
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2527,8 +2327,6 @@ set_source_files_properties("../../../../../modules/juce_events/interprocess/juc
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2758,12 +2556,10 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/components/j
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -3024,7 +2820,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juc
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -3137,7 +2932,6 @@ set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_
 set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
index c384afbb241f21e4274b53d936ba29df2f54d244..b2250b3f20515df5037b290341acab83d3c03569 100644 (file)
@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
 \r
 android {\r
     compileSdkVersion 23\r
-    buildToolsVersion "28.0.0"\r
+    buildToolsVersion "27.0.3"\r
     externalNativeBuild {\r
         cmake {\r
             path "CMakeLists.txt"\r
@@ -25,8 +25,8 @@ android {
         externalNativeBuild {\r
             cmake {\r
                 arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE"\r
-                cFlags "-fsigned-char", "-Wall", "-Wno-missing-field-initializers", "-Wshadow-all", "-Wstrict-aliasing", "-Wuninitialized", "-Wunused-parameter", "-Wsign-compare", "-Wint-conversion", "-Wconditional-uninitialized", "-Woverloaded-virtual", "-Wreorder", "-Wconstant-conversion", "-Wunused-private-field", "-Wbool-conversion", "-Wextra-semi", "-Wno-ignored-qualifiers", "-Wunreachable-code"\r
-                cppFlags "-fsigned-char", "-std=c++14", "-Wall", "-Wno-missing-field-initializers", "-Wshadow-all", "-Wstrict-aliasing", "-Wuninitialized", "-Wunused-parameter", "-Wsign-compare", "-Wint-conversion", "-Wconditional-uninitialized", "-Woverloaded-virtual", "-Wreorder", "-Wconstant-conversion", "-Wunused-private-field", "-Wbool-conversion", "-Wextra-semi", "-Wno-ignored-qualifiers", "-Wunreachable-code"\r
+                cFlags "-fsigned-char"\r
+                cppFlags "-fsigned-char", "-std=c++14"\r
             }\r
         }\r
     }\r
@@ -50,7 +50,7 @@ android {
     productFlavors {\r
         debug_ {\r
             ndk {\r
-                abiFilters "armeabi-v7a", "x86"\r
+                abiFilters "armeabi", "x86"\r
             }\r
             externalNativeBuild {\r
                 cmake {\r
index f302ae11ae62ab3545ab7bd93f1c1dadeca04bfb..6d7c487af092cd90c8b34a126b5d60df474129a5 100644 (file)
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="5.4.1"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="5.3.2"
           package="com.juce.demorunner">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+  <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
index e98390aa9085d768bb927b6db7652d5ef6411b3c..be4d5c9f97eac16252e1706908ffac84f8d25924 100644 (file)
@@ -24,7 +24,7 @@ class Chain : public Test
 public:\r
     Chain()\r
     {\r
-        b2Body* ground = {};\r
+        b2Body* ground = NULL;\r
         {\r
             b2BodyDef bd;\r
             ground = m_world->CreateBody(&bd);\r
index b5a9a0621f6932d53185666737bfcb7103e781b4..6320a603dbde8547439a87eedeb426e6b460db42 100644 (file)
@@ -31,9 +31,6 @@ import android.content.res.Configuration;
 import android.content.pm.PackageInfo;\r
 import android.content.pm.PackageManager;\r
 import android.hardware.camera2.*;\r
-import android.database.ContentObserver;\r
-import android.media.session.*;\r
-import android.media.MediaMetadata;\r
 import android.net.http.SslError;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
@@ -97,11 +94,8 @@ public class DemoRunner   extends Activity
     //==============================================================================\r
     public boolean isPermissionDeclaredInManifest (int permissionID)\r
     {\r
-        return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
-    }\r
+        String permissionToCheck = getAndroidPermissionName(permissionID);\r
 \r
-    public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
-    {\r
         try\r
         {\r
             PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
@@ -1494,9 +1488,7 @@ public class DemoRunner   extends Activity
     public final String getClipboardContent()\r
     {\r
         ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
-        CharSequence content = clipboard.getText();\r
-        return content != null ? content.toString() : new String();\r
+        return clipboard.getText().toString();\r
     }\r
 \r
     public final void setClipboardContent (String newText)\r
@@ -2005,13 +1997,11 @@ public class DemoRunner   extends Activity
                                           implements SurfaceHolder.Callback\r
     {\r
         private long nativeContext = 0;\r
-        private boolean forVideo;\r
 \r
-        NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+        NativeSurfaceView (Context context, long nativeContextPtr)\r
         {\r
             super (context);\r
             nativeContext = nativeContextPtr;\r
-            forVideo = createdForVideo;\r
         }\r
 \r
         public Surface getNativeSurface()\r
@@ -2029,51 +2019,38 @@ public class DemoRunner   extends Activity
         @Override\r
         public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
         {\r
-            if (forVideo)\r
-                surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
-            else\r
-                surfaceChangedNative (nativeContext, holder, format, width, height);\r
+            surfaceChangedNative (nativeContext, holder, format, width, height);\r
         }\r
 \r
         @Override\r
         public void surfaceCreated (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceCreatedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceCreatedNative (nativeContext, holder);\r
+            surfaceCreatedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         public void surfaceDestroyed (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceDestroyedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceDestroyedNative (nativeContext, holder);\r
+            surfaceDestroyedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         protected void dispatchDraw (Canvas canvas)\r
         {\r
             super.dispatchDraw (canvas);\r
-\r
-            if (forVideo)\r
-                dispatchDrawNativeVideo (nativeContext, canvas);\r
-            else\r
-                dispatchDrawNative (nativeContext, canvas);\r
+            dispatchDrawNative (nativeContext, canvas);\r
         }\r
 \r
         //==============================================================================\r
         @Override\r
-        protected void onAttachedToWindow()\r
+        protected void onAttachedToWindow ()\r
         {\r
             super.onAttachedToWindow();\r
             getHolder().addCallback (this);\r
         }\r
 \r
         @Override\r
-        protected void onDetachedFromWindow()\r
+        protected void onDetachedFromWindow ()\r
         {\r
             super.onDetachedFromWindow();\r
             getHolder().removeCallback (this);\r
@@ -2085,17 +2062,11 @@ public class DemoRunner   extends Activity
         private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
         private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
                                                   int format, int width, int height);\r
-\r
-        private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
-        private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
-                                                       int format, int width, int height);\r
     }\r
 \r
-    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
     {\r
-        return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+        return new NativeSurfaceView (this, nativeSurfacePtr);\r
     }\r
 \r
     //==============================================================================\r
@@ -2855,151 +2826,6 @@ public class DemoRunner   extends Activity
     }\r
 \r
 \r
-    //==============================================================================\r
-    public class MediaControllerCallback  extends MediaController.Callback\r
-    {\r
-        private native void mediaControllerAudioInfoChanged     (long host, MediaController.PlaybackInfo info);\r
-        private native void mediaControllerMetadataChanged      (long host, MediaMetadata metadata);\r
-        private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
-        private native void mediaControllerSessionDestroyed     (long host);\r
-\r
-        MediaControllerCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
-        {\r
-            mediaControllerAudioInfoChanged (host, info);\r
-        }\r
-\r
-        @Override\r
-        public void onMetadataChanged (MediaMetadata metadata)\r
-        {\r
-            mediaControllerMetadataChanged (host, metadata);\r
-        }\r
-\r
-        @Override\r
-        public void onPlaybackStateChanged (PlaybackState state)\r
-        {\r
-             mediaControllerPlaybackStateChanged (host, state);\r
-        }\r
-\r
-        @Override\r
-        public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
-        @Override\r
-        public void onSessionDestroyed()\r
-        {\r
-            mediaControllerSessionDestroyed (host);\r
-        }\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class MediaSessionCallback  extends MediaSession.Callback\r
-    {\r
-        private native void mediaSessionPause           (long host);\r
-        private native void mediaSessionPlay            (long host);\r
-        private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
-        private native void mediaSessionSeekTo          (long host, long pos);\r
-        private native void mediaSessionStop            (long host);\r
-\r
-\r
-        MediaSessionCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onPause()\r
-        {\r
-            mediaSessionPause (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlay()\r
-        {\r
-            mediaSessionPlay (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlayFromMediaId (String mediaId, Bundle extras)\r
-        {\r
-            mediaSessionPlayFromMediaId (host, mediaId, extras);\r
-        }\r
-\r
-        @Override\r
-        public void onSeekTo (long pos)\r
-        {\r
-            mediaSessionSeekTo (host, pos);\r
-        }\r
-\r
-        @Override\r
-        public void onStop()\r
-        {\r
-            mediaSessionStop (host);\r
-        }\r
-\r
-        @Override\r
-        public void onFastForward() {}\r
-\r
-        @Override\r
-        public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
-        {\r
-            return true;\r
-        }\r
-\r
-        @Override\r
-        public void onRewind() {}\r
-\r
-        @Override\r
-        public void onSkipToNext() {}\r
-\r
-        @Override\r
-        public void onSkipToPrevious() {}\r
-\r
-        @Override\r
-        public void onSkipToQueueItem (long id) {}\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class SystemVolumeObserver extends ContentObserver\r
-    {\r
-        private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
-        SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
-        {\r
-            super (null);\r
-\r
-            activity = activityToUse;\r
-            host = hostToUse;\r
-        }\r
-\r
-        void setEnabled (boolean shouldBeEnabled)\r
-        {\r
-            if (shouldBeEnabled)\r
-                activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
-            else\r
-                activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
-        }\r
-\r
-        @Override\r
-        public void onChange (boolean selfChange, Uri uri)\r
-        {\r
-            if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
-                mediaSessionSystemVolumeChanged (host);\r
-        }\r
-\r
-        private Activity activity;\r
-        private long host;\r
-    }\r
-\r
-\r
     //==============================================================================\r
     public static final String getLocaleValue (boolean isRegion)\r
     {\r
index 647f509e9ca3df4e45bee9a59ceebfc5067d81fe..651d63db63bdd2bf53a574bdde786ac927b14169 100644 (file)
@@ -4,7 +4,7 @@ buildscript {
        jcenter()\r
    }\r
    dependencies {\r
-       classpath 'com.android.tools.build:gradle:3.1.3'\r
+       classpath 'com.android.tools.build:gradle:3.1.1'\r
    }\r
 }\r
 \r
index 4922eb67f2b3bd734b38193db0b685c101757d1a..56a39c08b1942a6f702231e45293c8c439a273d5 100644 (file)
@@ -35,13 +35,13 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := DemoRunner\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -56,13 +56,13 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := DemoRunner\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -95,13 +95,11 @@ OBJECTS_APP := \
   $(JUCE_OBJDIR)/include_juce_product_unlocking_8278fcdc.o \\r
   $(JUCE_OBJDIR)/include_juce_video_be78589.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
        @echo Linking "DemoRunner - App"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -238,6 +236,10 @@ $(JUCE_OBJDIR)/include_juce_video_be78589.o: ../../JuceLibraryCode/include_juce_
        @echo "Compiling include_juce_video.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
 clean:\r
        @echo Cleaning DemoRunner\r
        $(V_AT)$(CLEANCMD)\r
index ab98fe597fb36180ee064e926611621d73eb464a..9d9fc433a75ad3fdadcccbc87d415983495929e1 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               63A2F309E55DAC206E9B97E3 = {
-                       isa = PBXBuildFile;
-                       fileRef = CFF2BBEB242CC8B3B904B5F9;
-               };
-               48CF0B02E1D06E5DA51E6270 = {
-                       isa = PBXBuildFile;
-                       fileRef = A04E4408525F24F7DCBA000E;
-               };
-               163B0CF2DD0990A63DF1D5A6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 470C3E4553B513FFEF752779;
-               };
-               7B4163348896EB1B86B15160 = {
-                       isa = PBXBuildFile;
-                       fileRef = DC192EFA899E6CBE6B5CD394;
-               };
-               8C0AEA08A71075A6C765AEC9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3B99CF94C44E2EE04635A439;
-               };
-               89BC6E2354102D975E08E918 = {
-                       isa = PBXBuildFile;
-                       fileRef = 440D507FD8F31DB62B1F95C7;
-               };
-               9F15FD7A7CE83CFD98F07D59 = {
-                       isa = PBXBuildFile;
-                       fileRef = 02A2ED58B066B4D119F67913;
-               };
-               1351A13E78F38741C6075600 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4F0A137A4115946A346180E6;
-               };
-               46071CE2B98B562B7BF27CB1 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1CFE3935A3B810D5D68A2504;
-               };
-               6A61CBB4E39BFD392D97528F = {
-                       isa = PBXBuildFile;
-                       fileRef = 61AE09C749B007B70A265D9B;
-               };
-               9BEA1428416CE06BF72FBAB8 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3DC90DA86565B0356B6E5E0B;
-               };
-               8584640341100008744861A5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 71A91516AFD980FEE694C0E1;
-               };
-               028383D0577D0236899D8CA5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 40BD06D4AB0D2C73E936A2F1;
-               };
-               B1981F62F6A91FD2F579A198 = {
-                       isa = PBXBuildFile;
-                       fileRef = 23CD1A3F9067C3A0ECE7BB67;
-               };
-               89AD16514B1F4133FFEA1DF9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 96D99A08027CA35D6A4E5CFD;
-               };
-               D3D8CDCE42E8BE31C7247E38 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0ECB4FCD24794CE516792552;
-               };
-               3B3952A9A14320312EF890A5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 388A8209DBB1B08594266121;
-               };
-               41BAB55E0D992708EF06E2C4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5CD17151385A69F1E07FE85B;
-               };
-               1BA301E39E29966719B710A1 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9EBAEBBD9093CB005D1692F2;
-               };
-               E33E8FE2E7F8EC8EB4279F1B = {
-                       isa = PBXBuildFile;
-                       fileRef = 7B3243C92248D379A0489AA4;
-               };
-               91CD2BCE4CA07E18229EB436 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9672FCE6167ADB567A9EB2F8;
-               };
-               75DB074DBAE04408A0A917B7 = {
-                       isa = PBXBuildFile;
-                       fileRef = E0A3F113BC27B7B4D6F1D693;
-               };
-               E6F58FC3ACAE774DB4D06420 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3AB62BFF806112585B54DDA3;
-               };
-               36E115D98311F12AA06710E6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 061AECBF1CC7056F4155812D;
-               };
-               B38728296BB32B7994CE28DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 934ACDCB3FD9D223A3481D8F;
-               };
-               71DF4F5EB4C8305688416725 = {
-                       isa = PBXBuildFile;
-                       fileRef = E5BFC17E682AB426D203B3E6;
-               };
-               4FBBB55F4E347757F74F1F41 = {
-                       isa = PBXBuildFile;
-                       fileRef = 25E5ED33876A2C752378C859;
-               };
-               F619F3887CEC064441BB6EE6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 260481E972425474BB8155B0;
-               };
-               C2BB2B6DA237FE0CB64C7EDA = {
-                       isa = PBXBuildFile;
-                       fileRef = 5965349393850F41DF76F350;
-               };
-               F28112945CEBEA4CE8975833 = {
-                       isa = PBXBuildFile;
-                       fileRef = 03B0F9318FD583525AB195A9;
-               };
-               9EACEA6BE8D0ACC72C12C080 = {
-                       isa = PBXBuildFile;
-                       fileRef = 03A63C3CA6F24977F19C316D;
-               };
-               26652AB1BB77C8A39434775F = {
-                       isa = PBXBuildFile;
-                       fileRef = E061A1C75FA5722167FC4997;
-               };
-               2707968B431D83AC7E28E49B = {
-                       isa = PBXBuildFile;
-                       fileRef = E67AB94002886AF67437D6AE;
-               };
-               712D81867EC698463252FA79 = {
-                       isa = PBXBuildFile;
-                       fileRef = EDDA01B246C6128CAF7A2914;
-               };
-               49E7BBD46981F0035E4E9021 = {
-                       isa = PBXBuildFile;
-                       fileRef = 831A01C745C905F5715CD822;
-               };
-               611298FAC1A543BDD10D4C41 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4DF215D350FFE5E119CBA7E5;
-               };
-               D183F8140174ACCDDCD230A2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3BC9753E0CD75A36DC742EE0;
-               };
-               FF87532E62753EDFA3D29CAD = {
-                       isa = PBXBuildFile;
-                       fileRef = 6C5E26B4D28F8450435B8AE1;
-               };
-               2F76CA28C8C0EFC7453D0EB8 = {
-                       isa = PBXBuildFile;
-                       fileRef = F5F2EA2238973488632FC322;
-               };
-               6B5560283DEEBD6DD2D6C984 = {
-                       isa = PBXBuildFile;
-                       fileRef = C1E93FAF6C68A40A664422CD;
-               };
-               1DBDFEDE359CFC84F8E3DE4C = {
-                       isa = PBXBuildFile;
-                       fileRef = FCD0D758C5767944BEC29730;
-               };
-               CDABEA6258EC70C65C9ACCFE = {
-                       isa = PBXBuildFile;
-                       fileRef = 3E4ED41C374261CFFD309743;
-               };
-               E2F44A968EC2598DAE33A997 = {
-                       isa = PBXBuildFile;
-                       fileRef = A1D6D36B96B6B37C31F32829;
-               };
-               5CB78489F16E82144914972D = {
-                       isa = PBXBuildFile;
-                       fileRef = 979F23EA9E5E76131299E886;
-               };
-               BC6036F22423CA0AFF0385A7 = {
-                       isa = PBXBuildFile;
-                       fileRef = 94B6C88FE30861A47CD28709;
-               };
-               AEA090DAC5C747C50C7D3FA7 = {
-                       isa = PBXBuildFile;
-                       fileRef = CE38E6469D98462A2C22C915;
-               };
-               CDEB6BA5341494AF51D07C72 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0AB68DBAB6B7DAEDDDD5B683;
-               };
-               0140787C0118A95E37DE90B4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9144821E003E15E4042B57DB;
-               };
-               02A2ED58B066B4D119F67913 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               03A63C3CA6F24977F19C316D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               03B0F9318FD583525AB195A9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               061AECBF1CC7056F4155812D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = DemoPIPs2.cpp;
-                       path = ../../Source/Demos/DemoPIPs2.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0AB68DBAB6B7DAEDDDD5B683 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_product_unlocking.mm";
-                       path = "../../JuceLibraryCode/include_juce_product_unlocking.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0B36C013D9790568B481634C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0ECB4FCD24794CE516792552 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder;
-                       name = Audio;
-                       path = ../../../Audio;
-                       sourceTree = "<group>";
-               };
-               112FFCB73597157E721BCDF2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_analytics";
-                       path = "../../../../modules/juce_analytics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               14CBD28B4887DAF89E27491C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1CFE3935A3B810D5D68A2504 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMedia.framework;
-                       path = System/Library/Frameworks/CoreMedia.framework;
-                       sourceTree = SDKROOT;
-               };
-               1FCD2145DE3FCFCF4F55A8AD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = DemoContentComponent.h;
-                       path = ../../Source/UI/DemoContentComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               23CD1A3F9067C3A0ECE7BB67 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               25E5ED33876A2C752378C859 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = MainComponent.cpp;
-                       path = ../../Source/UI/MainComponent.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               260481E972425474BB8155B0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               346450C70C964FD9640B6086 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               388A8209DBB1B08594266121 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder;
-                       name = BLOCKS;
-                       path = ../../../BLOCKS;
-                       sourceTree = "<group>";
-               };
-               3AB62BFF806112585B54DDA3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = DemoPIPs1.cpp;
-                       path = ../../Source/Demos/DemoPIPs1.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3B99CF94C44E2EE04635A439 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVKit.framework;
-                       path = System/Library/Frameworks/AVKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               3BC9753E0CD75A36DC742EE0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3DC90DA86565B0356B6E5E0B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = DiscRecording.framework;
-                       path = System/Library/Frameworks/DiscRecording.framework;
-                       sourceTree = SDKROOT;
-               };
-               3E4ED41C374261CFFD309743 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               40BD06D4AB0D2C73E936A2F1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGL.framework;
-                       path = System/Library/Frameworks/OpenGL.framework;
-                       sourceTree = SDKROOT;
-               };
-               440D507FD8F31DB62B1F95C7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Carbon.framework;
-                       path = System/Library/Frameworks/Carbon.framework;
-                       sourceTree = SDKROOT;
-               };
-               470C3E4553B513FFEF752779 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               491641F7632BCC81BBA0ED85 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4DF215D350FFE5E119CBA7E5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_box2d.cpp";
-                       path = "../../JuceLibraryCode/include_juce_box2d.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4E9AD0EAF3CA57B548622D9A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4EC2782DE1779A130835B64D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4F0A137A4115946A346180E6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               4FE6029FF76BCE9698595DC5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_product_unlocking";
-                       path = "../../../../modules/juce_product_unlocking";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5965349393850F41DF76F350 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_analytics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_analytics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5A9F2000C66D24E8B01BE60B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5CD17151385A69F1E07FE85B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder;
-                       name = DSP;
-                       path = ../../../DSP;
-                       sourceTree = "<group>";
-               };
-               60F2869DC345EAF2314D6C09 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               61AE09C749B007B70A265D9B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               651ECE3C7BA845DDCFEE48F3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_osc";
-                       path = "../../../../modules/juce_osc";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6847A9B2C5E3C2ED56D8D4E7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6C198AF93E1F6E682189E2F6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6C2C1AC86623F457427965EF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_box2d";
-                       path = "../../../../modules/juce_box2d";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6C5E26B4D28F8450435B8AE1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               71A91516AFD980FEE694C0E1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               72129757D2A553B90A7157C6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7A5AAE9EE573FC6105CC4AAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = SettingsContent.h;
-                       path = ../../Source/UI/SettingsContent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7B3243C92248D379A0489AA4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder;
-                       name = Utilities;
-                       path = ../../../Utilities;
-                       sourceTree = "<group>";
-               };
-               831A01C745C905F5715CD822 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_blocks_basics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8CE533D611CD0984AD028D73 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               903CD4126C779884797EF915 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9144821E003E15E4042B57DB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_video.mm";
-                       path = "../../JuceLibraryCode/include_juce_video.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               934ACDCB3FD9D223A3481D8F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = JUCEDemos.cpp;
-                       path = ../../Source/Demos/JUCEDemos.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               94B6C88FE30861A47CD28709 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9672FCE6167ADB567A9EB2F8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               96D99A08027CA35D6A4E5CFD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = WebKit.framework;
-                       path = System/Library/Frameworks/WebKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               979F23EA9E5E76131299E886 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EBAEBBD9093CB005D1692F2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder;
-                       name = GUI;
-                       path = ../../../GUI;
-                       sourceTree = "<group>";
-               };
-               A04E4408525F24F7DCBA000E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               A1D6D36B96B6B37C31F32829 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A5256778E2EBD206B337B555 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_video";
-                       path = "../../../../modules/juce_video";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A6F555BE0DDF01C285BD8BF5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_dsp";
-                       path = "../../../../modules/juce_dsp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A9315F8368A5771EC39631CB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B2BC383CE102EECCF49C7AF7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = IntroScreen.h;
-                       path = ../../Source/Demos/IntroScreen.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C1E93FAF6C68A40A664422CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_dsp.mm";
-                       path = "../../JuceLibraryCode/include_juce_dsp.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CE38E6469D98462A2C22C915 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_osc.cpp";
-                       path = "../../JuceLibraryCode/include_juce_osc.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CFF2BBEB242CC8B3B904B5F9 = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = DemoRunner.app;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               D018D636A4DC9BEA11720129 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_blocks_basics";
-                       path = "../../../../modules/juce_blocks_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DC192EFA899E6CBE6B5CD394 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               E061A1C75FA5722167FC4997 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E0A3F113BC27B7B4D6F1D693 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E5BFC17E682AB426D203B3E6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = DemoContentComponent.cpp;
-                       path = ../../Source/UI/DemoContentComponent.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E67AB94002886AF67437D6AE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EB68BD1224CD9748BFA332C0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MainComponent.h;
-                       path = ../../Source/UI/MainComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               ECE79F1433E92BB6213C86F5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = JUCEAppIcon.png;
-                       path = ../../Source/JUCEAppIcon.png;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EDDA01B246C6128CAF7A2914 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EE6BDC78B539D27E65E92265 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JUCEDemos.h;
-                       path = ../../Source/Demos/JUCEDemos.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F5F2EA2238973488632FC322 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FB1FC613CE260140F1CFD21B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FCD0D758C5767944BEC29730 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FDC3CA8D1403C169659F7D8C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CD575607FAA297480EE95F13 = {
-                       isa = PBXGroup;
-                       children = (
-                               3AB62BFF806112585B54DDA3,
-                               061AECBF1CC7056F4155812D,
-                               B2BC383CE102EECCF49C7AF7,
-                               934ACDCB3FD9D223A3481D8F,
-                               EE6BDC78B539D27E65E92265,
-                       );
-                       name = Demos;
-                       sourceTree = "<group>";
-               };
-               BB12537403CC24C02622582C = {
-                       isa = PBXGroup;
-                       children = (
-                               E5BFC17E682AB426D203B3E6,
-                               1FCD2145DE3FCFCF4F55A8AD,
-                               25E5ED33876A2C752378C859,
-                               EB68BD1224CD9748BFA332C0,
-                               7A5AAE9EE573FC6105CC4AAC,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               6F933968486D9AD9FE112622 = {
-                       isa = PBXGroup;
-                       children = (
-                               CD575607FAA297480EE95F13,
-                               BB12537403CC24C02622582C,
-                               260481E972425474BB8155B0,
-                               ECE79F1433E92BB6213C86F5,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               9683F931FA1B8B85FA8C4BD8 = {
-                       isa = PBXGroup;
-                       children = (
-                               6F933968486D9AD9FE112622,
-                       );
-                       name = DemoRunner;
-                       sourceTree = "<group>";
-               };
-               5A0B2CEF393A25C6D4B1B76C = {
-                       isa = PBXGroup;
-                       children = (
-                               112FFCB73597157E721BCDF2,
-                               6847A9B2C5E3C2ED56D8D4E7,
-                               60F2869DC345EAF2314D6C09,
-                               491641F7632BCC81BBA0ED85,
-                               346450C70C964FD9640B6086,
-                               0B36C013D9790568B481634C,
-                               D018D636A4DC9BEA11720129,
-                               6C2C1AC86623F457427965EF,
-                               903CD4126C779884797EF915,
-                               14CBD28B4887DAF89E27491C,
-                               FDC3CA8D1403C169659F7D8C,
-                               A6F555BE0DDF01C285BD8BF5,
-                               FB1FC613CE260140F1CFD21B,
-                               8CE533D611CD0984AD028D73,
-                               5A9F2000C66D24E8B01BE60B,
-                               A9315F8368A5771EC39631CB,
-                               6C198AF93E1F6E682189E2F6,
-                               651ECE3C7BA845DDCFEE48F3,
-                               4FE6029FF76BCE9698595DC5,
-                               A5256778E2EBD206B337B555,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               61F3057D838D7DABB0FA3D34 = {
-                       isa = PBXGroup;
-                       children = (
-                               72129757D2A553B90A7157C6,
-                               5965349393850F41DF76F350,
-                               03B0F9318FD583525AB195A9,
-                               03A63C3CA6F24977F19C316D,
-                               E061A1C75FA5722167FC4997,
-                               E67AB94002886AF67437D6AE,
-                               EDDA01B246C6128CAF7A2914,
-                               831A01C745C905F5715CD822,
-                               4DF215D350FFE5E119CBA7E5,
-                               3BC9753E0CD75A36DC742EE0,
-                               6C5E26B4D28F8450435B8AE1,
-                               F5F2EA2238973488632FC322,
-                               C1E93FAF6C68A40A664422CD,
-                               FCD0D758C5767944BEC29730,
-                               3E4ED41C374261CFFD309743,
-                               A1D6D36B96B6B37C31F32829,
-                               979F23EA9E5E76131299E886,
-                               94B6C88FE30861A47CD28709,
-                               CE38E6469D98462A2C22C915,
-                               0AB68DBAB6B7DAEDDDD5B683,
-                               9144821E003E15E4042B57DB,
-                               4E9AD0EAF3CA57B548622D9A,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               D87DCD5DA4EC8D78DFF37FCC = {
-                       isa = PBXGroup;
-                       children = (
-                               0ECB4FCD24794CE516792552,
-                               388A8209DBB1B08594266121,
-                               5CD17151385A69F1E07FE85B,
-                               9EBAEBBD9093CB005D1692F2,
-                               7B3243C92248D379A0489AA4,
-                               4EC2782DE1779A130835B64D,
-                               9672FCE6167ADB567A9EB2F8,
-                               E0A3F113BC27B7B4D6F1D693,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               4452EAA652B65A9AE648288C = {
-                       isa = PBXGroup;
-                       children = (
-                               A04E4408525F24F7DCBA000E,
-                               470C3E4553B513FFEF752779,
-                               DC192EFA899E6CBE6B5CD394,
-                               3B99CF94C44E2EE04635A439,
-                               440D507FD8F31DB62B1F95C7,
-                               02A2ED58B066B4D119F67913,
-                               4F0A137A4115946A346180E6,
-                               1CFE3935A3B810D5D68A2504,
-                               61AE09C749B007B70A265D9B,
-                               3DC90DA86565B0356B6E5E0B,
-                               71A91516AFD980FEE694C0E1,
-                               40BD06D4AB0D2C73E936A2F1,
-                               23CD1A3F9067C3A0ECE7BB67,
-                               96D99A08027CA35D6A4E5CFD,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               BFDAF16175D03695EEB466BC = {
-                       isa = PBXGroup;
-                       children = (
-                               CFF2BBEB242CC8B3B904B5F9,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               91A9A0FE9DF4F4E10009EEC7 = {
-                       isa = PBXGroup;
-                       children = (
-                               9683F931FA1B8B85FA8C4BD8,
-                               5A0B2CEF393A25C6D4B1B76C,
-                               61F3057D838D7DABB0FA3D34,
-                               D87DCD5DA4EC8D78DFF37FCC,
-                               4452EAA652B65A9AE648288C,
-                               BFDAF16175D03695EEB466BC,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               B18D059E5616FA729F764229 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               63A2F309E55DAC206E9B97E3 = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; };
+               48CF0B02E1D06E5DA51E6270 = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; };
+               163B0CF2DD0990A63DF1D5A6 = {isa = PBXBuildFile; fileRef = 470C3E4553B513FFEF752779; };
+               7B4163348896EB1B86B15160 = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; };
+               8C0AEA08A71075A6C765AEC9 = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; };
+               89BC6E2354102D975E08E918 = {isa = PBXBuildFile; fileRef = 440D507FD8F31DB62B1F95C7; };
+               9F15FD7A7CE83CFD98F07D59 = {isa = PBXBuildFile; fileRef = 02A2ED58B066B4D119F67913; };
+               1351A13E78F38741C6075600 = {isa = PBXBuildFile; fileRef = 4F0A137A4115946A346180E6; };
+               46071CE2B98B562B7BF27CB1 = {isa = PBXBuildFile; fileRef = 1CFE3935A3B810D5D68A2504; };
+               6A61CBB4E39BFD392D97528F = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; };
+               9BEA1428416CE06BF72FBAB8 = {isa = PBXBuildFile; fileRef = 3DC90DA86565B0356B6E5E0B; };
+               8584640341100008744861A5 = {isa = PBXBuildFile; fileRef = 71A91516AFD980FEE694C0E1; };
+               028383D0577D0236899D8CA5 = {isa = PBXBuildFile; fileRef = 40BD06D4AB0D2C73E936A2F1; };
+               B1981F62F6A91FD2F579A198 = {isa = PBXBuildFile; fileRef = 23CD1A3F9067C3A0ECE7BB67; };
+               89AD16514B1F4133FFEA1DF9 = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; };
+               D3D8CDCE42E8BE31C7247E38 = {isa = PBXBuildFile; fileRef = 0ECB4FCD24794CE516792552; };
+               3B3952A9A14320312EF890A5 = {isa = PBXBuildFile; fileRef = 388A8209DBB1B08594266121; };
+               41BAB55E0D992708EF06E2C4 = {isa = PBXBuildFile; fileRef = 5CD17151385A69F1E07FE85B; };
+               1BA301E39E29966719B710A1 = {isa = PBXBuildFile; fileRef = 9EBAEBBD9093CB005D1692F2; };
+               E33E8FE2E7F8EC8EB4279F1B = {isa = PBXBuildFile; fileRef = 7B3243C92248D379A0489AA4; };
+               91CD2BCE4CA07E18229EB436 = {isa = PBXBuildFile; fileRef = 9672FCE6167ADB567A9EB2F8; };
+               75DB074DBAE04408A0A917B7 = {isa = PBXBuildFile; fileRef = E0A3F113BC27B7B4D6F1D693; };
+               E6F58FC3ACAE774DB4D06420 = {isa = PBXBuildFile; fileRef = 3AB62BFF806112585B54DDA3; };
+               36E115D98311F12AA06710E6 = {isa = PBXBuildFile; fileRef = 061AECBF1CC7056F4155812D; };
+               B38728296BB32B7994CE28DF = {isa = PBXBuildFile; fileRef = 934ACDCB3FD9D223A3481D8F; };
+               71DF4F5EB4C8305688416725 = {isa = PBXBuildFile; fileRef = E5BFC17E682AB426D203B3E6; };
+               4FBBB55F4E347757F74F1F41 = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
+               F619F3887CEC064441BB6EE6 = {isa = PBXBuildFile; fileRef = 260481E972425474BB8155B0; };
+               C2BB2B6DA237FE0CB64C7EDA = {isa = PBXBuildFile; fileRef = 5965349393850F41DF76F350; };
+               F28112945CEBEA4CE8975833 = {isa = PBXBuildFile; fileRef = 03B0F9318FD583525AB195A9; };
+               9EACEA6BE8D0ACC72C12C080 = {isa = PBXBuildFile; fileRef = 03A63C3CA6F24977F19C316D; };
+               26652AB1BB77C8A39434775F = {isa = PBXBuildFile; fileRef = E061A1C75FA5722167FC4997; };
+               2707968B431D83AC7E28E49B = {isa = PBXBuildFile; fileRef = E67AB94002886AF67437D6AE; };
+               712D81867EC698463252FA79 = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; };
+               49E7BBD46981F0035E4E9021 = {isa = PBXBuildFile; fileRef = 831A01C745C905F5715CD822; };
+               611298FAC1A543BDD10D4C41 = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; };
+               D183F8140174ACCDDCD230A2 = {isa = PBXBuildFile; fileRef = 3BC9753E0CD75A36DC742EE0; };
+               FF87532E62753EDFA3D29CAD = {isa = PBXBuildFile; fileRef = 6C5E26B4D28F8450435B8AE1; };
+               2F76CA28C8C0EFC7453D0EB8 = {isa = PBXBuildFile; fileRef = F5F2EA2238973488632FC322; };
+               6B5560283DEEBD6DD2D6C984 = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; };
+               1DBDFEDE359CFC84F8E3DE4C = {isa = PBXBuildFile; fileRef = FCD0D758C5767944BEC29730; };
+               CDABEA6258EC70C65C9ACCFE = {isa = PBXBuildFile; fileRef = 3E4ED41C374261CFFD309743; };
+               E2F44A968EC2598DAE33A997 = {isa = PBXBuildFile; fileRef = A1D6D36B96B6B37C31F32829; };
+               5CB78489F16E82144914972D = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; };
+               BC6036F22423CA0AFF0385A7 = {isa = PBXBuildFile; fileRef = 94B6C88FE30861A47CD28709; };
+               AEA090DAC5C747C50C7D3FA7 = {isa = PBXBuildFile; fileRef = CE38E6469D98462A2C22C915; };
+               CDEB6BA5341494AF51D07C72 = {isa = PBXBuildFile; fileRef = 0AB68DBAB6B7DAEDDDD5B683; };
+               0140787C0118A95E37DE90B4 = {isa = PBXBuildFile; fileRef = 9144821E003E15E4042B57DB; };
+               02A2ED58B066B4D119F67913 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               03A63C3CA6F24977F19C316D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               03B0F9318FD583525AB195A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               061AECBF1CC7056F4155812D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs2.cpp; path = ../../Source/Demos/DemoPIPs2.cpp; sourceTree = "SOURCE_ROOT"; };
+               0AB68DBAB6B7DAEDDDD5B683 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_product_unlocking.mm"; path = "../../JuceLibraryCode/include_juce_product_unlocking.mm"; sourceTree = "SOURCE_ROOT"; };
+               0B36C013D9790568B481634C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               0ECB4FCD24794CE516792552 = {isa = PBXFileReference; lastKnownFileType = folder; name = Audio; path = ../../../Audio; sourceTree = "<group>"; };
+               112FFCB73597157E721BCDF2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+               14CBD28B4887DAF89E27491C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               1CFE3935A3B810D5D68A2504 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+               1FCD2145DE3FCFCF4F55A8AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DemoContentComponent.h; path = ../../Source/UI/DemoContentComponent.h; sourceTree = "SOURCE_ROOT"; };
+               23CD1A3F9067C3A0ECE7BB67 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               25E5ED33876A2C752378C859 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/UI/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+               260481E972425474BB8155B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               346450C70C964FD9640B6086 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               388A8209DBB1B08594266121 = {isa = PBXFileReference; lastKnownFileType = folder; name = BLOCKS; path = ../../../BLOCKS; sourceTree = "<group>"; };
+               3AB62BFF806112585B54DDA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs1.cpp; path = ../../Source/Demos/DemoPIPs1.cpp; sourceTree = "SOURCE_ROOT"; };
+               3B99CF94C44E2EE04635A439 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+               3BC9753E0CD75A36DC742EE0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               3DC90DA86565B0356B6E5E0B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+               3E4ED41C374261CFFD309743 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               40BD06D4AB0D2C73E936A2F1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+               440D507FD8F31DB62B1F95C7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+               470C3E4553B513FFEF752779 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               491641F7632BCC81BBA0ED85 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               4DF215D350FFE5E119CBA7E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_box2d.cpp"; path = "../../JuceLibraryCode/include_juce_box2d.cpp"; sourceTree = "SOURCE_ROOT"; };
+               4E9AD0EAF3CA57B548622D9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               4EC2782DE1779A130835B64D = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               4F0A137A4115946A346180E6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               4FE6029FF76BCE9698595DC5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_product_unlocking"; path = "../../../../modules/juce_product_unlocking"; sourceTree = "SOURCE_ROOT"; };
+               5965349393850F41DF76F350 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               5A9F2000C66D24E8B01BE60B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               5CD17151385A69F1E07FE85B = {isa = PBXFileReference; lastKnownFileType = folder; name = DSP; path = ../../../DSP; sourceTree = "<group>"; };
+               60F2869DC345EAF2314D6C09 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               61AE09C749B007B70A265D9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               651ECE3C7BA845DDCFEE48F3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+               6847A9B2C5E3C2ED56D8D4E7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               6C198AF93E1F6E682189E2F6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               6C2C1AC86623F457427965EF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_box2d"; path = "../../../../modules/juce_box2d"; sourceTree = "SOURCE_ROOT"; };
+               6C5E26B4D28F8450435B8AE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               71A91516AFD980FEE694C0E1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               72129757D2A553B90A7157C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               7A5AAE9EE573FC6105CC4AAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = "SOURCE_ROOT"; };
+               7B3243C92248D379A0489AA4 = {isa = PBXFileReference; lastKnownFileType = folder; name = Utilities; path = ../../../Utilities; sourceTree = "<group>"; };
+               831A01C745C905F5715CD822 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_blocks_basics.cpp"; path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               8CE533D611CD0984AD028D73 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               903CD4126C779884797EF915 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               9144821E003E15E4042B57DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+               934ACDCB3FD9D223A3481D8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = "SOURCE_ROOT"; };
+               94B6C88FE30861A47CD28709 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               9672FCE6167ADB567A9EB2F8 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               96D99A08027CA35D6A4E5CFD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+               979F23EA9E5E76131299E886 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               9EBAEBBD9093CB005D1692F2 = {isa = PBXFileReference; lastKnownFileType = folder; name = GUI; path = ../../../GUI; sourceTree = "<group>"; };
+               A04E4408525F24F7DCBA000E = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               A1D6D36B96B6B37C31F32829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               A5256778E2EBD206B337B555 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+               A6F555BE0DDF01C285BD8BF5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_dsp"; path = "../../../../modules/juce_dsp"; sourceTree = "SOURCE_ROOT"; };
+               A9315F8368A5771EC39631CB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               B2BC383CE102EECCF49C7AF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = "SOURCE_ROOT"; };
+               C1E93FAF6C68A40A664422CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_dsp.mm"; path = "../../JuceLibraryCode/include_juce_dsp.mm"; sourceTree = "SOURCE_ROOT"; };
+               CE38E6469D98462A2C22C915 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+               CFF2BBEB242CC8B3B904B5F9 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               D018D636A4DC9BEA11720129 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_blocks_basics"; path = "../../../../modules/juce_blocks_basics"; sourceTree = "SOURCE_ROOT"; };
+               DC192EFA899E6CBE6B5CD394 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               E061A1C75FA5722167FC4997 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               E0A3F113BC27B7B4D6F1D693 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               E5BFC17E682AB426D203B3E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoContentComponent.cpp; path = ../../Source/UI/DemoContentComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+               E67AB94002886AF67437D6AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               EB68BD1224CD9748BFA332C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/UI/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+               ECE79F1433E92BB6213C86F5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+               EDDA01B246C6128CAF7A2914 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               EE6BDC78B539D27E65E92265 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JUCEDemos.h; path = ../../Source/Demos/JUCEDemos.h; sourceTree = "SOURCE_ROOT"; };
+               F5F2EA2238973488632FC322 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               FB1FC613CE260140F1CFD21B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               FCD0D758C5767944BEC29730 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               FDC3CA8D1403C169659F7D8C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               CD575607FAA297480EE95F13 = {isa = PBXGroup; children = (
+                                       3AB62BFF806112585B54DDA3,
+                                       061AECBF1CC7056F4155812D,
+                                       B2BC383CE102EECCF49C7AF7,
+                                       934ACDCB3FD9D223A3481D8F,
+                                       EE6BDC78B539D27E65E92265, ); name = Demos; sourceTree = "<group>"; };
+               BB12537403CC24C02622582C = {isa = PBXGroup; children = (
+                                       E5BFC17E682AB426D203B3E6,
+                                       1FCD2145DE3FCFCF4F55A8AD,
+                                       25E5ED33876A2C752378C859,
+                                       EB68BD1224CD9748BFA332C0,
+                                       7A5AAE9EE573FC6105CC4AAC, ); name = UI; sourceTree = "<group>"; };
+               6F933968486D9AD9FE112622 = {isa = PBXGroup; children = (
+                                       CD575607FAA297480EE95F13,
+                                       BB12537403CC24C02622582C,
+                                       260481E972425474BB8155B0,
+                                       ECE79F1433E92BB6213C86F5, ); name = Source; sourceTree = "<group>"; };
+               9683F931FA1B8B85FA8C4BD8 = {isa = PBXGroup; children = (
+                                       6F933968486D9AD9FE112622, ); name = DemoRunner; sourceTree = "<group>"; };
+               5A0B2CEF393A25C6D4B1B76C = {isa = PBXGroup; children = (
+                                       112FFCB73597157E721BCDF2,
+                                       6847A9B2C5E3C2ED56D8D4E7,
+                                       60F2869DC345EAF2314D6C09,
+                                       491641F7632BCC81BBA0ED85,
+                                       346450C70C964FD9640B6086,
+                                       0B36C013D9790568B481634C,
+                                       D018D636A4DC9BEA11720129,
+                                       6C2C1AC86623F457427965EF,
+                                       903CD4126C779884797EF915,
+                                       14CBD28B4887DAF89E27491C,
+                                       FDC3CA8D1403C169659F7D8C,
+                                       A6F555BE0DDF01C285BD8BF5,
+                                       FB1FC613CE260140F1CFD21B,
+                                       8CE533D611CD0984AD028D73,
+                                       5A9F2000C66D24E8B01BE60B,
+                                       A9315F8368A5771EC39631CB,
+                                       6C198AF93E1F6E682189E2F6,
+                                       651ECE3C7BA845DDCFEE48F3,
+                                       4FE6029FF76BCE9698595DC5,
+                                       A5256778E2EBD206B337B555, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               61F3057D838D7DABB0FA3D34 = {isa = PBXGroup; children = (
+                                       72129757D2A553B90A7157C6,
+                                       5965349393850F41DF76F350,
+                                       03B0F9318FD583525AB195A9,
+                                       03A63C3CA6F24977F19C316D,
+                                       E061A1C75FA5722167FC4997,
+                                       E67AB94002886AF67437D6AE,
+                                       EDDA01B246C6128CAF7A2914,
+                                       831A01C745C905F5715CD822,
+                                       4DF215D350FFE5E119CBA7E5,
+                                       3BC9753E0CD75A36DC742EE0,
+                                       6C5E26B4D28F8450435B8AE1,
+                                       F5F2EA2238973488632FC322,
+                                       C1E93FAF6C68A40A664422CD,
+                                       FCD0D758C5767944BEC29730,
+                                       3E4ED41C374261CFFD309743,
+                                       A1D6D36B96B6B37C31F32829,
+                                       979F23EA9E5E76131299E886,
+                                       94B6C88FE30861A47CD28709,
+                                       CE38E6469D98462A2C22C915,
+                                       0AB68DBAB6B7DAEDDDD5B683,
+                                       9144821E003E15E4042B57DB,
+                                       4E9AD0EAF3CA57B548622D9A, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               D87DCD5DA4EC8D78DFF37FCC = {isa = PBXGroup; children = (
+                                       0ECB4FCD24794CE516792552,
+                                       388A8209DBB1B08594266121,
+                                       5CD17151385A69F1E07FE85B,
+                                       9EBAEBBD9093CB005D1692F2,
+                                       7B3243C92248D379A0489AA4,
+                                       4EC2782DE1779A130835B64D,
+                                       9672FCE6167ADB567A9EB2F8,
+                                       E0A3F113BC27B7B4D6F1D693, ); name = Resources; sourceTree = "<group>"; };
+               4452EAA652B65A9AE648288C = {isa = PBXGroup; children = (
+                                       A04E4408525F24F7DCBA000E,
+                                       470C3E4553B513FFEF752779,
+                                       DC192EFA899E6CBE6B5CD394,
+                                       3B99CF94C44E2EE04635A439,
+                                       440D507FD8F31DB62B1F95C7,
+                                       02A2ED58B066B4D119F67913,
+                                       4F0A137A4115946A346180E6,
+                                       1CFE3935A3B810D5D68A2504,
+                                       61AE09C749B007B70A265D9B,
+                                       3DC90DA86565B0356B6E5E0B,
+                                       71A91516AFD980FEE694C0E1,
+                                       40BD06D4AB0D2C73E936A2F1,
+                                       23CD1A3F9067C3A0ECE7BB67,
+                                       96D99A08027CA35D6A4E5CFD, ); name = Frameworks; sourceTree = "<group>"; };
+               BFDAF16175D03695EEB466BC = {isa = PBXGroup; children = (
+                                       CFF2BBEB242CC8B3B904B5F9, ); name = Products; sourceTree = "<group>"; };
+               91A9A0FE9DF4F4E10009EEC7 = {isa = PBXGroup; children = (
+                                       9683F931FA1B8B85FA8C4BD8,
+                                       5A0B2CEF393A25C6D4B1B76C,
+                                       61F3057D838D7DABB0FA3D34,
+                                       D87DCD5DA4EC8D78DFF37FCC,
+                                       4452EAA652B65A9AE648288C,
+                                       BFDAF16175D03695EEB466BC, ); name = Source; sourceTree = "<group>"; };
+               B18D059E5616FA729F764229 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=5.4.1",
-                                       "JUCE_APP_VERSION_HEX=0x50401",
+                                       "JUCE_APP_VERSION=5.3.2",
+                                       "JUCE_APP_VERSION_HEX=0x50302",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
-                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
-                               PRODUCT_NAME = "DemoRunner";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               69330F27DD2C71609336C7D2 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               69330F27DD2C71609336C7D2 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=5.4.1",
-                                       "JUCE_APP_VERSION_HEX=0x50401",
+                                       "JUCE_APP_VERSION=5.3.2",
+                                       "JUCE_APP_VERSION_HEX=0x50302",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
-                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
-                               PRODUCT_NAME = "DemoRunner";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               C01EC82F42B640CA1E54AD53 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               C01EC82F42B640CA1E54AD53 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "DemoRunner";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               07EA85D22270E8EA13CA0BBE = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               07EA85D22270E8EA13CA0BBE = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "DemoRunner";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               D87BAF6D1A7451B7A733B5F1 = {
-                       isa = PBXTargetDependency;
-                       target = 291E01DCBE746A376DBFA4D1;
-               };
-               80E8AD1971F52B06F4D28891 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               C01EC82F42B640CA1E54AD53,
-                               07EA85D22270E8EA13CA0BBE,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               413FBEAEC84DFEC41133C78B = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               B18D059E5616FA729F764229,
-                               69330F27DD2C71609336C7D2,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               57134FDD813875865F5B2057 = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               D3D8CDCE42E8BE31C7247E38,
-                               3B3952A9A14320312EF890A5,
-                               41BAB55E0D992708EF06E2C4,
-                               1BA301E39E29966719B710A1,
-                               E33E8FE2E7F8EC8EB4279F1B,
-                               91CD2BCE4CA07E18229EB436,
-                               75DB074DBAE04408A0A917B7,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               ED916866997CA4F40C7C1016 = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               E6F58FC3ACAE774DB4D06420,
-                               36E115D98311F12AA06710E6,
-                               B38728296BB32B7994CE28DF,
-                               71DF4F5EB4C8305688416725,
-                               4FBBB55F4E347757F74F1F41,
-                               F619F3887CEC064441BB6EE6,
-                               C2BB2B6DA237FE0CB64C7EDA,
-                               F28112945CEBEA4CE8975833,
-                               9EACEA6BE8D0ACC72C12C080,
-                               26652AB1BB77C8A39434775F,
-                               2707968B431D83AC7E28E49B,
-                               712D81867EC698463252FA79,
-                               49E7BBD46981F0035E4E9021,
-                               611298FAC1A543BDD10D4C41,
-                               D183F8140174ACCDDCD230A2,
-                               FF87532E62753EDFA3D29CAD,
-                               2F76CA28C8C0EFC7453D0EB8,
-                               6B5560283DEEBD6DD2D6C984,
-                               1DBDFEDE359CFC84F8E3DE4C,
-                               CDABEA6258EC70C65C9ACCFE,
-                               E2F44A968EC2598DAE33A997,
-                               5CB78489F16E82144914972D,
-                               BC6036F22423CA0AFF0385A7,
-                               AEA090DAC5C747C50C7D3FA7,
-                               CDEB6BA5341494AF51D07C72,
-                               0140787C0118A95E37DE90B4,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               4B1F6E32C9FC8D779B21C1AF = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               48CF0B02E1D06E5DA51E6270,
-                               163B0CF2DD0990A63DF1D5A6,
-                               7B4163348896EB1B86B15160,
-                               8C0AEA08A71075A6C765AEC9,
-                               89BC6E2354102D975E08E918,
-                               9F15FD7A7CE83CFD98F07D59,
-                               1351A13E78F38741C6075600,
-                               46071CE2B98B562B7BF27CB1,
-                               6A61CBB4E39BFD392D97528F,
-                               9BEA1428416CE06BF72FBAB8,
-                               8584640341100008744861A5,
-                               028383D0577D0236899D8CA5,
-                               B1981F62F6A91FD2F579A198,
-                               89AD16514B1F4133FFEA1DF9,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               291E01DCBE746A376DBFA4D1 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = 413FBEAEC84DFEC41133C78B;
-                       buildPhases = (
-                               57134FDD813875865F5B2057,
-                               ED916866997CA4F40C7C1016,
-                               4B1F6E32C9FC8D779B21C1AF,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "DemoRunner - App";
-                       productName = DemoRunner;
-                       productReference = CFF2BBEB242CC8B3B904B5F9;
-                       productType = "com.apple.product-type.application";
-               };
-               AC6F0E9A0809A184B2C2B7DE = {
-                       isa = PBXProject;
-                       buildConfigurationList = 80E8AD1971F52B06F4D28891;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 91A9A0FE9DF4F4E10009EEC7;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (291E01DCBE746A376DBFA4D1);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               D87BAF6D1A7451B7A733B5F1 = {isa = PBXTargetDependency; target = 291E01DCBE746A376DBFA4D1; };
+               80E8AD1971F52B06F4D28891 = {isa = XCConfigurationList; buildConfigurations = (
+                                       C01EC82F42B640CA1E54AD53,
+                                       07EA85D22270E8EA13CA0BBE, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               413FBEAEC84DFEC41133C78B = {isa = XCConfigurationList; buildConfigurations = (
+                                       B18D059E5616FA729F764229,
+                                       69330F27DD2C71609336C7D2, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               57134FDD813875865F5B2057 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       D3D8CDCE42E8BE31C7247E38,
+                                       3B3952A9A14320312EF890A5,
+                                       41BAB55E0D992708EF06E2C4,
+                                       1BA301E39E29966719B710A1,
+                                       E33E8FE2E7F8EC8EB4279F1B,
+                                       91CD2BCE4CA07E18229EB436,
+                                       75DB074DBAE04408A0A917B7, ); runOnlyForDeploymentPostprocessing = 0; };
+               ED916866997CA4F40C7C1016 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       E6F58FC3ACAE774DB4D06420,
+                                       36E115D98311F12AA06710E6,
+                                       B38728296BB32B7994CE28DF,
+                                       71DF4F5EB4C8305688416725,
+                                       4FBBB55F4E347757F74F1F41,
+                                       F619F3887CEC064441BB6EE6,
+                                       C2BB2B6DA237FE0CB64C7EDA,
+                                       F28112945CEBEA4CE8975833,
+                                       9EACEA6BE8D0ACC72C12C080,
+                                       26652AB1BB77C8A39434775F,
+                                       2707968B431D83AC7E28E49B,
+                                       712D81867EC698463252FA79,
+                                       49E7BBD46981F0035E4E9021,
+                                       611298FAC1A543BDD10D4C41,
+                                       D183F8140174ACCDDCD230A2,
+                                       FF87532E62753EDFA3D29CAD,
+                                       2F76CA28C8C0EFC7453D0EB8,
+                                       6B5560283DEEBD6DD2D6C984,
+                                       1DBDFEDE359CFC84F8E3DE4C,
+                                       CDABEA6258EC70C65C9ACCFE,
+                                       E2F44A968EC2598DAE33A997,
+                                       5CB78489F16E82144914972D,
+                                       BC6036F22423CA0AFF0385A7,
+                                       AEA090DAC5C747C50C7D3FA7,
+                                       CDEB6BA5341494AF51D07C72,
+                                       0140787C0118A95E37DE90B4, ); runOnlyForDeploymentPostprocessing = 0; };
+               4B1F6E32C9FC8D779B21C1AF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       48CF0B02E1D06E5DA51E6270,
+                                       163B0CF2DD0990A63DF1D5A6,
+                                       7B4163348896EB1B86B15160,
+                                       8C0AEA08A71075A6C765AEC9,
+                                       89BC6E2354102D975E08E918,
+                                       9F15FD7A7CE83CFD98F07D59,
+                                       1351A13E78F38741C6075600,
+                                       46071CE2B98B562B7BF27CB1,
+                                       6A61CBB4E39BFD392D97528F,
+                                       9BEA1428416CE06BF72FBAB8,
+                                       8584640341100008744861A5,
+                                       028383D0577D0236899D8CA5,
+                                       B1981F62F6A91FD2F579A198,
+                                       89AD16514B1F4133FFEA1DF9, ); runOnlyForDeploymentPostprocessing = 0; };
+               291E01DCBE746A376DBFA4D1 = {isa = PBXNativeTarget; buildConfigurationList = 413FBEAEC84DFEC41133C78B; buildPhases = (
+                                       57134FDD813875865F5B2057,
+                                       ED916866997CA4F40C7C1016,
+                                       4B1F6E32C9FC8D779B21C1AF, ); buildRules = ( ); dependencies = (  ); name = "DemoRunner - App"; productName = DemoRunner; productReference = CFF2BBEB242CC8B3B904B5F9; productType = "com.apple.product-type.application"; };
+               AC6F0E9A0809A184B2C2B7DE = {isa = PBXProject; buildConfigurationList = 80E8AD1971F52B06F4D28891; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 91A9A0FE9DF4F4E10009EEC7; projectDirPath = ""; projectRoot = ""; targets = (291E01DCBE746A376DBFA4D1); };
        };
        rootObject = AC6F0E9A0809A184B2C2B7DE;
 }
index 600c9f9b47e523e9f73e1b512c11dc853ecf7a46..bce688bec35fa4c4de53e9094a591296e68aac59 100644 (file)
@@ -3,10 +3,6 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
 <plist>\r
   <dict>\r
-    <key>NSMicrophoneUsageDescription</key>\r
-    <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
-    <key>NSCameraUsageDescription</key>\r
-    <string>This app requires access to the camera to function correctly.</string>\r
     <key>CFBundleExecutable</key>\r
     <string>${EXECUTABLE_NAME}</string>\r
     <key>CFBundleIconFile</key>\r
@@ -22,9 +18,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>5.4.1</string>\r
+    <string>5.3.2</string>\r
     <key>CFBundleVersion</key>\r
-    <string>5.4.1</string>\r
+    <string>5.3.2</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2018 - ROLI Ltd.</string>\r
     <key>NSHighResolutionCapable</key>\r
index 5a05bc53003d06109eb82da9be59237bea0e4473..3ec1daea850c1bf246c4e382cf8c405c3e44a8d1 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}</ProjectGuid>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,6 +25,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v120</PlatformToolset>\r
+    <PlatformToolset>v120</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
@@ -31,6 +34,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v120</PlatformToolset>\r
+    <PlatformToolset>v120</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">DemoRunner</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <None Include="..\..\Source\JUCEAppIcon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
index eab60e84db17d25dc4ab838d56a84b44ded45861..b1ec6a7918a1338b645fc516e6c1ae41990683ac 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
       <Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
     </None>\r
index 0c739d38ae83bc9a5494681b0db33acee85962b7..0bf34edc073eb98b90d4d11f7f813b57ff5b0d46 100644 (file)
@@ -7,7 +7,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  5,4,1,0\r
+FILEVERSION  5,3,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -16,9 +16,9 @@ BEGIN
       VALUE "CompanyName",  "ROLI Ltd.\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2018 - ROLI Ltd.\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "5.4.1\0"\r
+      VALUE "FileVersion",  "5.3.2\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "5.4.1\0"\r
+      VALUE "ProductVersion",  "5.3.2\0"\r
     END\r
   END\r
 \r
index 20fb0d4142b05fe76f476162a969a1cb119beb0f..6622326ea9cca243db3995c743367e6edf9107f4 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}</ProjectGuid>\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,6 +25,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v140</PlatformToolset>\r
+    <PlatformToolset>v140</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
@@ -31,6 +34,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v140</PlatformToolset>\r
+    <PlatformToolset>v140</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">DemoRunner</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <None Include="..\..\Source\JUCEAppIcon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
index a9d95373ba86cca7119ba20c68eb377ae3176f8c..f2d69a69849e0c6213393a9be84beb7b8143a6d0 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
       <Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
     </None>\r
index 0c739d38ae83bc9a5494681b0db33acee85962b7..0bf34edc073eb98b90d4d11f7f813b57ff5b0d46 100644 (file)
@@ -7,7 +7,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  5,4,1,0\r
+FILEVERSION  5,3,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -16,9 +16,9 @@ BEGIN
       VALUE "CompanyName",  "ROLI Ltd.\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2018 - ROLI Ltd.\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "5.4.1\0"\r
+      VALUE "FileVersion",  "5.3.2\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "5.4.1\0"\r
+      VALUE "ProductVersion",  "5.3.2\0"\r
     END\r
   END\r
 \r
index ee10af155f459a984c02edc555637662d142a506..f6537a8a7a2dff34bad8bb7f39238447845ec3e8 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">DemoRunner</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
@@ -74,7 +84,6 @@
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ResourceCompile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ResourceCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <None Include="..\..\Source\JUCEAppIcon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
index 219a21892f2a18b0fcd0f3c92fdff3df89bca6ba..00170e0947ae3c2746242d20a0babc60df9a1600 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
       <Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
     </None>\r
index 0c739d38ae83bc9a5494681b0db33acee85962b7..0bf34edc073eb98b90d4d11f7f813b57ff5b0d46 100644 (file)
@@ -7,7 +7,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  5,4,1,0\r
+FILEVERSION  5,3,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -16,9 +16,9 @@ BEGIN
       VALUE "CompanyName",  "ROLI Ltd.\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2018 - ROLI Ltd.\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "5.4.1\0"\r
+      VALUE "FileVersion",  "5.3.2\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "5.4.1\0"\r
+      VALUE "ProductVersion",  "5.3.2\0"\r
     END\r
   END\r
 \r
index 7187cd889522d74dfa73456880b535c46e193335..9a62e8904086abe0f20394b1dc3baa76f9e0e58c 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               63A2F309E55DAC206E9B97E3 = {
-                       isa = PBXBuildFile;
-                       fileRef = CFF2BBEB242CC8B3B904B5F9;
-               };
-               48CF0B02E1D06E5DA51E6270 = {
-                       isa = PBXBuildFile;
-                       fileRef = A04E4408525F24F7DCBA000E;
-               };
-               163B0CF2DD0990A63DF1D5A6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 470C3E4553B513FFEF752779;
-               };
-               7B4163348896EB1B86B15160 = {
-                       isa = PBXBuildFile;
-                       fileRef = DC192EFA899E6CBE6B5CD394;
-               };
-               8C0AEA08A71075A6C765AEC9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3B99CF94C44E2EE04635A439;
-               };
-               1351A13E78F38741C6075600 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4F0A137A4115946A346180E6;
-               };
-               527DA2E6827BAFDDD3E8E80F = {
-                       isa = PBXBuildFile;
-                       fileRef = B4389672DA4CC8E0A531062D;
-               };
-               34A4931AF1DD424D3A400EEF = {
-                       isa = PBXBuildFile;
-                       fileRef = 76A157A111866670A4678F04;
-               };
-               7F57DB52C3CEFDC26DDD38FC = {
-                       isa = PBXBuildFile;
-                       fileRef = B28EFB9D1DF0B6D6499A7DEF;
-               };
-               46071CE2B98B562B7BF27CB1 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1CFE3935A3B810D5D68A2504;
-               };
-               6A61CBB4E39BFD392D97528F = {
-                       isa = PBXBuildFile;
-                       fileRef = 61AE09C749B007B70A265D9B;
-               };
-               0B0CE6D5062E5C02A41F24BC = {
-                       isa = PBXBuildFile;
-                       fileRef = 873F9DD54978E601102353B4;
-               };
-               5E4310B3F6BB639875D3E9B8 = {
-                       isa = PBXBuildFile;
-                       fileRef = 49ECA8B998B339A083674A22;
-               };
-               AE7FB2AC3885F4BF53A5DDA1 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7983C452610C1638B7E78F12;
-               };
-               1FB200F4AE3E4E7CDFF629BB = {
-                       isa = PBXBuildFile;
-                       fileRef = 24D74AF1C95BEF957DC4FA77;
-               };
-               AC783ECD84496E0B77911EEE = {
-                       isa = PBXBuildFile;
-                       fileRef = 34F1320BC5C23702C08DF9F0;
-               };
-               B1981F62F6A91FD2F579A198 = {
-                       isa = PBXBuildFile;
-                       fileRef = 23CD1A3F9067C3A0ECE7BB67;
-               };
-               ECA44A41DA8A935178C1A1F4 = {
-                       isa = PBXBuildFile;
-                       fileRef = F90C8B0233A54F1445343F67;
-               };
-               47ED2C78B05B8A6A00E36C46 = {
-                       isa = PBXBuildFile;
-                       fileRef = 685A261BE78585293F3EAD36;
-               };
-               8E63755144E29269FD82C897 = {
-                       isa = PBXBuildFile;
-                       fileRef = 8135645508EEFDBDCDF2ADC6;
-               };
-               75DB074DBAE04408A0A917B7 = {
-                       isa = PBXBuildFile;
-                       fileRef = E0A3F113BC27B7B4D6F1D693;
-               };
-               E6F58FC3ACAE774DB4D06420 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3AB62BFF806112585B54DDA3;
-               };
-               36E115D98311F12AA06710E6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 061AECBF1CC7056F4155812D;
-               };
-               B38728296BB32B7994CE28DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 934ACDCB3FD9D223A3481D8F;
-               };
-               71DF4F5EB4C8305688416725 = {
-                       isa = PBXBuildFile;
-                       fileRef = E5BFC17E682AB426D203B3E6;
-               };
-               4FBBB55F4E347757F74F1F41 = {
-                       isa = PBXBuildFile;
-                       fileRef = 25E5ED33876A2C752378C859;
-               };
-               F619F3887CEC064441BB6EE6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 260481E972425474BB8155B0;
-               };
-               C2BB2B6DA237FE0CB64C7EDA = {
-                       isa = PBXBuildFile;
-                       fileRef = 5965349393850F41DF76F350;
-               };
-               F28112945CEBEA4CE8975833 = {
-                       isa = PBXBuildFile;
-                       fileRef = 03B0F9318FD583525AB195A9;
-               };
-               9EACEA6BE8D0ACC72C12C080 = {
-                       isa = PBXBuildFile;
-                       fileRef = 03A63C3CA6F24977F19C316D;
-               };
-               26652AB1BB77C8A39434775F = {
-                       isa = PBXBuildFile;
-                       fileRef = E061A1C75FA5722167FC4997;
-               };
-               2707968B431D83AC7E28E49B = {
-                       isa = PBXBuildFile;
-                       fileRef = E67AB94002886AF67437D6AE;
-               };
-               712D81867EC698463252FA79 = {
-                       isa = PBXBuildFile;
-                       fileRef = EDDA01B246C6128CAF7A2914;
-               };
-               49E7BBD46981F0035E4E9021 = {
-                       isa = PBXBuildFile;
-                       fileRef = 831A01C745C905F5715CD822;
-               };
-               611298FAC1A543BDD10D4C41 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4DF215D350FFE5E119CBA7E5;
-               };
-               D183F8140174ACCDDCD230A2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3BC9753E0CD75A36DC742EE0;
-               };
-               FF87532E62753EDFA3D29CAD = {
-                       isa = PBXBuildFile;
-                       fileRef = 6C5E26B4D28F8450435B8AE1;
-               };
-               2F76CA28C8C0EFC7453D0EB8 = {
-                       isa = PBXBuildFile;
-                       fileRef = F5F2EA2238973488632FC322;
-               };
-               6B5560283DEEBD6DD2D6C984 = {
-                       isa = PBXBuildFile;
-                       fileRef = C1E93FAF6C68A40A664422CD;
-               };
-               1DBDFEDE359CFC84F8E3DE4C = {
-                       isa = PBXBuildFile;
-                       fileRef = FCD0D758C5767944BEC29730;
-               };
-               CDABEA6258EC70C65C9ACCFE = {
-                       isa = PBXBuildFile;
-                       fileRef = 3E4ED41C374261CFFD309743;
-               };
-               E2F44A968EC2598DAE33A997 = {
-                       isa = PBXBuildFile;
-                       fileRef = A1D6D36B96B6B37C31F32829;
-               };
-               5CB78489F16E82144914972D = {
-                       isa = PBXBuildFile;
-                       fileRef = 979F23EA9E5E76131299E886;
-               };
-               BC6036F22423CA0AFF0385A7 = {
-                       isa = PBXBuildFile;
-                       fileRef = 94B6C88FE30861A47CD28709;
-               };
-               AEA090DAC5C747C50C7D3FA7 = {
-                       isa = PBXBuildFile;
-                       fileRef = CE38E6469D98462A2C22C915;
-               };
-               CDEB6BA5341494AF51D07C72 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0AB68DBAB6B7DAEDDDD5B683;
-               };
-               0140787C0118A95E37DE90B4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9144821E003E15E4042B57DB;
-               };
-               03A63C3CA6F24977F19C316D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               03B0F9318FD583525AB195A9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               061AECBF1CC7056F4155812D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = DemoPIPs2.cpp;
-                       path = ../../Source/Demos/DemoPIPs2.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0AB68DBAB6B7DAEDDDD5B683 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_product_unlocking.mm";
-                       path = "../../JuceLibraryCode/include_juce_product_unlocking.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0B36C013D9790568B481634C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0CCFDC1D1C7B8A12BF4822F1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = DemoRunner.entitlements;
-                       path = DemoRunner.entitlements;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               112FFCB73597157E721BCDF2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_analytics";
-                       path = "../../../../modules/juce_analytics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               14CBD28B4887DAF89E27491C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1CFE3935A3B810D5D68A2504 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMedia.framework;
-                       path = System/Library/Frameworks/CoreMedia.framework;
-                       sourceTree = SDKROOT;
-               };
-               1FCD2145DE3FCFCF4F55A8AD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = DemoContentComponent.h;
-                       path = ../../Source/UI/DemoContentComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               23CD1A3F9067C3A0ECE7BB67 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               24D74AF1C95BEF957DC4FA77 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = MobileCoreServices.framework;
-                       path = System/Library/Frameworks/MobileCoreServices.framework;
-                       sourceTree = SDKROOT;
-               };
-               25E5ED33876A2C752378C859 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = MainComponent.cpp;
-                       path = ../../Source/UI/MainComponent.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               260481E972425474BB8155B0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               346450C70C964FD9640B6086 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               34F1320BC5C23702C08DF9F0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGLES.framework;
-                       path = System/Library/Frameworks/OpenGLES.framework;
-                       sourceTree = SDKROOT;
-               };
-               3AB62BFF806112585B54DDA3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = DemoPIPs1.cpp;
-                       path = ../../Source/Demos/DemoPIPs1.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3B99CF94C44E2EE04635A439 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVKit.framework;
-                       path = System/Library/Frameworks/AVKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               3BC9753E0CD75A36DC742EE0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3E4ED41C374261CFFD309743 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               470C3E4553B513FFEF752779 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               491641F7632BCC81BBA0ED85 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               49ECA8B998B339A083674A22 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Foundation.framework;
-                       path = System/Library/Frameworks/Foundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               4DF215D350FFE5E119CBA7E5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_box2d.cpp";
-                       path = "../../JuceLibraryCode/include_juce_box2d.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4E9AD0EAF3CA57B548622D9A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4EC2782DE1779A130835B64D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4F0A137A4115946A346180E6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               4FE6029FF76BCE9698595DC5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_product_unlocking";
-                       path = "../../../../modules/juce_product_unlocking";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5965349393850F41DF76F350 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_analytics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_analytics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5A9F2000C66D24E8B01BE60B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               60F2869DC345EAF2314D6C09 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               61AE09C749B007B70A265D9B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               651ECE3C7BA845DDCFEE48F3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_osc";
-                       path = "../../../../modules/juce_osc";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6847A9B2C5E3C2ED56D8D4E7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               685A261BE78585293F3EAD36 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder;
-                       name = Assets;
-                       path = ../../../Assets;
-                       sourceTree = "<group>";
-               };
-               6C198AF93E1F6E682189E2F6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6C2C1AC86623F457427965EF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_box2d";
-                       path = "../../../../modules/juce_box2d";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6C5E26B4D28F8450435B8AE1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               72129757D2A553B90A7157C6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               76A157A111866670A4678F04 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreGraphics.framework;
-                       path = System/Library/Frameworks/CoreGraphics.framework;
-                       sourceTree = SDKROOT;
-               };
-               7983C452610C1638B7E78F12 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = ImageIO.framework;
-                       path = System/Library/Frameworks/ImageIO.framework;
-                       sourceTree = SDKROOT;
-               };
-               7A5AAE9EE573FC6105CC4AAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = SettingsContent.h;
-                       path = ../../Source/UI/SettingsContent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8135645508EEFDBDCDF2ADC6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder.assetcatalog;
-                       name = Images.xcassets;
-                       path = DemoRunner/Images.xcassets;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               831A01C745C905F5715CD822 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_blocks_basics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               873F9DD54978E601102353B4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreText.framework;
-                       path = System/Library/Frameworks/CoreText.framework;
-                       sourceTree = SDKROOT;
-               };
-               8CE533D611CD0984AD028D73 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               903CD4126C779884797EF915 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9144821E003E15E4042B57DB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_video.mm";
-                       path = "../../JuceLibraryCode/include_juce_video.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               934ACDCB3FD9D223A3481D8F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = JUCEDemos.cpp;
-                       path = ../../Source/Demos/JUCEDemos.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               94B6C88FE30861A47CD28709 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               979F23EA9E5E76131299E886 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A04E4408525F24F7DCBA000E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               A1D6D36B96B6B37C31F32829 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A5256778E2EBD206B337B555 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_video";
-                       path = "../../../../modules/juce_video";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A6F555BE0DDF01C285BD8BF5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_dsp";
-                       path = "../../../../modules/juce_dsp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A9315F8368A5771EC39631CB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B28EFB9D1DF0B6D6499A7DEF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreImage.framework;
-                       path = System/Library/Frameworks/CoreImage.framework;
-                       sourceTree = SDKROOT;
-               };
-               B2BC383CE102EECCF49C7AF7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = IntroScreen.h;
-                       path = ../../Source/Demos/IntroScreen.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B4389672DA4CC8E0A531062D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudioKit.framework;
-                       path = System/Library/Frameworks/CoreAudioKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               C1E93FAF6C68A40A664422CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_dsp.mm";
-                       path = "../../JuceLibraryCode/include_juce_dsp.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CE38E6469D98462A2C22C915 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_osc.cpp";
-                       path = "../../JuceLibraryCode/include_juce_osc.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CFF2BBEB242CC8B3B904B5F9 = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = DemoRunner.app;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               D018D636A4DC9BEA11720129 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_blocks_basics";
-                       path = "../../../../modules/juce_blocks_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DC192EFA899E6CBE6B5CD394 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               E061A1C75FA5722167FC4997 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E0A3F113BC27B7B4D6F1D693 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E5BFC17E682AB426D203B3E6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = DemoContentComponent.cpp;
-                       path = ../../Source/UI/DemoContentComponent.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E67AB94002886AF67437D6AE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EB68BD1224CD9748BFA332C0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MainComponent.h;
-                       path = ../../Source/UI/MainComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               ECE79F1433E92BB6213C86F5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = JUCEAppIcon.png;
-                       path = ../../Source/JUCEAppIcon.png;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EDDA01B246C6128CAF7A2914 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EE6BDC78B539D27E65E92265 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JUCEDemos.h;
-                       path = ../../Source/Demos/JUCEDemos.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F5F2EA2238973488632FC322 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F90C8B0233A54F1445343F67 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = UIKit.framework;
-                       path = System/Library/Frameworks/UIKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               FB1FC613CE260140F1CFD21B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FCD0D758C5767944BEC29730 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FDC3CA8D1403C169659F7D8C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CD575607FAA297480EE95F13 = {
-                       isa = PBXGroup;
-                       children = (
-                               3AB62BFF806112585B54DDA3,
-                               061AECBF1CC7056F4155812D,
-                               B2BC383CE102EECCF49C7AF7,
-                               934ACDCB3FD9D223A3481D8F,
-                               EE6BDC78B539D27E65E92265,
-                       );
-                       name = Demos;
-                       sourceTree = "<group>";
-               };
-               BB12537403CC24C02622582C = {
-                       isa = PBXGroup;
-                       children = (
-                               E5BFC17E682AB426D203B3E6,
-                               1FCD2145DE3FCFCF4F55A8AD,
-                               25E5ED33876A2C752378C859,
-                               EB68BD1224CD9748BFA332C0,
-                               7A5AAE9EE573FC6105CC4AAC,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               6F933968486D9AD9FE112622 = {
-                       isa = PBXGroup;
-                       children = (
-                               CD575607FAA297480EE95F13,
-                               BB12537403CC24C02622582C,
-                               260481E972425474BB8155B0,
-                               ECE79F1433E92BB6213C86F5,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               9683F931FA1B8B85FA8C4BD8 = {
-                       isa = PBXGroup;
-                       children = (
-                               6F933968486D9AD9FE112622,
-                       );
-                       name = DemoRunner;
-                       sourceTree = "<group>";
-               };
-               5A0B2CEF393A25C6D4B1B76C = {
-                       isa = PBXGroup;
-                       children = (
-                               112FFCB73597157E721BCDF2,
-                               6847A9B2C5E3C2ED56D8D4E7,
-                               60F2869DC345EAF2314D6C09,
-                               491641F7632BCC81BBA0ED85,
-                               346450C70C964FD9640B6086,
-                               0B36C013D9790568B481634C,
-                               D018D636A4DC9BEA11720129,
-                               6C2C1AC86623F457427965EF,
-                               903CD4126C779884797EF915,
-                               14CBD28B4887DAF89E27491C,
-                               FDC3CA8D1403C169659F7D8C,
-                               A6F555BE0DDF01C285BD8BF5,
-                               FB1FC613CE260140F1CFD21B,
-                               8CE533D611CD0984AD028D73,
-                               5A9F2000C66D24E8B01BE60B,
-                               A9315F8368A5771EC39631CB,
-                               6C198AF93E1F6E682189E2F6,
-                               651ECE3C7BA845DDCFEE48F3,
-                               4FE6029FF76BCE9698595DC5,
-                               A5256778E2EBD206B337B555,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               61F3057D838D7DABB0FA3D34 = {
-                       isa = PBXGroup;
-                       children = (
-                               72129757D2A553B90A7157C6,
-                               5965349393850F41DF76F350,
-                               03B0F9318FD583525AB195A9,
-                               03A63C3CA6F24977F19C316D,
-                               E061A1C75FA5722167FC4997,
-                               E67AB94002886AF67437D6AE,
-                               EDDA01B246C6128CAF7A2914,
-                               831A01C745C905F5715CD822,
-                               4DF215D350FFE5E119CBA7E5,
-                               3BC9753E0CD75A36DC742EE0,
-                               6C5E26B4D28F8450435B8AE1,
-                               F5F2EA2238973488632FC322,
-                               C1E93FAF6C68A40A664422CD,
-                               FCD0D758C5767944BEC29730,
-                               3E4ED41C374261CFFD309743,
-                               A1D6D36B96B6B37C31F32829,
-                               979F23EA9E5E76131299E886,
-                               94B6C88FE30861A47CD28709,
-                               CE38E6469D98462A2C22C915,
-                               0AB68DBAB6B7DAEDDDD5B683,
-                               9144821E003E15E4042B57DB,
-                               4E9AD0EAF3CA57B548622D9A,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               D87DCD5DA4EC8D78DFF37FCC = {
-                       isa = PBXGroup;
-                       children = (
-                               685A261BE78585293F3EAD36,
-                               4EC2782DE1779A130835B64D,
-                               8135645508EEFDBDCDF2ADC6,
-                               E0A3F113BC27B7B4D6F1D693,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               4452EAA652B65A9AE648288C = {
-                       isa = PBXGroup;
-                       children = (
-                               A04E4408525F24F7DCBA000E,
-                               470C3E4553B513FFEF752779,
-                               DC192EFA899E6CBE6B5CD394,
-                               3B99CF94C44E2EE04635A439,
-                               4F0A137A4115946A346180E6,
-                               B4389672DA4CC8E0A531062D,
-                               76A157A111866670A4678F04,
-                               B28EFB9D1DF0B6D6499A7DEF,
-                               1CFE3935A3B810D5D68A2504,
-                               61AE09C749B007B70A265D9B,
-                               873F9DD54978E601102353B4,
-                               49ECA8B998B339A083674A22,
-                               7983C452610C1638B7E78F12,
-                               24D74AF1C95BEF957DC4FA77,
-                               34F1320BC5C23702C08DF9F0,
-                               23CD1A3F9067C3A0ECE7BB67,
-                               F90C8B0233A54F1445343F67,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               BFDAF16175D03695EEB466BC = {
-                       isa = PBXGroup;
-                       children = (
-                               CFF2BBEB242CC8B3B904B5F9,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               91A9A0FE9DF4F4E10009EEC7 = {
-                       isa = PBXGroup;
-                       children = (
-                               0CCFDC1D1C7B8A12BF4822F1,
-                               9683F931FA1B8B85FA8C4BD8,
-                               5A0B2CEF393A25C6D4B1B76C,
-                               61F3057D838D7DABB0FA3D34,
-                               D87DCD5DA4EC8D78DFF37FCC,
-                               4452EAA652B65A9AE648288C,
-                               BFDAF16175D03695EEB466BC,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               B18D059E5616FA729F764229 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               63A2F309E55DAC206E9B97E3 = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; };
+               48CF0B02E1D06E5DA51E6270 = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; };
+               163B0CF2DD0990A63DF1D5A6 = {isa = PBXBuildFile; fileRef = 470C3E4553B513FFEF752779; };
+               7B4163348896EB1B86B15160 = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; };
+               8C0AEA08A71075A6C765AEC9 = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; };
+               1351A13E78F38741C6075600 = {isa = PBXBuildFile; fileRef = 4F0A137A4115946A346180E6; };
+               527DA2E6827BAFDDD3E8E80F = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; };
+               34A4931AF1DD424D3A400EEF = {isa = PBXBuildFile; fileRef = 76A157A111866670A4678F04; };
+               7F57DB52C3CEFDC26DDD38FC = {isa = PBXBuildFile; fileRef = B28EFB9D1DF0B6D6499A7DEF; };
+               46071CE2B98B562B7BF27CB1 = {isa = PBXBuildFile; fileRef = 1CFE3935A3B810D5D68A2504; };
+               6A61CBB4E39BFD392D97528F = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; };
+               0B0CE6D5062E5C02A41F24BC = {isa = PBXBuildFile; fileRef = 873F9DD54978E601102353B4; };
+               5E4310B3F6BB639875D3E9B8 = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; };
+               AE7FB2AC3885F4BF53A5DDA1 = {isa = PBXBuildFile; fileRef = 7983C452610C1638B7E78F12; };
+               1FB200F4AE3E4E7CDFF629BB = {isa = PBXBuildFile; fileRef = 24D74AF1C95BEF957DC4FA77; };
+               AC783ECD84496E0B77911EEE = {isa = PBXBuildFile; fileRef = 34F1320BC5C23702C08DF9F0; };
+               B1981F62F6A91FD2F579A198 = {isa = PBXBuildFile; fileRef = 23CD1A3F9067C3A0ECE7BB67; };
+               ECA44A41DA8A935178C1A1F4 = {isa = PBXBuildFile; fileRef = F90C8B0233A54F1445343F67; };
+               47ED2C78B05B8A6A00E36C46 = {isa = PBXBuildFile; fileRef = 685A261BE78585293F3EAD36; };
+               8E63755144E29269FD82C897 = {isa = PBXBuildFile; fileRef = 8135645508EEFDBDCDF2ADC6; };
+               75DB074DBAE04408A0A917B7 = {isa = PBXBuildFile; fileRef = E0A3F113BC27B7B4D6F1D693; };
+               E6F58FC3ACAE774DB4D06420 = {isa = PBXBuildFile; fileRef = 3AB62BFF806112585B54DDA3; };
+               36E115D98311F12AA06710E6 = {isa = PBXBuildFile; fileRef = 061AECBF1CC7056F4155812D; };
+               B38728296BB32B7994CE28DF = {isa = PBXBuildFile; fileRef = 934ACDCB3FD9D223A3481D8F; };
+               71DF4F5EB4C8305688416725 = {isa = PBXBuildFile; fileRef = E5BFC17E682AB426D203B3E6; };
+               4FBBB55F4E347757F74F1F41 = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
+               F619F3887CEC064441BB6EE6 = {isa = PBXBuildFile; fileRef = 260481E972425474BB8155B0; };
+               C2BB2B6DA237FE0CB64C7EDA = {isa = PBXBuildFile; fileRef = 5965349393850F41DF76F350; };
+               F28112945CEBEA4CE8975833 = {isa = PBXBuildFile; fileRef = 03B0F9318FD583525AB195A9; };
+               9EACEA6BE8D0ACC72C12C080 = {isa = PBXBuildFile; fileRef = 03A63C3CA6F24977F19C316D; };
+               26652AB1BB77C8A39434775F = {isa = PBXBuildFile; fileRef = E061A1C75FA5722167FC4997; };
+               2707968B431D83AC7E28E49B = {isa = PBXBuildFile; fileRef = E67AB94002886AF67437D6AE; };
+               712D81867EC698463252FA79 = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; };
+               49E7BBD46981F0035E4E9021 = {isa = PBXBuildFile; fileRef = 831A01C745C905F5715CD822; };
+               611298FAC1A543BDD10D4C41 = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; };
+               D183F8140174ACCDDCD230A2 = {isa = PBXBuildFile; fileRef = 3BC9753E0CD75A36DC742EE0; };
+               FF87532E62753EDFA3D29CAD = {isa = PBXBuildFile; fileRef = 6C5E26B4D28F8450435B8AE1; };
+               2F76CA28C8C0EFC7453D0EB8 = {isa = PBXBuildFile; fileRef = F5F2EA2238973488632FC322; };
+               6B5560283DEEBD6DD2D6C984 = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; };
+               1DBDFEDE359CFC84F8E3DE4C = {isa = PBXBuildFile; fileRef = FCD0D758C5767944BEC29730; };
+               CDABEA6258EC70C65C9ACCFE = {isa = PBXBuildFile; fileRef = 3E4ED41C374261CFFD309743; };
+               E2F44A968EC2598DAE33A997 = {isa = PBXBuildFile; fileRef = A1D6D36B96B6B37C31F32829; };
+               5CB78489F16E82144914972D = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; };
+               BC6036F22423CA0AFF0385A7 = {isa = PBXBuildFile; fileRef = 94B6C88FE30861A47CD28709; };
+               AEA090DAC5C747C50C7D3FA7 = {isa = PBXBuildFile; fileRef = CE38E6469D98462A2C22C915; };
+               CDEB6BA5341494AF51D07C72 = {isa = PBXBuildFile; fileRef = 0AB68DBAB6B7DAEDDDD5B683; };
+               0140787C0118A95E37DE90B4 = {isa = PBXBuildFile; fileRef = 9144821E003E15E4042B57DB; };
+               03A63C3CA6F24977F19C316D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               03B0F9318FD583525AB195A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               061AECBF1CC7056F4155812D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs2.cpp; path = ../../Source/Demos/DemoPIPs2.cpp; sourceTree = "SOURCE_ROOT"; };
+               0AB68DBAB6B7DAEDDDD5B683 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_product_unlocking.mm"; path = "../../JuceLibraryCode/include_juce_product_unlocking.mm"; sourceTree = "SOURCE_ROOT"; };
+               0B36C013D9790568B481634C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               0CCFDC1D1C7B8A12BF4822F1 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = DemoRunner.entitlements; path = DemoRunner.entitlements; sourceTree = "SOURCE_ROOT"; };
+               112FFCB73597157E721BCDF2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+               14CBD28B4887DAF89E27491C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               1CFE3935A3B810D5D68A2504 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+               1FCD2145DE3FCFCF4F55A8AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DemoContentComponent.h; path = ../../Source/UI/DemoContentComponent.h; sourceTree = "SOURCE_ROOT"; };
+               23CD1A3F9067C3A0ECE7BB67 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               24D74AF1C95BEF957DC4FA77 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+               25E5ED33876A2C752378C859 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/UI/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+               260481E972425474BB8155B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               346450C70C964FD9640B6086 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               34F1320BC5C23702C08DF9F0 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+               3AB62BFF806112585B54DDA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs1.cpp; path = ../../Source/Demos/DemoPIPs1.cpp; sourceTree = "SOURCE_ROOT"; };
+               3B99CF94C44E2EE04635A439 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+               3BC9753E0CD75A36DC742EE0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               3E4ED41C374261CFFD309743 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               470C3E4553B513FFEF752779 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               491641F7632BCC81BBA0ED85 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               49ECA8B998B339A083674A22 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+               4DF215D350FFE5E119CBA7E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_box2d.cpp"; path = "../../JuceLibraryCode/include_juce_box2d.cpp"; sourceTree = "SOURCE_ROOT"; };
+               4E9AD0EAF3CA57B548622D9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               4EC2782DE1779A130835B64D = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               4F0A137A4115946A346180E6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               4FE6029FF76BCE9698595DC5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_product_unlocking"; path = "../../../../modules/juce_product_unlocking"; sourceTree = "SOURCE_ROOT"; };
+               5965349393850F41DF76F350 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               5A9F2000C66D24E8B01BE60B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               60F2869DC345EAF2314D6C09 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               61AE09C749B007B70A265D9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               651ECE3C7BA845DDCFEE48F3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+               6847A9B2C5E3C2ED56D8D4E7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               685A261BE78585293F3EAD36 = {isa = PBXFileReference; lastKnownFileType = folder; name = Assets; path = ../../../Assets; sourceTree = "<group>"; };
+               6C198AF93E1F6E682189E2F6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               6C2C1AC86623F457427965EF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_box2d"; path = "../../../../modules/juce_box2d"; sourceTree = "SOURCE_ROOT"; };
+               6C5E26B4D28F8450435B8AE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               72129757D2A553B90A7157C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               76A157A111866670A4678F04 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+               7983C452610C1638B7E78F12 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; };
+               7A5AAE9EE573FC6105CC4AAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = "SOURCE_ROOT"; };
+               8135645508EEFDBDCDF2ADC6 = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DemoRunner/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+               831A01C745C905F5715CD822 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_blocks_basics.cpp"; path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               873F9DD54978E601102353B4 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+               8CE533D611CD0984AD028D73 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               903CD4126C779884797EF915 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               9144821E003E15E4042B57DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+               934ACDCB3FD9D223A3481D8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = "SOURCE_ROOT"; };
+               94B6C88FE30861A47CD28709 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               979F23EA9E5E76131299E886 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               A04E4408525F24F7DCBA000E = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               A1D6D36B96B6B37C31F32829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               A5256778E2EBD206B337B555 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+               A6F555BE0DDF01C285BD8BF5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_dsp"; path = "../../../../modules/juce_dsp"; sourceTree = "SOURCE_ROOT"; };
+               A9315F8368A5771EC39631CB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               B28EFB9D1DF0B6D6499A7DEF = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+               B2BC383CE102EECCF49C7AF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = "SOURCE_ROOT"; };
+               B4389672DA4CC8E0A531062D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+               C1E93FAF6C68A40A664422CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_dsp.mm"; path = "../../JuceLibraryCode/include_juce_dsp.mm"; sourceTree = "SOURCE_ROOT"; };
+               CE38E6469D98462A2C22C915 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+               CFF2BBEB242CC8B3B904B5F9 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               D018D636A4DC9BEA11720129 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_blocks_basics"; path = "../../../../modules/juce_blocks_basics"; sourceTree = "SOURCE_ROOT"; };
+               DC192EFA899E6CBE6B5CD394 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               E061A1C75FA5722167FC4997 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               E0A3F113BC27B7B4D6F1D693 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               E5BFC17E682AB426D203B3E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoContentComponent.cpp; path = ../../Source/UI/DemoContentComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+               E67AB94002886AF67437D6AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               EB68BD1224CD9748BFA332C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/UI/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+               ECE79F1433E92BB6213C86F5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+               EDDA01B246C6128CAF7A2914 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               EE6BDC78B539D27E65E92265 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JUCEDemos.h; path = ../../Source/Demos/JUCEDemos.h; sourceTree = "SOURCE_ROOT"; };
+               F5F2EA2238973488632FC322 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               F90C8B0233A54F1445343F67 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+               FB1FC613CE260140F1CFD21B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               FCD0D758C5767944BEC29730 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               FDC3CA8D1403C169659F7D8C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               CD575607FAA297480EE95F13 = {isa = PBXGroup; children = (
+                                       3AB62BFF806112585B54DDA3,
+                                       061AECBF1CC7056F4155812D,
+                                       B2BC383CE102EECCF49C7AF7,
+                                       934ACDCB3FD9D223A3481D8F,
+                                       EE6BDC78B539D27E65E92265, ); name = Demos; sourceTree = "<group>"; };
+               BB12537403CC24C02622582C = {isa = PBXGroup; children = (
+                                       E5BFC17E682AB426D203B3E6,
+                                       1FCD2145DE3FCFCF4F55A8AD,
+                                       25E5ED33876A2C752378C859,
+                                       EB68BD1224CD9748BFA332C0,
+                                       7A5AAE9EE573FC6105CC4AAC, ); name = UI; sourceTree = "<group>"; };
+               6F933968486D9AD9FE112622 = {isa = PBXGroup; children = (
+                                       CD575607FAA297480EE95F13,
+                                       BB12537403CC24C02622582C,
+                                       260481E972425474BB8155B0,
+                                       ECE79F1433E92BB6213C86F5, ); name = Source; sourceTree = "<group>"; };
+               9683F931FA1B8B85FA8C4BD8 = {isa = PBXGroup; children = (
+                                       6F933968486D9AD9FE112622, ); name = DemoRunner; sourceTree = "<group>"; };
+               5A0B2CEF393A25C6D4B1B76C = {isa = PBXGroup; children = (
+                                       112FFCB73597157E721BCDF2,
+                                       6847A9B2C5E3C2ED56D8D4E7,
+                                       60F2869DC345EAF2314D6C09,
+                                       491641F7632BCC81BBA0ED85,
+                                       346450C70C964FD9640B6086,
+                                       0B36C013D9790568B481634C,
+                                       D018D636A4DC9BEA11720129,
+                                       6C2C1AC86623F457427965EF,
+                                       903CD4126C779884797EF915,
+                                       14CBD28B4887DAF89E27491C,
+                                       FDC3CA8D1403C169659F7D8C,
+                                       A6F555BE0DDF01C285BD8BF5,
+                                       FB1FC613CE260140F1CFD21B,
+                                       8CE533D611CD0984AD028D73,
+                                       5A9F2000C66D24E8B01BE60B,
+                                       A9315F8368A5771EC39631CB,
+                                       6C198AF93E1F6E682189E2F6,
+                                       651ECE3C7BA845DDCFEE48F3,
+                                       4FE6029FF76BCE9698595DC5,
+                                       A5256778E2EBD206B337B555, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               61F3057D838D7DABB0FA3D34 = {isa = PBXGroup; children = (
+                                       72129757D2A553B90A7157C6,
+                                       5965349393850F41DF76F350,
+                                       03B0F9318FD583525AB195A9,
+                                       03A63C3CA6F24977F19C316D,
+                                       E061A1C75FA5722167FC4997,
+                                       E67AB94002886AF67437D6AE,
+                                       EDDA01B246C6128CAF7A2914,
+                                       831A01C745C905F5715CD822,
+                                       4DF215D350FFE5E119CBA7E5,
+                                       3BC9753E0CD75A36DC742EE0,
+                                       6C5E26B4D28F8450435B8AE1,
+                                       F5F2EA2238973488632FC322,
+                                       C1E93FAF6C68A40A664422CD,
+                                       FCD0D758C5767944BEC29730,
+                                       3E4ED41C374261CFFD309743,
+                                       A1D6D36B96B6B37C31F32829,
+                                       979F23EA9E5E76131299E886,
+                                       94B6C88FE30861A47CD28709,
+                                       CE38E6469D98462A2C22C915,
+                                       0AB68DBAB6B7DAEDDDD5B683,
+                                       9144821E003E15E4042B57DB,
+                                       4E9AD0EAF3CA57B548622D9A, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               D87DCD5DA4EC8D78DFF37FCC = {isa = PBXGroup; children = (
+                                       685A261BE78585293F3EAD36,
+                                       4EC2782DE1779A130835B64D,
+                                       8135645508EEFDBDCDF2ADC6,
+                                       E0A3F113BC27B7B4D6F1D693, ); name = Resources; sourceTree = "<group>"; };
+               4452EAA652B65A9AE648288C = {isa = PBXGroup; children = (
+                                       A04E4408525F24F7DCBA000E,
+                                       470C3E4553B513FFEF752779,
+                                       DC192EFA899E6CBE6B5CD394,
+                                       3B99CF94C44E2EE04635A439,
+                                       4F0A137A4115946A346180E6,
+                                       B4389672DA4CC8E0A531062D,
+                                       76A157A111866670A4678F04,
+                                       B28EFB9D1DF0B6D6499A7DEF,
+                                       1CFE3935A3B810D5D68A2504,
+                                       61AE09C749B007B70A265D9B,
+                                       873F9DD54978E601102353B4,
+                                       49ECA8B998B339A083674A22,
+                                       7983C452610C1638B7E78F12,
+                                       24D74AF1C95BEF957DC4FA77,
+                                       34F1320BC5C23702C08DF9F0,
+                                       23CD1A3F9067C3A0ECE7BB67,
+                                       F90C8B0233A54F1445343F67, ); name = Frameworks; sourceTree = "<group>"; };
+               BFDAF16175D03695EEB466BC = {isa = PBXGroup; children = (
+                                       CFF2BBEB242CC8B3B904B5F9, ); name = Products; sourceTree = "<group>"; };
+               91A9A0FE9DF4F4E10009EEC7 = {isa = PBXGroup; children = (
+                                       0CCFDC1D1C7B8A12BF4822F1,
+                                       9683F931FA1B8B85FA8C4BD8,
+                                       5A0B2CEF393A25C6D4B1B76C,
+                                       61F3057D838D7DABB0FA3D34,
+                                       D87DCD5DA4EC8D78DFF37FCC,
+                                       4452EAA652B65A9AE648288C,
+                                       BFDAF16175D03695EEB466BC, ); name = Source; sourceTree = "<group>"; };
+               B18D059E5616FA729F764229 = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_IPHONE_5BC26AE3=1",
-                                       "JUCE_APP_VERSION=5.4.1",
-                                       "JUCE_APP_VERSION_HEX=0x50401",
+                                       "JUCE_APP_VERSION=5.3.2",
+                                       "JUCE_APP_VERSION_HEX=0x50302",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
-                               PRODUCT_NAME = "DemoRunner";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               69330F27DD2C71609336C7D2 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               69330F27DD2C71609336C7D2 = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_IPHONE_5BC26AE3=1",
-                                       "JUCE_APP_VERSION=5.4.1",
-                                       "JUCE_APP_VERSION_HEX=0x50401",
+                                       "JUCE_APP_VERSION=5.3.2",
+                                       "JUCE_APP_VERSION_HEX=0x50302",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
-                               PRODUCT_NAME = "DemoRunner";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               C01EC82F42B640CA1E54AD53 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Release; };
+               C01EC82F42B640CA1E54AD53 = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               07EA85D22270E8EA13CA0BBE = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               07EA85D22270E8EA13CA0BBE = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               D87BAF6D1A7451B7A733B5F1 = {
-                       isa = PBXTargetDependency;
-                       target = 291E01DCBE746A376DBFA4D1;
-               };
-               80E8AD1971F52B06F4D28891 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               C01EC82F42B640CA1E54AD53,
-                               07EA85D22270E8EA13CA0BBE,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               413FBEAEC84DFEC41133C78B = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               B18D059E5616FA729F764229,
-                               69330F27DD2C71609336C7D2,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               57134FDD813875865F5B2057 = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               47ED2C78B05B8A6A00E36C46,
-                               8E63755144E29269FD82C897,
-                               75DB074DBAE04408A0A917B7,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               ED916866997CA4F40C7C1016 = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               E6F58FC3ACAE774DB4D06420,
-                               36E115D98311F12AA06710E6,
-                               B38728296BB32B7994CE28DF,
-                               71DF4F5EB4C8305688416725,
-                               4FBBB55F4E347757F74F1F41,
-                               F619F3887CEC064441BB6EE6,
-                               C2BB2B6DA237FE0CB64C7EDA,
-                               F28112945CEBEA4CE8975833,
-                               9EACEA6BE8D0ACC72C12C080,
-                               26652AB1BB77C8A39434775F,
-                               2707968B431D83AC7E28E49B,
-                               712D81867EC698463252FA79,
-                               49E7BBD46981F0035E4E9021,
-                               611298FAC1A543BDD10D4C41,
-                               D183F8140174ACCDDCD230A2,
-                               FF87532E62753EDFA3D29CAD,
-                               2F76CA28C8C0EFC7453D0EB8,
-                               6B5560283DEEBD6DD2D6C984,
-                               1DBDFEDE359CFC84F8E3DE4C,
-                               CDABEA6258EC70C65C9ACCFE,
-                               E2F44A968EC2598DAE33A997,
-                               5CB78489F16E82144914972D,
-                               BC6036F22423CA0AFF0385A7,
-                               AEA090DAC5C747C50C7D3FA7,
-                               CDEB6BA5341494AF51D07C72,
-                               0140787C0118A95E37DE90B4,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               4B1F6E32C9FC8D779B21C1AF = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               48CF0B02E1D06E5DA51E6270,
-                               163B0CF2DD0990A63DF1D5A6,
-                               7B4163348896EB1B86B15160,
-                               8C0AEA08A71075A6C765AEC9,
-                               1351A13E78F38741C6075600,
-                               527DA2E6827BAFDDD3E8E80F,
-                               34A4931AF1DD424D3A400EEF,
-                               7F57DB52C3CEFDC26DDD38FC,
-                               46071CE2B98B562B7BF27CB1,
-                               6A61CBB4E39BFD392D97528F,
-                               0B0CE6D5062E5C02A41F24BC,
-                               5E4310B3F6BB639875D3E9B8,
-                               AE7FB2AC3885F4BF53A5DDA1,
-                               1FB200F4AE3E4E7CDFF629BB,
-                               AC783ECD84496E0B77911EEE,
-                               B1981F62F6A91FD2F579A198,
-                               ECA44A41DA8A935178C1A1F4,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               291E01DCBE746A376DBFA4D1 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = 413FBEAEC84DFEC41133C78B;
-                       buildPhases = (
-                               57134FDD813875865F5B2057,
-                               ED916866997CA4F40C7C1016,
-                               4B1F6E32C9FC8D779B21C1AF,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "DemoRunner - App";
-                       productName = DemoRunner;
-                       productReference = CFF2BBEB242CC8B3B904B5F9;
-                       productType = "com.apple.product-type.application";
-               };
-               AC6F0E9A0809A184B2C2B7DE = {
-                       isa = PBXProject;
-                       buildConfigurationList = 80E8AD1971F52B06F4D28891;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.iCloud = { enabled = 1; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 91A9A0FE9DF4F4E10009EEC7;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (291E01DCBE746A376DBFA4D1);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               D87BAF6D1A7451B7A733B5F1 = {isa = PBXTargetDependency; target = 291E01DCBE746A376DBFA4D1; };
+               80E8AD1971F52B06F4D28891 = {isa = XCConfigurationList; buildConfigurations = (
+                                       C01EC82F42B640CA1E54AD53,
+                                       07EA85D22270E8EA13CA0BBE, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               413FBEAEC84DFEC41133C78B = {isa = XCConfigurationList; buildConfigurations = (
+                                       B18D059E5616FA729F764229,
+                                       69330F27DD2C71609336C7D2, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               57134FDD813875865F5B2057 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       47ED2C78B05B8A6A00E36C46,
+                                       8E63755144E29269FD82C897,
+                                       75DB074DBAE04408A0A917B7, ); runOnlyForDeploymentPostprocessing = 0; };
+               ED916866997CA4F40C7C1016 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       E6F58FC3ACAE774DB4D06420,
+                                       36E115D98311F12AA06710E6,
+                                       B38728296BB32B7994CE28DF,
+                                       71DF4F5EB4C8305688416725,
+                                       4FBBB55F4E347757F74F1F41,
+                                       F619F3887CEC064441BB6EE6,
+                                       C2BB2B6DA237FE0CB64C7EDA,
+                                       F28112945CEBEA4CE8975833,
+                                       9EACEA6BE8D0ACC72C12C080,
+                                       26652AB1BB77C8A39434775F,
+                                       2707968B431D83AC7E28E49B,
+                                       712D81867EC698463252FA79,
+                                       49E7BBD46981F0035E4E9021,
+                                       611298FAC1A543BDD10D4C41,
+                                       D183F8140174ACCDDCD230A2,
+                                       FF87532E62753EDFA3D29CAD,
+                                       2F76CA28C8C0EFC7453D0EB8,
+                                       6B5560283DEEBD6DD2D6C984,
+                                       1DBDFEDE359CFC84F8E3DE4C,
+                                       CDABEA6258EC70C65C9ACCFE,
+                                       E2F44A968EC2598DAE33A997,
+                                       5CB78489F16E82144914972D,
+                                       BC6036F22423CA0AFF0385A7,
+                                       AEA090DAC5C747C50C7D3FA7,
+                                       CDEB6BA5341494AF51D07C72,
+                                       0140787C0118A95E37DE90B4, ); runOnlyForDeploymentPostprocessing = 0; };
+               4B1F6E32C9FC8D779B21C1AF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       48CF0B02E1D06E5DA51E6270,
+                                       163B0CF2DD0990A63DF1D5A6,
+                                       7B4163348896EB1B86B15160,
+                                       8C0AEA08A71075A6C765AEC9,
+                                       1351A13E78F38741C6075600,
+                                       527DA2E6827BAFDDD3E8E80F,
+                                       34A4931AF1DD424D3A400EEF,
+                                       7F57DB52C3CEFDC26DDD38FC,
+                                       46071CE2B98B562B7BF27CB1,
+                                       6A61CBB4E39BFD392D97528F,
+                                       0B0CE6D5062E5C02A41F24BC,
+                                       5E4310B3F6BB639875D3E9B8,
+                                       AE7FB2AC3885F4BF53A5DDA1,
+                                       1FB200F4AE3E4E7CDFF629BB,
+                                       AC783ECD84496E0B77911EEE,
+                                       B1981F62F6A91FD2F579A198,
+                                       ECA44A41DA8A935178C1A1F4, ); runOnlyForDeploymentPostprocessing = 0; };
+               291E01DCBE746A376DBFA4D1 = {isa = PBXNativeTarget; buildConfigurationList = 413FBEAEC84DFEC41133C78B; buildPhases = (
+                                       57134FDD813875865F5B2057,
+                                       ED916866997CA4F40C7C1016,
+                                       4B1F6E32C9FC8D779B21C1AF, ); buildRules = ( ); dependencies = (  ); name = "DemoRunner - App"; productName = DemoRunner; productReference = CFF2BBEB242CC8B3B904B5F9; productType = "com.apple.product-type.application"; };
+               AC6F0E9A0809A184B2C2B7DE = {isa = PBXProject; buildConfigurationList = 80E8AD1971F52B06F4D28891; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.iCloud = { enabled = 1; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 91A9A0FE9DF4F4E10009EEC7; projectDirPath = ""; projectRoot = ""; targets = (291E01DCBE746A376DBFA4D1); };
        };
        rootObject = AC6F0E9A0809A184B2C2B7DE;
 }
index 89280a4c4cc7159ee0842e982f3d1d430a2f2dde..72a50cf55781c0cabeaef5053cb37b57c03e852a 100644 (file)
@@ -3,12 +3,12 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
 <plist>\r
   <dict>\r
-    <key>NSMicrophoneUsageDescription</key>\r
-    <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
-    <key>NSCameraUsageDescription</key>\r
-    <string>This app requires access to the camera to function correctly.</string>\r
     <key>LSRequiresIPhoneOS</key>\r
     <true/>\r
+    <key>NSMicrophoneUsageDescription</key>\r
+    <string>This is an audio app which requires audio input. If you do not have a USB audio interface connected it will use the microphone.</string>\r
+    <key>NSCameraUsageDescription</key>\r
+    <string>This app requires camera usage to function properly.</string>\r
     <key>UIViewControllerBasedStatusBarAppearance</key>\r
     <false/>\r
     <key>CFBundleExecutable</key>\r
@@ -24,9 +24,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>5.4.1</string>\r
+    <string>5.3.2</string>\r
     <key>CFBundleVersion</key>\r
-    <string>5.4.1</string>\r
+    <string>5.3.2</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2018 - ROLI Ltd.</string>\r
     <key>NSHighResolutionCapable</key>\r
index e014c34e964b1aa84f931f1b6f1d5347db425405..f4729cd8ce2f7c23a9be98088b70ef434bcaadea 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
-<JUCERPROJECT name="DemoRunner" projectType="guiapp" jucerVersion="5.4.1" defines="JUCE_DEMO_RUNNER=1&#10;JUCE_UNIT_TESTS=1"\r
-              bundleIdentifier="com.juce.demorunner" version="5.4.1" companyName="ROLI Ltd."\r
+<JUCERPROJECT name="DemoRunner" projectType="guiapp" jucerVersion="5.3.1" defines="JUCE_DEMO_RUNNER=1&#10;JUCE_UNIT_TESTS=1"\r
+              bundleIdentifier="com.juce.demorunner" version="5.3.2" companyName="ROLI Ltd."\r
               companyCopyright="Copyright (c) 2018 - ROLI Ltd." companyWebsite="https://www.juce.com/"\r
               companyEmail="info@juce.com" id="yj7xMM" reportAppUsage="1">\r
   <MAINGROUP id="G8kbr7" name="DemoRunner">\r
@@ -30,9 +30,8 @@
   </MAINGROUP>\r
   <EXPORTFORMATS>\r
     <XCODE_MAC targetFolder="Builds/MacOSX" smallIcon="YyqWd2" bigIcon="YyqWd2"\r
-               extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
-               customXcodeResourceFolders="../Audio &#10;../BLOCKS &#10;../DSP &#10;../GUI &#10;../Utilities"\r
-               microphonePermissionNeeded="1" cameraPermissionNeeded="1">\r
+               extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
+               customXcodeResourceFolders="../Audio &#10;../BLOCKS &#10;../DSP &#10;../GUI &#10;../Utilities">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION isDebug="1" name="Debug"/>\r
         <CONFIGURATION isDebug="0" name="Release"/>\r
                    androidMinimumSDK="23" microphonePermissionNeeded="1" androidBluetoothNeeded="1"\r
                    androidExternalReadNeeded="1" androidExternalWriteNeeded="1"\r
                    androidEnableContentSharing="1" androidExtraAssetsFolder="../Assets"\r
-                   smallIcon="YyqWd2" bigIcon="YyqWd2" cameraPermissionNeeded="1"\r
-                   extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code">\r
+                   smallIcon="YyqWd2" bigIcon="YyqWd2" cameraPermissionNeeded="1">\r
       <CONFIGURATIONS>\r
-        <CONFIGURATION isDebug="1" name="Debug" androidArchitectures="armeabi-v7a x86"/>\r
+        <CONFIGURATION isDebug="1" name="Debug" androidArchitectures="armeabi x86"/>\r
         <CONFIGURATION isDebug="0" name="Release"/>\r
       </CONFIGURATIONS>\r
       <MODULEPATHS>\r
         <MODULEPATH id="juce_analytics" path="../../modules"/>\r
       </MODULEPATHS>\r
     </VS2015>\r
-    <VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="YyqWd2" bigIcon="YyqWd2"\r
-            extraCompilerFlags="/w44265 /w45038 /w44062">\r
+    <VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="YyqWd2" bigIcon="YyqWd2">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION isDebug="1" name="Debug"/>\r
         <CONFIGURATION isDebug="0" name="Release" useRuntimeLibDLL="0"/>\r
             useGlobalPath="0"/>\r
     <MODULE id="juce_video" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
   </MODULES>\r
-  <JUCEOPTIONS JUCE_USE_CAMERA="1" JUCE_USE_MP3AUDIOFORMAT="1" JUCE_ALLOW_STATIC_NULL_VARIABLES="0"\r
-               JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+  <JUCEOPTIONS JUCE_USE_CAMERA="1" JUCE_USE_MP3AUDIOFORMAT="1"/>\r
   <LIVE_SETTINGS>\r
     <OSX/>\r
   </LIVE_SETTINGS>\r
index 295046259d557760a690242652f57fcffc73ca46..de08905c2f334d4fc9d47bff59262595c1a6ef99 100644 (file)
 //==============================================================================\r
 // juce_audio_devices flags:\r
 \r
-#ifndef    JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 #ifndef    JUCE_ASIO\r
  //#define JUCE_ASIO 0\r
 #endif\r
  //#define JUCE_USE_ANDROID_OPENSLES 0\r
 #endif\r
 \r
+#ifndef    JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 #ifndef    JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
  //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
 #endif\r
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
 \r
 #ifndef    JUCE_ALLOW_STATIC_NULL_VARIABLES\r
- #define   JUCE_ALLOW_STATIC_NULL_VARIABLES 0\r
-#endif\r
-\r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define   JUCE_STRICT_REFCOUNTEDPOINTER 1\r
+ //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
 //==============================================================================\r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_USE_CAMERA\r
  #define   JUCE_USE_CAMERA 1\r
 #endif\r
-\r
-#ifndef    JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index f7084709893a5cb4920d3546793776596947c812..e3f1c698feec644a795867f429d872ff3bc68a52 100644 (file)
@@ -46,8 +46,7 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "DemoRunner";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
-    const char* const  versionString  = "5.4.1";\r
-    const int          versionNumber  = 0x50401;\r
+    const char* const  versionString  = "5.3.2";\r
+    const int          versionNumber  = 0x50302;\r
 }\r
 #endif\r
index 51074e13017bbb4e604a3aceee3587e5d062322f..98ed93834ea24f5ae57aef783567989aa9f043ae 100644 (file)
@@ -61,7 +61,7 @@
  #include "../../../GUI/OpenGLDemo2D.h"\r
 #endif\r
 #include "../../../GUI/PropertiesDemo.h"\r
-#if ! JUCE_LINUX\r
+#if JUCE_MAC || JUCE_WINDOWS\r
  #include "../../../GUI/VideoDemo.h"\r
 #endif\r
 #include "../../../GUI/WebBrowserDemo.h"\r
@@ -100,7 +100,7 @@ void registerDemos_Two() noexcept
     REGISTER_DEMO_WITH_FILENAME (OpenGLDemoClasses::OpenGLDemo, GUI, OpenGLDemo, true)\r
    #endif\r
     REGISTER_DEMO (PropertiesDemo,            GUI,       false)\r
-   #if ! JUCE_LINUX\r
+   #if JUCE_MAC || JUCE_WINDOWS\r
     REGISTER_DEMO (VideoDemo,                 GUI,       true)\r
    #endif\r
     REGISTER_DEMO (WebBrowserDemo,            GUI,       true)\r
index e60922167096bc56e2ecc826be49024a2b94912a..08a01f47bbd90f3cd27168cc00a30e08ed4d71e7 100644 (file)
@@ -53,7 +53,7 @@ void JUCEDemos::registerDemo (std::function<Component*()> constructorCallback, c
 {\r
    #if JUCE_MAC\r
     auto f = File::getSpecialLocation (File::currentExecutableFile)\r
-                  .getParentDirectory().getParentDirectory().getChildFile ("Resources");\r
+                  .getParentDirectory().getParentDirectory().getChildFile ("Resources").getChildFile (filePath);\r
    #else\r
     auto f = findExamplesDirectoryFromExecutable (File::getSpecialLocation (File::currentApplicationFile));\r
    #endif\r
@@ -85,6 +85,8 @@ File JUCEDemos::findExamplesDirectoryFromExecutable (File exec)
 }\r
 \r
 //==============================================================================\r
+std::unique_ptr<AudioDeviceManager> sharedAudioDeviceManager;\r
+\r
 static String getCurrentDefaultAudioDeviceName (AudioDeviceManager& deviceManager, bool isInput)\r
 {\r
     auto* deviceType = deviceManager.getCurrentDeviceTypeObject();\r
@@ -127,7 +129,8 @@ AudioDeviceManager& getSharedAudioDeviceManager (int numInputChannels, int numOu
 \r
     if (sharedAudioDeviceManager->getCurrentAudioDevice() != nullptr)\r
     {\r
-        auto setup = sharedAudioDeviceManager->getAudioDeviceSetup();\r
+        AudioDeviceManager::AudioDeviceSetup setup;\r
+        sharedAudioDeviceManager->getAudioDeviceSetup (setup);\r
 \r
         auto numInputs  = jmax (numInputChannels,  setup.inputChannels.countNumberOfSetBits());\r
         auto numOutputs = jmax (numOutputChannels, setup.outputChannels.countNumberOfSetBits());\r
index 4d8a120e2be5cdd6bb11336c1f1c1d1bbce8dec1..ad770d7e00464956cb7884a288bb5f60adb83f50 100644 (file)
@@ -73,8 +73,6 @@
  };\r
 #endif\r
 \r
-std::unique_ptr<AudioDeviceManager> sharedAudioDeviceManager;\r
-\r
 //==============================================================================\r
 class DemoRunnerApplication  : public JUCEApplication\r
 {\r
@@ -82,11 +80,6 @@ public:
     //==============================================================================\r
     DemoRunnerApplication() {}\r
 \r
-    ~DemoRunnerApplication()\r
-    {\r
-        sharedAudioDeviceManager.reset();\r
-    }\r
-\r
     const String getApplicationName() override       { return ProjectInfo::projectName; }\r
     const String getApplicationVersion() override    { return ProjectInfo::versionString; }\r
     bool moreThanOneInstanceAllowed() override       { return true; }\r
index 32244a2e00dd7e954f5f34f6861cc4ab5190dbf8..a87daa9c13c213db3fc1a51075f6386a01ec6231 100644 (file)
@@ -306,6 +306,7 @@ MainComponent::MainComponent()
 MainComponent::~MainComponent()\r
 {\r
     contentComponent->clearCurrentDemo();\r
+    sharedAudioDeviceManager.reset();\r
 }\r
 \r
 //==============================================================================\r
index 5217a9bc4dbe3f3604c2c3fa4366a0c5d7183125..bb93d765568f96f82221c1258d91f49b68cbccac 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AnimationAppDemo\r
 \r
index 337d1905e2a90eecff8ad6545133947b02f7839f..8aa97a0790f46339c32492f2a00f1dc18eecdff5 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AnimationDemo\r
 \r
index 9c553019bfdea2e85545864af56eb60c54ab2f69..dea790500ecc0a1a02753f1c8197df6d6eb06380 100644 (file)
@@ -35,8 +35,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        BouncingBallWavetableDemo\r
 \r
index dab3911fe33e7903498a7625617ab635f7aec802..6c1ef6096496aebc91a9febf7d70b70e10633927 100644 (file)
  website:          http://juce.com\r
  description:      Showcases camera features.\r
 \r
- dependencies:     juce_audio_basics, juce_audio_devices, juce_core, juce_cryptography,\r
-                   juce_data_structures, juce_events, juce_graphics, juce_gui_basics,\r
-                   juce_gui_extra, juce_video\r
+ dependencies:     juce_core, juce_cryptography, juce_data_structures, juce_events,\r
+                   juce_graphics, juce_gui_basics, juce_gui_extra, juce_video\r
  exporters:        xcode_mac, vs2017, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_USE_CAMERA=1, JUCE_STRICT_REFCOUNTEDPOINTER=1\r
+ moduleFlags:      JUCE_USE_CAMERA=1\r
 \r
  type:             Component\r
  mainClass:        CameraDemo\r
@@ -245,7 +244,7 @@ private:
         {\r
            #if JUCE_ANDROID\r
             SafePointer<CameraDemo> safeThis (this);\r
-            cameraDevice->onErrorOccurred = [safeThis] (const String& cameraError) mutable { if (safeThis) safeThis->errorOccurred (cameraError); };\r
+            cameraDevice->onErrorOccurred = [safeThis] (const String& error) mutable { if (safeThis) safeThis->errorOccurred (error); };\r
            #endif\r
             cameraPreviewComp.reset (cameraDevice->createViewerComponent());\r
             addAndMakeVisible (cameraPreviewComp.get());\r
@@ -340,25 +339,25 @@ private:
        #if JUCE_ANDROID || JUCE_IOS\r
         auto imageFile = File::getSpecialLocation (File::tempDirectory).getNonexistentChildFile ("JuceCameraPhotoDemo", ".jpg");\r
 \r
-        FileOutputStream stream (imageFile);\r
-\r
-        if (stream.openedOk()\r
-             && JPEGImageFormat().writeImageToStream (image, stream))\r
+        if (auto stream = std::unique_ptr<OutputStream> (imageFile.createOutputStream()))\r
         {\r
-            URL url (imageFile);\r
+            if (JPEGImageFormat().writeImageToStream (image, *stream))\r
+            {\r
+                URL url (imageFile);\r
 \r
-            snapshotButton   .setEnabled (false);\r
-            recordMovieButton.setEnabled (false);\r
-            contentSharingPending = true;\r
+                snapshotButton   .setEnabled (false);\r
+                recordMovieButton.setEnabled (false);\r
+                contentSharingPending = true;\r
 \r
-            SafePointer<CameraDemo> safeThis (this);\r
+                SafePointer<CameraDemo> safeThis (this);\r
 \r
-            juce::ContentSharer::getInstance()->shareFiles ({url},\r
-                                                            [safeThis] (bool success, const String&) mutable\r
-                                                            {\r
-                                                                if (safeThis)\r
-                                                                    safeThis->sharingFinished (success, true);\r
-                                                            });\r
+                juce::ContentSharer::getInstance()->shareFiles ({url},\r
+                                                                [safeThis] (bool success, const String&) mutable\r
+                                                                {\r
+                                                                    if (safeThis)\r
+                                                                        safeThis->sharingFinished (success, true);\r
+                                                                });\r
+            }\r
         }\r
        #endif\r
     }\r
index 3ecc11a7ecf4409940fd42adda00c6e07348f805..239938606cc97b0fd934e5487402c3842ad18dd0 100644 (file)
@@ -31,9 +31,7 @@
 \r
  dependencies:     juce_core, juce_data_structures, juce_events, juce_graphics,\r
                    juce_gui_basics, juce_gui_extra\r
- exporters:        xcode_mac, vs2017, linux_make, xcode_iphone\r
-\r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
+ exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
  type:             Component\r
  mainClass:        CodeEditorDemo\r
 \r
 #include "../Assets/DemoUtilities.h"\r
 \r
-#if JUCE_ANDROID\r
- #error "This demo is not supported on Android!"\r
-#endif\r
-\r
 //==============================================================================\r
 class CodeEditorDemo  : public Component,\r
                         private FilenameComponentListener\r
index 86eae90e85107099ed46ce3a9ad0b90792d70e94..7944d2bee42580e8d9b362e43c3865c2576d7841 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        ComponentDemo\r
 \r
@@ -92,7 +90,7 @@ public:
         // Adds the child light components and makes them visible\r
         // within this component.\r
         // (they currently rely on having a default constructor\r
-        // so they don't have to be individually initialised)\r
+        // so they dont have to be individually initialised)\r
         for (auto i = 0; i < numX * numY; ++i)\r
             addAndMakeVisible (toggleLights[i]);\r
     }\r
index 327cab77e6f97f23f7b744242ba36d8bcf2591b8..f038de79ea3e80edc8587af5658c6778707cb9b7 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        ComponentTransformsDemo\r
 \r
index a6b1178bfecccf636598a35336d64d1a05d25d2f..1c27591f2726545255391e3a61b08a18f0ef0e8b 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        DialogsDemo\r
 \r
@@ -161,18 +159,6 @@ public:
         }\r
 \r
         setSize (500, 500);\r
-\r
-        RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
-                                     [] (bool granted)\r
-                                     {\r
-                                         if (! granted)\r
-                                         {\r
-                                             AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
-                                                                               "Permissions warning",\r
-                                                                               "External storage access permission not granted, some files"\r
-                                                                               " may be inaccessible.");\r
-                                         }\r
-                                     });\r
     }\r
 \r
     //==============================================================================\r
@@ -235,8 +221,7 @@ private:
         {\r
             AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon, "This is an ok/cancel AlertWindow",\r
                                           "And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.",\r
-                                          {}, {}, {},\r
-                                          ModalCallbackFunction::forComponent (alertBoxResultChosen, this));\r
+                                          {}, {}, 0, ModalCallbackFunction::forComponent (alertBoxResultChosen, this));\r
         }\r
         else if (type == calloutBoxWindow)\r
         {\r
@@ -336,11 +321,9 @@ private:
                     fileToSave = fileToSave.getChildFile ("JUCE.png");\r
                     fileToSave.deleteFile();\r
 \r
-                    FileOutputStream outStream (fileToSave);\r
-\r
-                    if (outStream.openedOk())\r
-                        if (auto inStream = std::unique_ptr<InputStream> (createAssetInputStream ("juce_icon.png")))\r
-                            outStream.writeFromInputStream (*inStream, -1);\r
+                    std::unique_ptr<OutputStream> outStream (fileToSave.createOutputStream());\r
+                    std::unique_ptr<InputStream> inStream (createAssetInputStream ("juce_icon.png"));\r
+                    outStream->writeFromInputStream (*inStream, -1);\r
                 }\r
 \r
                 fc.reset (new FileChooser ("Choose a file to save...",\r
index e10084963a46f6335043d15537b52baa2c701768..8c4bafcc4d9050264881302d25fee9c35913c702 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        FlexBoxDemo\r
 \r
index 61f94a8021b30a8ade0aa01bdce4eb9a61932cad..ab90926716998ac2850728ac67c4c360bdb52420 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        FontsDemo\r
 \r
@@ -108,7 +106,7 @@ public:
         verticalDividerBar.reset (new StretchableLayoutResizerBar (&verticalLayout, 1, true));\r
         addAndMakeVisible (verticalDividerBar.get());\r
 \r
-        // ..and pick a random font to select initially\r
+        // ..and pick a random font to select intially\r
         listBox.selectRow (Random::getSystemRandom().nextInt (fonts.size()));\r
 \r
         demoTextBox.setMultiLine (true);\r
index d2a98aa60882f96f05e3c83a44d669d5ab1d642d..a5403242a6b7947851dc09e9946391ca2f2f9d21 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        GraphicsDemo\r
 \r
index 00fb21259c5932de4166f9d672b1a38e4afb7e67..8b6a9f7eabcb2759d7708f614a71b72fa4b3eab5 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        GridDemo\r
 \r
index 3b7dfb031dabaef9c015d3e3f3533a5247fbbba3..39886227de9152c69de0a1851ab3e9ccb595e5d5 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        HelloWorldDemo\r
 \r
index 0cbedac883b6f9ca4308a24bf011adb10ec5b643..707e8a2ae00a65306a83a1b3079d2bb03d932043 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        ImagesDemo\r
 \r
index 9fae26fd6e84828570e44baf6bd59fb8922c5fc5..b2a786f0c0027c79195efc173f62338a695c01e7 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        KeyMappingsDemo\r
 \r
index 29205c1613a1509b09841040e3504c41d7866081..752a242e434c608af436186ae06860e2d1386a37 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        LookAndFeelDemo\r
 \r
index 5c0edbce55f12aced528fd182497e6420bb68026..35dd02f4280cfe573b6da1e3cdc31fe293f7b64f 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        MDIDemo\r
 \r
index 1300fc28af49c8d94db3a906fae0ff7d7ee3bd09..35bc07429d9f67bfb0ee57b8cc9cba73cfd5b520 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        MenusDemo\r
 \r
index 40441dd792904f0f9e79048d4135c908e3fe5554..b6a5ecc1563e210a9c5b56cba277300949bf9d91 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        MultiTouchDemo\r
 \r
index e9aa5127c1bace646f954cf847be928aeaec67c6..10cc2a89982b1dc5c7e101e832553e008d310788 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra, juce_opengl\r
  exporters:        xcode_mac, vs2017, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        OpenGLAppDemo\r
 \r
@@ -236,7 +234,7 @@ private:
         {\r
             if (position.get() != nullptr)\r
             {\r
-                glContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), nullptr);\r
+                glContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), 0);\r
                 glContext.extensions.glEnableVertexAttribArray (position->attributeID);\r
             }\r
 \r
@@ -325,7 +323,7 @@ private:
                 vertexBuffer->bind();\r
 \r
                 glAttributes.enable (glContext);\r
-                glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, nullptr);\r
+                glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, 0);\r
                 glAttributes.disable (glContext);\r
             }\r
         }\r
index d8f3bf585508c188f3414b478e7544eb37365cf0..9c6a87dac500fa299da097e9a2d0ce1c09f36972 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra, juce_opengl\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        OpenGLDemoClasses::OpenGLDemo\r
 \r
@@ -81,7 +79,7 @@ struct OpenGLDemoClasses
         {\r
             if (position.get() != nullptr)\r
             {\r
-                openGLContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), nullptr);\r
+                openGLContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), 0);\r
                 openGLContext.extensions.glEnableVertexAttribArray (position->attributeID);\r
             }\r
 \r
@@ -173,7 +171,7 @@ struct OpenGLDemoClasses
                 vertexBuffer->bind();\r
 \r
                 attributes.enable (openGLContext);\r
-                glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, nullptr);\r
+                glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, 0);\r
                 attributes.disable (openGLContext);\r
             }\r
         }\r
@@ -282,11 +280,6 @@ struct OpenGLDemoClasses
 \r
                 g.setColour (Colours::black);\r
                 g.setFont (40);\r
-\r
-                const MessageManagerLock mml (ThreadPoolJob::getCurrentThreadPoolJob());\r
-                if (! mml.lockWasGained())\r
-                    return false;\r
-\r
                 g.drawFittedText (String (Time::getCurrentTime().getMilliseconds()), image.getBounds(), Justification::centred, 1);\r
             }\r
 \r
index cdfd3acda57db4ebe5ce4b003a910c22514e1715..6452ecb6508d8d674c4bc0a3f9662dce60a3e6da 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra, juce_opengl\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        OpenGLDemo2D\r
 \r
index 439887d0723392a5c495219a71be54d7efd6a0de..0172886484d115a311f7539a8c38dbd2c215766d 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        PropertiesDemo\r
 \r
index d091e0ca2b159990b6de62211264ec80e93795ac..a05e4c9c84c8a551bfe47fd1ca0c78856b655b1f 100644 (file)
@@ -31,9 +31,7 @@
 \r
  dependencies:     juce_core, juce_data_structures, juce_events, juce_graphics,\r
                    juce_gui_basics, juce_gui_extra, juce_video\r
- exporters:        xcode_mac, vs2017, androidstudio, xcode_iphone\r
-\r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
+ exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
  type:             Component\r
  mainClass:        VideoDemo\r
@@ -48,7 +46,6 @@
 \r
 #include "../Assets/DemoUtilities.h"\r
 \r
-#if JUCE_MAC || JUCE_WINDOWS\r
 //==============================================================================\r
 // so that we can easily have two video windows each with a file browser, wrap this up as a class..\r
 class MovieComponentWithFileBrowser  : public Component,\r
@@ -57,7 +54,6 @@ class MovieComponentWithFileBrowser  : public Component,
 {\r
 public:\r
     MovieComponentWithFileBrowser()\r
-        : videoComp (true)\r
     {\r
         addAndMakeVisible (videoComp);\r
 \r
@@ -114,16 +110,8 @@ private:
 \r
     void filenameComponentChanged (FilenameComponent*) override\r
     {\r
-        auto url = URL (fileChooser.getCurrentFile());\r
-\r
         // this is called when the user changes the filename in the file chooser box\r
-        auto result = videoComp.load (url);\r
-        videoLoadingFinished (url, result);\r
-    }\r
-\r
-    void videoLoadingFinished (const URL& url, Result result)\r
-    {\r
-        ignoreUnused (url);\r
+        auto result = videoComp.load (fileChooser.getCurrentFile());\r
 \r
         if (result.wasOk())\r
         {\r
@@ -221,7 +209,6 @@ public:
     }\r
 \r
 private:\r
-    std::unique_ptr<FileChooser> fileChooser;\r
     WildcardFileFilter moviesWildcardFilter  { "*", "*", "Movies File Filter" };\r
     TimeSliceThread directoryThread          { "Movie File Scanner Thread" };\r
     DirectoryContentsList movieList          { &moviesWildcardFilter, directoryThread };\r
@@ -244,464 +231,5 @@ private:
     void fileDoubleClicked (const File&)              override {}\r
     void browserRootChanged (const File&)             override {}\r
 \r
-    void selectVideoFile()\r
-    {\r
-        fileChooser.reset (new FileChooser ("Choose a file to open...", File::getCurrentWorkingDirectory(),\r
-                                            "*", false));\r
-\r
-        fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
-                                  [this] (const FileChooser& chooser)\r
-                                  {\r
-                                      String chosen;\r
-                                      auto results = chooser.getURLResults();\r
-\r
-                                      // TODO: support non local files too\r
-                                      if (results.size() > 0)\r
-                                          movieCompLeft.setFile (results[0].getLocalFile());\r
-                                  });\r
-    }\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VideoDemo)\r
 };\r
-#elif JUCE_IOS || JUCE_ANDROID\r
-//==============================================================================\r
-class VideoDemo   : public Component,\r
-                    private Timer\r
-{\r
-public:\r
-    VideoDemo()\r
-        : videoCompWithNativeControls (true),\r
-          videoCompNoNativeControls (false)\r
-    {\r
-        loadLocalButton  .onClick = [this] { selectVideoFile(); };\r
-        loadUrlButton    .onClick = [this] { showVideoUrlPrompt(); };\r
-        seekToStartButton.onClick = [this] { seekVideoToStart(); };\r
-        playButton       .onClick = [this] { playVideo(); };\r
-        pauseButton      .onClick = [this] { pauseVideo(); };\r
-        unloadButton     .onClick = [this] { unloadVideoFile(); };\r
-\r
-        volumeLabel         .setColour (Label::textColourId, Colours::white);\r
-        currentPositionLabel.setColour (Label::textColourId, Colours::white);\r
-\r
-        volumeLabel         .setJustificationType (Justification::right);\r
-        currentPositionLabel.setJustificationType (Justification::right);\r
-\r
-        volumeSlider  .setRange (0.0, 1.0);\r
-        positionSlider.setRange (0.0, 1.0);\r
-\r
-        volumeSlider  .setSliderSnapsToMousePosition (false);\r
-        positionSlider.setSliderSnapsToMousePosition (false);\r
-\r
-        volumeSlider.setSkewFactor (1.5);\r
-        volumeSlider.setValue (1.0, dontSendNotification);\r
-       #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-        curVideoComp->onGlobalMediaVolumeChanged = [this]() { volumeSlider.setValue (curVideoComp->getAudioVolume(), dontSendNotification); };\r
-       #endif\r
-\r
-        volumeSlider  .onValueChange = [this]() { curVideoComp->setAudioVolume ((float) volumeSlider.getValue()); };\r
-        positionSlider.onValueChange = [this]() { seekVideoToNormalisedPosition (positionSlider.getValue()); };\r
-\r
-        positionSlider.onDragStart = [this]()\r
-                                     {\r
-                                         positionSliderDragging = true;\r
-                                         wasPlayingBeforeDragStart = curVideoComp->isPlaying();\r
-\r
-                                         if (wasPlayingBeforeDragStart)\r
-                                             curVideoComp->stop();\r
-                                     };\r
-\r
-        positionSlider.onDragEnd   = [this]()\r
-                                     {\r
-                                         if (wasPlayingBeforeDragStart)\r
-                                             curVideoComp->play();\r
-\r
-                                         wasPlayingBeforeDragStart = false;\r
-\r
-                                         // Ensure the slider does not temporarily jump back on consecutive timer callback.\r
-                                         Timer::callAfterDelay (500, [this]() { positionSliderDragging = false; });\r
-                                     };\r
-\r
-        playSpeedComboBox.addItem ("25%", 25);\r
-        playSpeedComboBox.addItem ("50%", 50);\r
-        playSpeedComboBox.addItem ("100%", 100);\r
-        playSpeedComboBox.addItem ("200%", 200);\r
-        playSpeedComboBox.addItem ("400%", 400);\r
-        playSpeedComboBox.setSelectedId (100, dontSendNotification);\r
-        playSpeedComboBox.onChange = [this]() { curVideoComp->setPlaySpeed (playSpeedComboBox.getSelectedId() / 100.0); };\r
-\r
-        setTransportControlsEnabled (false);\r
-\r
-        addAndMakeVisible (loadLocalButton);\r
-        addAndMakeVisible (loadUrlButton);\r
-        addAndMakeVisible (volumeLabel);\r
-        addAndMakeVisible (volumeSlider);\r
-        addChildComponent (videoCompWithNativeControls);\r
-        addChildComponent (videoCompNoNativeControls);\r
-        addAndMakeVisible (positionSlider);\r
-        addAndMakeVisible (currentPositionLabel);\r
-\r
-        addAndMakeVisible (playSpeedComboBox);\r
-        addAndMakeVisible (seekToStartButton);\r
-        addAndMakeVisible (playButton);\r
-        addAndMakeVisible (unloadButton);\r
-        addChildComponent (pauseButton);\r
-\r
-        setSize (500, 500);\r
-\r
-        RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
-                                     [] (bool granted)\r
-                                     {\r
-                                         if (! granted)\r
-                                         {\r
-                                             AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
-                                                                               "Permissions warning",\r
-                                                                               "External storage access permission not granted, some files"\r
-                                                                               " may be inaccessible.");\r
-                                         }\r
-                                     });\r
-\r
-        setPortraitOrientationEnabled (true);\r
-    }\r
-\r
-    ~VideoDemo()\r
-    {\r
-        curVideoComp->onPlaybackStarted = nullptr;\r
-        curVideoComp->onPlaybackStopped = nullptr;\r
-        curVideoComp->onErrorOccurred   = nullptr;\r
-        curVideoComp->onGlobalMediaVolumeChanged = nullptr;\r
-\r
-        setPortraitOrientationEnabled (false);\r
-    }\r
-\r
-    void paint (Graphics& g) override\r
-    {\r
-        g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground));\r
-    }\r
-\r
-    void resized() override\r
-    {\r
-        auto area = getLocalBounds();\r
-\r
-        int marginSize = 5;\r
-        int buttonHeight = 20;\r
-\r
-        area.reduce (0, marginSize);\r
-\r
-        auto topArea = area.removeFromTop (buttonHeight);\r
-        loadLocalButton.setBounds (topArea.removeFromLeft (topArea.getWidth() / 6));\r
-        loadUrlButton.setBounds (topArea.removeFromLeft (loadLocalButton.getWidth()));\r
-        volumeLabel.setBounds (topArea.removeFromLeft (loadLocalButton.getWidth()));\r
-        volumeSlider.setBounds (topArea.reduced (10, 0));\r
-\r
-        auto transportArea = area.removeFromBottom (buttonHeight);\r
-        auto positionArea  = area.removeFromBottom (buttonHeight).reduced (marginSize, 0);\r
-\r
-        playSpeedComboBox.setBounds (transportArea.removeFromLeft (jmax (50, transportArea.getWidth() / 5)));\r
-\r
-        auto controlWidth = transportArea.getWidth() / 3;\r
-\r
-        currentPositionLabel.setBounds (positionArea.removeFromRight (jmax (150, controlWidth)));\r
-        positionSlider.setBounds (positionArea);\r
-\r
-        seekToStartButton.setBounds (transportArea.removeFromLeft (controlWidth));\r
-        playButton       .setBounds (transportArea.removeFromLeft (controlWidth));\r
-        unloadButton     .setBounds (transportArea.removeFromLeft (controlWidth));\r
-        pauseButton.setBounds (playButton.getBounds());\r
-\r
-        area.removeFromTop (marginSize);\r
-        area.removeFromBottom (marginSize);\r
-\r
-        videoCompWithNativeControls.setBounds (area);\r
-        videoCompNoNativeControls.setBounds (area);\r
-\r
-        if (positionSlider.getWidth() > 0)\r
-            positionSlider.setMouseDragSensitivity (positionSlider.getWidth());\r
-    }\r
-\r
-private:\r
-    TextButton loadLocalButton { "Load Local" };\r
-    TextButton loadUrlButton { "Load URL" };\r
-    Label volumeLabel { "volumeLabel", "Vol:" };\r
-    Slider volumeSlider { Slider::LinearHorizontal, Slider::NoTextBox };\r
-\r
-    VideoComponent videoCompWithNativeControls;\r
-    VideoComponent videoCompNoNativeControls;\r
-   #if JUCE_IOS || JUCE_MAC\r
-    VideoComponent* curVideoComp = &videoCompWithNativeControls;\r
-   #else\r
-    VideoComponent* curVideoComp = &videoCompNoNativeControls;\r
-   #endif\r
-    bool isFirstSetup = true;\r
-\r
-    Slider positionSlider { Slider::LinearHorizontal, Slider::NoTextBox };\r
-    bool positionSliderDragging = false;\r
-    bool wasPlayingBeforeDragStart = false;\r
-\r
-    Label currentPositionLabel { "currentPositionLabel", "-:- / -:-" };\r
-\r
-    ComboBox playSpeedComboBox { "playSpeedComboBox" };\r
-    TextButton seekToStartButton { "|<" };\r
-    TextButton playButton { "Play" };\r
-    TextButton pauseButton { "Pause" };\r
-    TextButton unloadButton { "Unload" };\r
-\r
-    std::unique_ptr<FileChooser> fileChooser;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VideoDemo)\r
-    JUCE_DECLARE_WEAK_REFERENCEABLE (VideoDemo)\r
-\r
-    //==============================================================================\r
-    void setPortraitOrientationEnabled (bool shouldBeEnabled)\r
-    {\r
-        auto allowedOrientations = Desktop::getInstance().getOrientationsEnabled();\r
-\r
-        if (shouldBeEnabled)\r
-            allowedOrientations |= Desktop::upright;\r
-        else\r
-            allowedOrientations &= ~Desktop::upright;\r
-\r
-        Desktop::getInstance().setOrientationsEnabled (allowedOrientations);\r
-    }\r
-\r
-    void setTransportControlsEnabled (bool shouldBeEnabled)\r
-    {\r
-        positionSlider   .setEnabled (shouldBeEnabled);\r
-        playSpeedComboBox.setEnabled (shouldBeEnabled);\r
-        seekToStartButton.setEnabled (shouldBeEnabled);\r
-        playButton       .setEnabled (shouldBeEnabled);\r
-        unloadButton     .setEnabled (shouldBeEnabled);\r
-        pauseButton      .setEnabled (shouldBeEnabled);\r
-    }\r
-\r
-    void selectVideoFile()\r
-    {\r
-        fileChooser.reset (new FileChooser ("Choose a video file to open...", File::getCurrentWorkingDirectory(),\r
-                                            "*", true));\r
-\r
-        fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
-                                  [this] (const FileChooser& chooser)\r
-                                  {\r
-                                      auto results = chooser.getURLResults();\r
-\r
-                                      if (results.size() > 0)\r
-                                          loadVideo (results[0]);\r
-                                  });\r
-    }\r
-\r
-    void loadVideo (const URL& url)\r
-    {\r
-        unloadVideoFile();\r
-\r
-       #if JUCE_IOS || JUCE_MAC\r
-        askIfUseNativeControls (url);\r
-       #else\r
-        loadUrl (url);\r
-        setupVideoComp (false);\r
-       #endif\r
-    }\r
-\r
-    void askIfUseNativeControls (const URL& url)\r
-    {\r
-        auto* aw = new AlertWindow ("Choose viewer type", {}, AlertWindow::NoIcon);\r
-\r
-        aw->addButton ("Yes", 1, KeyPress (KeyPress::returnKey));\r
-        aw->addButton ("No", 0, KeyPress (KeyPress::escapeKey));\r
-        aw->addTextBlock ("Do you want to use the viewer with native controls?");\r
-\r
-        auto callback = ModalCallbackFunction::forComponent (videoViewerTypeChosen, this, url);\r
-        aw->enterModalState (true, callback, true);\r
-    }\r
-\r
-    static void videoViewerTypeChosen (int result, VideoDemo* owner, URL url)\r
-    {\r
-        if (owner != nullptr)\r
-        {\r
-            owner->setupVideoComp (result != 0);\r
-            owner->loadUrl (url);\r
-        }\r
-    }\r
-\r
-    void setupVideoComp (bool useNativeViewerWithNativeControls)\r
-    {\r
-        auto* oldVideoComp = curVideoComp;\r
-\r
-        if (useNativeViewerWithNativeControls)\r
-            curVideoComp = &videoCompWithNativeControls;\r
-        else\r
-            curVideoComp = &videoCompNoNativeControls;\r
-\r
-        if (isFirstSetup || oldVideoComp != curVideoComp)\r
-        {\r
-            oldVideoComp->onPlaybackStarted = nullptr;\r
-            oldVideoComp->onPlaybackStopped = nullptr;\r
-            oldVideoComp->onErrorOccurred   = nullptr;\r
-            oldVideoComp->setVisible (false);\r
-\r
-            curVideoComp->onPlaybackStarted = [this]() { processPlaybackStarted(); };\r
-            curVideoComp->onPlaybackStopped = [this]() { processPlaybackPaused(); };\r
-            curVideoComp->onErrorOccurred   = [this](const String& errorMessage) { errorOccurred (errorMessage); };\r
-            curVideoComp->setVisible (true);\r
-\r
-           #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-            oldVideoComp->onGlobalMediaVolumeChanged = nullptr;\r
-            curVideoComp->onGlobalMediaVolumeChanged = [this]() { volumeSlider.setValue (curVideoComp->getAudioVolume(), dontSendNotification); };\r
-           #endif\r
-        }\r
-\r
-        isFirstSetup = false;\r
-    }\r
-\r
-    void loadUrl (const URL& url)\r
-    {\r
-        curVideoComp->loadAsync (url, [this] (const URL& u, Result r) { videoLoadingFinished (u, r); });\r
-    }\r
-\r
-    void showVideoUrlPrompt()\r
-    {\r
-        auto* aw = new AlertWindow ("Enter URL for video to load", {}, AlertWindow::NoIcon);\r
-\r
-        aw->addButton ("OK", 1, KeyPress (KeyPress::returnKey));\r
-        aw->addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey));\r
-        aw->addTextEditor ("videoUrlTextEditor", "https://www.rmp-streaming.com/media/bbb-360p.mp4");\r
-\r
-        auto callback = ModalCallbackFunction::forComponent (videoUrlPromptClosed, this, Component::SafePointer<AlertWindow> (aw));\r
-        aw->enterModalState (true, callback, true);\r
-    }\r
-\r
-    static void videoUrlPromptClosed (int result, VideoDemo* owner, Component::SafePointer<AlertWindow> aw)\r
-    {\r
-        if (result != 0 && owner != nullptr && aw != nullptr)\r
-        {\r
-            auto url = aw->getTextEditorContents ("videoUrlTextEditor");\r
-\r
-            if (url.isNotEmpty())\r
-                owner->loadVideo (url);\r
-        }\r
-    }\r
-\r
-    void videoLoadingFinished (const URL& url, Result result)\r
-    {\r
-        ignoreUnused (url);\r
-\r
-        if (result.wasOk())\r
-        {\r
-            resized(); // update to reflect the video's aspect ratio\r
-\r
-            setTransportControlsEnabled (true);\r
-\r
-            currentPositionLabel.setText (getPositionString (0.0, curVideoComp->getVideoDuration()), sendNotification);\r
-            positionSlider.setValue (0.0, dontSendNotification);\r
-            playSpeedComboBox.setSelectedId (100, dontSendNotification);\r
-        }\r
-        else\r
-        {\r
-            AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
-                                              "Couldn't load the file!",\r
-                                              result.getErrorMessage());\r
-        }\r
-    }\r
-\r
-    static String getPositionString (double playPositionSeconds, double durationSeconds)\r
-    {\r
-        auto positionMs = static_cast<int> (1000 * playPositionSeconds);\r
-        int posMinutes = positionMs / 60000;\r
-        int posSeconds = (positionMs % 60000) / 1000;\r
-        int posMillis = positionMs % 1000;\r
-\r
-        auto totalMs = static_cast<int> (1000 * durationSeconds);\r
-        int totMinutes = totalMs / 60000;\r
-        int totSeconds = (totalMs % 60000) / 1000;\r
-        int totMillis = totalMs % 1000;\r
-\r
-        return String::formatted ("%02d:%02d:%03d / %02d:%02d:%03d",\r
-                                  posMinutes, posSeconds, posMillis,\r
-                                  totMinutes, totSeconds, totMillis);\r
-    }\r
-\r
-    void updatePositionSliderAndLabel()\r
-    {\r
-        auto position = curVideoComp->getPlayPosition();\r
-        auto duration = curVideoComp->getVideoDuration();\r
-\r
-        currentPositionLabel.setText (getPositionString (position, duration), sendNotification);\r
-\r
-        if (! positionSliderDragging)\r
-            positionSlider.setValue (duration != 0 ? (position / duration) : 0.0, dontSendNotification);\r
-    }\r
-\r
-    void seekVideoToStart()\r
-    {\r
-        seekVideoToNormalisedPosition (0.0);\r
-    }\r
-\r
-    void seekVideoToNormalisedPosition (double normalisedPos)\r
-    {\r
-        normalisedPos = jlimit (0.0, 1.0, normalisedPos);\r
-\r
-        auto duration = curVideoComp->getVideoDuration();\r
-        auto newPos = jlimit (0.0, duration, duration * normalisedPos);\r
-\r
-        curVideoComp->setPlayPosition (newPos);\r
-        currentPositionLabel.setText (getPositionString (newPos, curVideoComp->getVideoDuration()), sendNotification);\r
-        positionSlider.setValue (normalisedPos, dontSendNotification);\r
-    }\r
-\r
-    void playVideo()\r
-    {\r
-        curVideoComp->play();\r
-    }\r
-\r
-    void processPlaybackStarted()\r
-    {\r
-        playButton.setVisible (false);\r
-        pauseButton.setVisible (true);\r
-\r
-        startTimer (20);\r
-    }\r
-\r
-    void pauseVideo()\r
-    {\r
-        curVideoComp->stop();\r
-    }\r
-\r
-    void processPlaybackPaused()\r
-    {\r
-        // On seeking to a new pos, the playback may be temporarily paused.\r
-        if (positionSliderDragging)\r
-            return;\r
-\r
-        pauseButton.setVisible (false);\r
-        playButton.setVisible (true);\r
-    }\r
-\r
-    void errorOccurred (const String& errorMessage)\r
-    {\r
-        AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,\r
-                                          "An error has occurred",\r
-                                          errorMessage + ", video will be unloaded.");\r
-\r
-        unloadVideoFile();\r
-    }\r
-\r
-    void unloadVideoFile()\r
-    {\r
-        curVideoComp->closeVideo();\r
-\r
-        setTransportControlsEnabled (false);\r
-        stopTimer();\r
-\r
-        pauseButton.setVisible (false);\r
-        playButton.setVisible (true);\r
-\r
-        currentPositionLabel.setText ("-:- / -:-", sendNotification);\r
-        positionSlider.setValue (0.0, dontSendNotification);\r
-    }\r
-\r
-    void timerCallback() override\r
-    {\r
-        updatePositionSliderAndLabel();\r
-    }\r
-};\r
-#elif JUCE_LINUX\r
- #error "This demo is not supported on Linux!"\r
-#endif\r
index cc70a483d9e4f23be608483253c22a7276656666..41a1ca1eb08e38c3b3d65851a4fbd66902a8d69e 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        WebBrowserDemo\r
 \r
index a3dfe9dbd4d3cedb1e81ff24b07dec278303e951..70461e8ad8acabb47d1c43175ab90602614e1630 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        WidgetsDemo\r
 \r
@@ -292,7 +290,7 @@ struct ButtonsPage   : public Component
             over.setStrokeThickness (4.0f);\r
 \r
             auto* db = addToList (new DrawableButton (String (i + 5) + " points", DrawableButton::ImageAboveTextLabel));\r
-            db->setImages (&normal, &over, nullptr);\r
+            db->setImages (&normal, &over, 0);\r
             db->setClickingTogglesState (true);\r
             db->setRadioGroupId (23456);\r
 \r
@@ -391,7 +389,7 @@ struct ButtonsPage   : public Component
         {\r
             // create an image-on-button-shape button from the same drawables..\r
             auto db = addToList (new DrawableButton ("Button 3", DrawableButton::ImageOnButtonBackground));\r
-            db->setImages (&normal, nullptr, nullptr);\r
+            db->setImages (&normal, 0, 0);\r
             db->setBounds (260, 160, 110, 25);\r
             db->setTooltip ("This is a DrawableButton on a standard button background");\r
             db->onClick = popupMessageCallback;\r
@@ -636,7 +634,7 @@ private:
                 {\r
                     auto* drawable = new DrawableImage();\r
                     drawable->setImage (getImageFromAssets ("juce_icon.png"));\r
-                    return new ToolbarButton (itemId, "juce!", drawable, nullptr);\r
+                    return new ToolbarButton (itemId, "juce!", drawable, 0);\r
                 }\r
                 case customComboBox:    return new CustomToolbarComboBox (itemId);\r
                 default:                break;\r
@@ -671,7 +669,7 @@ private:
             }\r
 \r
             auto* image = iconsFromZipFile[iconNames.indexOf (filename)]->createCopy();\r
-            return new ToolbarButton (itemId, text, image, nullptr);\r
+            return new ToolbarButton (itemId, text, image, 0);\r
         }\r
 \r
         // Demonstrates how to put a custom component into a toolbar - this one contains\r
@@ -1030,7 +1028,7 @@ private:
     // this loads the embedded database XML file into memory\r
     void loadData()\r
     {\r
-        demoData = parseXML (loadEntireAssetIntoString ("demo table data.xml"));\r
+        demoData.reset (XmlDocument::parse (loadEntireAssetIntoString ("demo table data.xml")));\r
 \r
         dataList   = demoData->getChildByName ("DATA");\r
         columnList = demoData->getChildByName ("COLUMNS");\r
index 3bd58bf01c98702557f4b48b4d4869e6142842a0..e21d2537aa8e135c76f507f26254463033e238f9 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        WindowsDemo\r
 \r
@@ -180,7 +178,7 @@ public:
     void mouseDrag (const MouseEvent& e) override\r
     {\r
         // as there's no titlebar we have to manage the dragging ourselves\r
-        dragger.dragComponent (this, e, nullptr);\r
+        dragger.dragComponent (this, e, 0);\r
     }\r
 \r
     void paint (Graphics& g) override\r
index 9d0dbae8ca3ee6bd7790d2dc8f49141f5e174414..822c2d4795c5f591e52b4bd86b5cd16c588b66fa 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        AUv3SynthProcessor\r
 \r
index 9ad8996f986488f95e417b416826d8a166bd170c..3765353b8cc1e39e747773e4d1159c1dfc43d12b 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        Arpeggiator\r
 \r
index 5d78c58740eab7c2d8eea808b6f5d34f3483607c..6d01d6ba4ed87b0aa87f2445e8c7d545ac816758 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone, androidstudio\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        JuceDemoPluginAudioProcessor\r
 \r
@@ -174,15 +172,15 @@ class JuceDemoPluginAudioProcessor  : public AudioProcessor
 public:\r
     //==============================================================================\r
     JuceDemoPluginAudioProcessor()\r
-        : AudioProcessor (getBusesProperties()),\r
-    state (*this, nullptr, "state",\r
-           { std::make_unique<AudioParameterFloat> ("gain", "Gain", NormalisableRange<float> (0.0f, 1.0f), 0.9f),\r
-             std::make_unique<AudioParameterFloat> ("delay", "Delay Feedback", NormalisableRange<float> (0.0f, 1.0f), 0.5f) })\r
+        : AudioProcessor (getBusesProperties())\r
     {\r
         lastPosInfo.resetToDefault();\r
 \r
-        // Add a sub-tree to store the state of our UI\r
-        state.state.addChild ({ "uiState", { { "width",  400 }, { "height", 200 } }, {} }, -1, nullptr);\r
+        // This creates our parameters. We'll keep some raw pointers to them in this class,\r
+        // so that we can easily access them later, but the base class will take care of\r
+        // deleting them for us.\r
+        addParameter (gainParam  = new AudioParameterFloat ("gain",  "Gain",           0.0f, 1.0f, 0.9f));\r
+        addParameter (delayParam = new AudioParameterFloat ("delay", "Delay Feedback", 0.0f, 1.0f, 0.5f));\r
 \r
         initialiseSynth();\r
     }\r
@@ -284,21 +282,48 @@ public:
     //==============================================================================\r
     void getStateInformation (MemoryBlock& destData) override\r
     {\r
-        // Store an xml representation of our state.\r
-        std::unique_ptr<XmlElement> xmlState (state.copyState().createXml());\r
+        // You should use this method to store your parameters in the memory block.\r
+        // Here's an example of how you can use XML to make it easy and more robust:\r
 \r
-        if (xmlState.get() != nullptr)\r
-            copyXmlToBinary (*xmlState, destData);\r
+        // Create an outer XML element..\r
+        XmlElement xml ("MYPLUGINSETTINGS");\r
+\r
+        // add some attributes to it..\r
+        xml.setAttribute ("uiWidth",  lastUIWidth);\r
+        xml.setAttribute ("uiHeight", lastUIHeight);\r
+\r
+        // Store the values of all our parameters, using their param ID as the XML attribute\r
+        for (auto* param : getParameters())\r
+            if (auto* p = dynamic_cast<AudioProcessorParameterWithID*> (param))\r
+                xml.setAttribute (p->paramID, p->getValue());\r
+\r
+        // then use this helper function to stuff it into the binary blob and return it..\r
+        copyXmlToBinary (xml, destData);\r
     }\r
 \r
     void setStateInformation (const void* data, int sizeInBytes) override\r
     {\r
-        // Restore our plug-in's state from the xml representation stored in the above\r
-        // method.\r
+        // You should use this method to restore your parameters from this memory block,\r
+        // whose contents will have been created by the getStateInformation() call.\r
+\r
+        // This getXmlFromBinary() helper function retrieves our XML from the binary blob..\r
         std::unique_ptr<XmlElement> xmlState (getXmlFromBinary (data, sizeInBytes));\r
 \r
         if (xmlState.get() != nullptr)\r
-            state.replaceState (ValueTree::fromXml (*xmlState));\r
+        {\r
+            // make sure that it's actually our type of XML object..\r
+            if (xmlState->hasTagName ("MYPLUGINSETTINGS"))\r
+            {\r
+                // ok, now pull out our last window size..\r
+                lastUIWidth  = jmax (xmlState->getIntAttribute ("uiWidth",  lastUIWidth),  400);\r
+                lastUIHeight = jmax (xmlState->getIntAttribute ("uiHeight", lastUIHeight), 200);\r
+\r
+                // Now reload our parameters..\r
+                for (auto* param : getParameters())\r
+                    if (auto* p = dynamic_cast<AudioProcessorParameterWithID*> (param))\r
+                        p->setValue ((float) xmlState->getDoubleAttribute (p->paramID, p->getValue()));\r
+            }\r
+        }\r
     }\r
 \r
     //==============================================================================\r
@@ -323,8 +348,14 @@ public:
     // callback - the UI component will read this and display it.\r
     AudioPlayHead::CurrentPositionInfo lastPosInfo;\r
 \r
-    // Our plug-in's current state\r
-    AudioProcessorValueTreeState state;\r
+    // these are used to persist the UI's size - the values are stored along with the\r
+    // filter's other parameters, and the UI component will update them when it gets\r
+    // resized.\r
+    int lastUIWidth = 400, lastUIHeight = 200;\r
+\r
+    // Our parameters\r
+    AudioParameterFloat* gainParam  = nullptr;\r
+    AudioParameterFloat* delayParam = nullptr;\r
 \r
     // Current track colour and name\r
     TrackProperties trackProperties;\r
@@ -333,28 +364,27 @@ private:
     //==============================================================================\r
     /** This is the editor component that our filter will display. */\r
     class JuceDemoPluginAudioProcessorEditor  : public AudioProcessorEditor,\r
-                                                private Timer,\r
-                                                private Value::Listener\r
+                                                private Timer\r
     {\r
     public:\r
         JuceDemoPluginAudioProcessorEditor (JuceDemoPluginAudioProcessor& owner)\r
             : AudioProcessorEditor (owner),\r
-              midiKeyboard         (owner.keyboardState, MidiKeyboardComponent::horizontalKeyboard),\r
-              gainAttachment       (owner.state, "gain",  gainSlider),\r
-              delayAttachment      (owner.state, "delay", delaySlider)\r
+              midiKeyboard         (owner.keyboardState, MidiKeyboardComponent::horizontalKeyboard)\r
         {\r
             // add some sliders..\r
-            addAndMakeVisible (gainSlider);\r
-            gainSlider.setSliderStyle (Slider::Rotary);\r
+            gainSlider.reset (new ParameterSlider (*owner.gainParam));\r
+            addAndMakeVisible (gainSlider.get());\r
+            gainSlider->setSliderStyle (Slider::Rotary);\r
 \r
-            addAndMakeVisible (delaySlider);\r
-            delaySlider.setSliderStyle (Slider::Rotary);\r
+            delaySlider.reset (new ParameterSlider (*owner.delayParam));\r
+            addAndMakeVisible (delaySlider.get());\r
+            delaySlider->setSliderStyle (Slider::Rotary);\r
 \r
             // add some labels for the sliders..\r
-            gainLabel.attachToComponent (&gainSlider, false);\r
+            gainLabel.attachToComponent (gainSlider.get(), false);\r
             gainLabel.setFont (Font (11.0f));\r
 \r
-            delayLabel.attachToComponent (&delaySlider, false);\r
+            delayLabel.attachToComponent (delaySlider.get(), false);\r
             delayLabel.setFont (Font (11.0f));\r
 \r
             // add the midi keyboard component..\r
@@ -367,14 +397,9 @@ private:
             // set resize limits for this plug-in\r
             setResizeLimits (400, 200, 1024, 700);\r
 \r
-            lastUIWidth .referTo (owner.state.state.getChildWithName ("uiState").getPropertyAsValue ("width",  nullptr));\r
-            lastUIHeight.referTo (owner.state.state.getChildWithName ("uiState").getPropertyAsValue ("height", nullptr));\r
-\r
             // set our component's initial size to be the last one that was stored in the filter's settings\r
-            setSize (lastUIWidth.getValue(), lastUIHeight.getValue());\r
-\r
-            lastUIWidth. addListener (this);\r
-            lastUIHeight.addListener (this);\r
+            setSize (owner.lastUIWidth,\r
+                     owner.lastUIHeight);\r
 \r
             updateTrackProperties();\r
 \r
@@ -402,11 +427,11 @@ private:
 \r
             r.removeFromTop (20);\r
             auto sliderArea = r.removeFromTop (60);\r
-            gainSlider.setBounds  (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth() / 2)));\r
-            delaySlider.setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth())));\r
+            gainSlider->setBounds  (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth() / 2)));\r
+            delaySlider->setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth())));\r
 \r
-            lastUIWidth  = getWidth();\r
-            lastUIHeight = getHeight();\r
+            getProcessor().lastUIWidth  = getWidth();\r
+            getProcessor().lastUIHeight = getHeight();\r
         }\r
 \r
         void timerCallback() override\r
@@ -419,17 +444,6 @@ private:
             midiKeyboard.setVisible (! controllerIsAvailable);\r
         }\r
 \r
-        int getControlParameterIndex (Component& control) override\r
-        {\r
-            if (&control == &gainSlider)\r
-                return 0;\r
-\r
-            if (&control == &delaySlider)\r
-                return 1;\r
-\r
-            return -1;\r
-        }\r
-\r
         void updateTrackProperties()\r
         {\r
             auto trackColour = getProcessor().trackProperties.colour;\r
@@ -441,21 +455,53 @@ private:
         }\r
 \r
     private:\r
+        //==============================================================================\r
+        // This is a handy slider subclass that controls an AudioProcessorParameter\r
+        // (may move this class into the library itself at some point in the future..)\r
+        class ParameterSlider   : public Slider,\r
+                                  private Timer\r
+        {\r
+        public:\r
+            ParameterSlider (AudioProcessorParameter& p)\r
+                : Slider (p.getName (256)), param (p)\r
+            {\r
+                setRange (0.0, 1.0, 0.0);\r
+                startTimerHz (30);\r
+                updateSliderPos();\r
+            }\r
+\r
+            void valueChanged() override        { param.setValueNotifyingHost ((float) Slider::getValue()); }\r
+\r
+            void timerCallback() override       { updateSliderPos(); }\r
+\r
+            void startedDragging() override     { param.beginChangeGesture(); }\r
+            void stoppedDragging() override     { param.endChangeGesture();   }\r
+\r
+            double getValueFromText (const String& text) override   { return param.getValueForText (text); }\r
+            String getTextFromValue (double value) override         { return param.getText ((float) value, 1024); }\r
+\r
+            void updateSliderPos()\r
+            {\r
+                auto newValue = param.getValue();\r
+\r
+                if (newValue != (float) Slider::getValue() && ! isMouseButtonDown())\r
+                    Slider::setValue (newValue, NotificationType::dontSendNotification);\r
+            }\r
+\r
+            AudioProcessorParameter& param;\r
+\r
+            JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterSlider)\r
+        };\r
+\r
         MidiKeyboardComponent midiKeyboard;\r
 \r
         Label timecodeDisplayLabel,\r
               gainLabel  { {}, "Throughput level:" },\r
               delayLabel { {}, "Delay:" };\r
 \r
-        Slider gainSlider, delaySlider;\r
-        AudioProcessorValueTreeState::SliderAttachment gainAttachment, delayAttachment;\r
+        std::unique_ptr<ParameterSlider> gainSlider, delaySlider;\r
         Colour backgroundColour;\r
 \r
-        // these are used to persist the UI's size - the values are stored along with the\r
-        // filter's other parameters, and the UI component will update them when it gets\r
-        // resized.\r
-        Value lastUIWidth, lastUIHeight;\r
-\r
         //==============================================================================\r
         JuceDemoPluginAudioProcessor& getProcessor() const\r
         {\r
@@ -512,20 +558,12 @@ private:
 \r
             timecodeDisplayLabel.setText (displayText.toString(), dontSendNotification);\r
         }\r
-\r
-        // called when the stored window size changes\r
-        void valueChanged (Value&) override\r
-        {\r
-            setSize (lastUIWidth.getValue(), lastUIHeight.getValue());\r
-        }\r
     };\r
 \r
     //==============================================================================\r
     template <typename FloatType>\r
     void process (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages, AudioBuffer<FloatType>& delayBuffer)\r
     {\r
-        auto gainParamValue  = state.getParameter ("gain") ->getValue();\r
-        auto delayParamValue = state.getParameter ("delay")->getValue();\r
         auto numSamples = buffer.getNumSamples();\r
 \r
         // In case we have more outputs than inputs, we'll clear any output\r
@@ -542,28 +580,29 @@ private:
         synth.renderNextBlock (buffer, midiMessages, 0, numSamples);\r
 \r
         // Apply our delay effect to the new output..\r
-        applyDelay (buffer, delayBuffer, delayParamValue);\r
+        applyDelay (buffer, delayBuffer);\r
 \r
-        // Apply our gain change to the outgoing data..\r
-        applyGain (buffer, delayBuffer, gainParamValue);\r
+        applyGain (buffer, delayBuffer); // apply our gain-change to the outgoing data..\r
 \r
         // Now ask the host for the current time so we can store it to be displayed later...\r
         updateCurrentTimeInfoFromHost();\r
     }\r
 \r
     template <typename FloatType>\r
-    void applyGain (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer, float gainLevel)\r
+    void applyGain (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer)\r
     {\r
         ignoreUnused (delayBuffer);\r
+        auto gainLevel = gainParam->get();\r
 \r
         for (auto channel = 0; channel < getTotalNumOutputChannels(); ++channel)\r
             buffer.applyGain (channel, 0, buffer.getNumSamples(), gainLevel);\r
     }\r
 \r
     template <typename FloatType>\r
-    void applyDelay (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer, float delayLevel)\r
+    void applyDelay (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer)\r
     {\r
         auto numSamples = buffer.getNumSamples();\r
+        auto delayLevel = delayParam->get();\r
 \r
         auto delayPos = 0;\r
 \r
index 5282b7790747c27d3812b776e5e8fce83da5440d..ff2cd7ce91c0b1cd03efbfbe9a5e1ced5787d522 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        DspModulePluginDemoAudioProcessor\r
 \r
index 4d620e492c43857dede0d757a87ce9bb9f39ab47..f3eadbda679778c10e0d6cea8ff75444b355cc4d 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        GainProcessor\r
 \r
index 46e8af1244eb6df9d9d2920512710c3fb757dc4b..429bff107c548015e59379ead28fc98f818bca99 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        IAAEffectProcessor\r
 \r
@@ -152,9 +150,17 @@ public:
          : AudioProcessor (BusesProperties()\r
                            .withInput  ("Input",  AudioChannelSet::stereo(), true)\r
                            .withOutput ("Output", AudioChannelSet::stereo(), true)),\r
-           parameters (*this, nullptr, "InterAppAudioEffect",\r
-                       { std::make_unique<AudioParameterFloat> ("gain", "Gain", NormalisableRange<float> (0.0f, 1.0f), 1.0f / 3.14f) })\r
+           parameters (*this, nullptr)\r
     {\r
+        parameters.createAndAddParameter ("gain",\r
+                                          "Gain",\r
+                                          {},\r
+                                          NormalisableRange<float> (0.0f, 1.0f),\r
+                                          (float) (1.0 / 3.14),\r
+                                          nullptr,\r
+                                          nullptr);\r
+\r
+        parameters.state = ValueTree (Identifier ("InterAppAudioEffect"));\r
     }\r
 \r
     ~IAAEffectProcessor() {}\r
index 09668ae11f2361eaceed317a76cfb19cc9dfedb9..db8a8a39af48be1f7c681c7ba06a0c67acf8b108 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        MultiOutSynth\r
 \r
index 6925d0fced7a539d9530e0bcfdd3266d98048eac..ea7f26ab8307ad27f2f60c959e3a710f09e89fe2 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        NoiseGate\r
 \r
index ceca60b2e9813e0e6a5277ddcda3ad5dff95caa6..4d677d8764f7124b4da6668a7d6e45887b1c8d7b 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        SamplerAudioProcessor\r
 \r
@@ -165,14 +163,16 @@ public:
         source.read (&data, 0, length + 4, 0, true, true);\r
     }\r
 \r
-    double getSampleRate() const                    { return sourceSampleRate; }\r
-    int getLength() const                           { return length; }\r
-    const AudioBuffer<float>& getBuffer() const     { return data; }\r
+    double getSampleRate() const { return sourceSampleRate; }\r
+\r
+    int getLength() const { return length; }\r
+\r
+    const AudioSampleBuffer& getBuffer() const { return data; }\r
 \r
 private:\r
     double sourceSampleRate;\r
     int length;\r
-    AudioBuffer<float> data;\r
+    AudioSampleBuffer data;\r
 };\r
 \r
 //==============================================================================\r
index f98af7d42923ba84d5486a5ea232c2caca05a34d..91ed5bea702900e3ed60b32e79fe22b668097f6d 100644 (file)
@@ -35,8 +35,6 @@
                    juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             AudioProcessor\r
  mainClass:        SurroundProcessor\r
 \r
index 8cc8af700cde42aefc9edd30558ce3d37ba5f274..88837810809aae0753e4bbe1f1cbaa2ad9eddc98 100644 (file)
@@ -33,8 +33,6 @@
                    juce_graphics, juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, xcode_iphone, androidstudio\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        AnalyticsCollectionDemo\r
 \r
index 2104b5f4c8fb1fbac258962f98bec7c235c1edf3..362543d23267c74d9a509f4bf81ee5c27708caf7 100644 (file)
@@ -33,8 +33,6 @@
                    juce_graphics, juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        Box2DDemo\r
 \r
index fc70d4df02ceb730453f5239205e83f1755218e0..50cc37966b82b64f49565be55a7de0c2537d2f32 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Console\r
  mainClass:        ChildProcessDemo\r
 \r
index ed6c25ee40a27270f50f759bdc75c669a1579934..3d5d9810d6bd757446a1a9c1d907be13e10859f4 100644 (file)
@@ -33,8 +33,6 @@
                    juce_graphics, juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        CryptographyDemo\r
 \r
index f726acbef886e3c4dca9b6fcaa5cb50262d92acf..68f2783c12751314e2a0fe736d2e0725da644192 100644 (file)
@@ -37,8 +37,6 @@
                    juce_product_unlocking\r
  exporters:        xcode_mac, xcode_iphone, androidstudio\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        InAppPurchasesDemo\r
 \r
index e7682e39b994a4b15ed34b4dfcf26eadda00571a..47a1f6f1f975c9dc56f331a65553895f512e5115 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        JavaScriptDemo\r
 \r
index df9e3737458fe11fa079cc1f031000a788753a9f..627b2244443a20923ff7fd2705d93a3e0e5ed400 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        LiveConstantDemo\r
 \r
index 3a33500587fa54f66c8e06a13ec13efee0e9de9e..0d7bf6e427c357bd64263fc4d5dd9a0e5b0784fb 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        MultithreadingDemo\r
 \r
@@ -122,7 +120,7 @@ private:
           parentWidth = 50.0f, parentHeight = 50.0f;\r
 \r
     Colour colour;\r
-    Thread::ThreadID threadId = {};\r
+    Thread::ThreadID threadId = 0;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BouncingBallComp)\r
 };\r
index 830011041dc2e9c3510b3fff5fdbe9a99016d175..8cd1fca1fdbaf84b4bb204cb1aeedef25aa243d4 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        NetworkingDemo\r
 \r
@@ -103,16 +101,15 @@ public:
         StringPairArray responseHeaders;\r
         int statusCode = 0;\r
 \r
-        if (auto stream = std::unique_ptr<InputStream> (url.createInputStream (false, nullptr, nullptr, {},\r
-                                                                               10000, // timeout in millisecs\r
-                                                                               &responseHeaders, &statusCode)))\r
-        {\r
+        std::unique_ptr<InputStream> stream (url.createInputStream (false, nullptr, nullptr, {},\r
+                                                                    10000, // timeout in millisecs\r
+                                                                    &responseHeaders, &statusCode));\r
+        if (stream.get() != nullptr)\r
             return (statusCode != 0 ? "Status code: " + String (statusCode) + newLine : String())\r
                     + "Response headers: " + newLine\r
                     + responseHeaders.getDescription() + newLine\r
                     + "----------------------------------------------------" + newLine\r
                     + stream->readEntireStreamAsString();\r
-        }\r
 \r
         if (statusCode != 0)\r
             return "Failed to connect, status code = " + String (statusCode);\r
index 827d8aa4f17c886cf2859534505933b713dffb9c..d29cb5523df9d6a2d994e4f268b858e02b359d50 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_osc\r
  exporters:        xcode_mac, vs2017, linux_make\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        OSCDemo\r
 \r
@@ -414,7 +412,7 @@ private:
     {\r
         AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
                                           "Unknown error",\r
-                                          "An unknown error occurred while trying to disconnect from UDP port.",\r
+                                          "An unknown error occured while trying to disconnect from UDP port.",\r
                                           "OK");\r
     }\r
 \r
index e035db548875fa3e01917b8550ce69be7cd7d6c7..20cc256946e67c716fc4190bbdb3b0b7f36748dc 100644 (file)
@@ -36,8 +36,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, xcode_iphone, androidstudio\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        PushNotificationsDemo\r
 \r
index 82307b08f8d6d109b6d478f0a2ec3b53a7a3560d..7c6dfb88210222717aa91ef1e7bcc1e34ad8d904 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        SystemInfoDemo\r
 \r
 //==============================================================================\r
 static String getMacAddressList()\r
 {\r
-    String addressList;\r
+    Array<MACAddress> macAddresses;\r
+    MACAddress::findAllAddresses (macAddresses);\r
 \r
-    for (auto& addr : MACAddress::getAllAddresses())\r
+    String addressList;\r
+    for (auto& addr : macAddresses)\r
         addressList << addr.toString() << newLine;\r
 \r
     return addressList;\r
@@ -73,9 +73,12 @@ static String getFileSystemRoots()
 \r
 static String getIPAddressList()\r
 {\r
+    Array<IPAddress> addresses;\r
+    IPAddress::findAllAddresses (addresses);\r
+\r
     String addressList;\r
 \r
-    for (auto& addr : IPAddress::getAllAddresses())\r
+    for (auto& addr : addresses)\r
         addressList << "   " << addr.toString() << newLine;\r
 \r
     return addressList;\r
@@ -144,31 +147,21 @@ static String getAllSystemInfo()
     systemInfo\r
       << "Number of logical CPUs:  " << SystemStats::getNumCpus() << newLine\r
       << "Number of physical CPUs: " << SystemStats::getNumPhysicalCpus() << newLine\r
-      << "Memory size:             " << SystemStats::getMemorySizeInMegabytes() << " MB" << newLine\r
-      << "CPU vendor:              " << SystemStats::getCpuVendor() << newLine\r
-      << "CPU model:               " << SystemStats::getCpuModel()  << newLine\r
-      << "CPU speed:               " << SystemStats::getCpuSpeedInMegahertz() << " MHz" << newLine\r
-      << "CPU has MMX:             " << (SystemStats::hasMMX()             ? "yes" : "no") << newLine\r
-      << "CPU has SSE:             " << (SystemStats::hasSSE()             ? "yes" : "no") << newLine\r
-      << "CPU has SSE2:            " << (SystemStats::hasSSE2()            ? "yes" : "no") << newLine\r
-      << "CPU has SSE3:            " << (SystemStats::hasSSE3()            ? "yes" : "no") << newLine\r
-      << "CPU has SSSE3:           " << (SystemStats::hasSSSE3()           ? "yes" : "no") << newLine\r
-      << "CPU has SSE4.1:          " << (SystemStats::hasSSE41()           ? "yes" : "no") << newLine\r
-      << "CPU has SSE4.2:          " << (SystemStats::hasSSE42()           ? "yes" : "no") << newLine\r
-      << "CPU has 3DNOW:           " << (SystemStats::has3DNow()           ? "yes" : "no") << newLine\r
-      << "CPU has AVX:             " << (SystemStats::hasAVX()             ? "yes" : "no") << newLine\r
-      << "CPU has AVX2:            " << (SystemStats::hasAVX2()            ? "yes" : "no") << newLine\r
-      << "CPU has AVX512F:         " << (SystemStats::hasAVX512F()         ? "yes" : "no") << newLine\r
-      << "CPU has AVX512BW:        " << (SystemStats::hasAVX512BW()        ? "yes" : "no") << newLine\r
-      << "CPU has AVX512CD:        " << (SystemStats::hasAVX512CD()        ? "yes" : "no") << newLine\r
-      << "CPU has AVX512DQ:        " << (SystemStats::hasAVX512DQ()        ? "yes" : "no") << newLine\r
-      << "CPU has AVX512ER:        " << (SystemStats::hasAVX512ER()        ? "yes" : "no") << newLine\r
-      << "CPU has AVX512IFMA:      " << (SystemStats::hasAVX512IFMA()      ? "yes" : "no") << newLine\r
-      << "CPU has AVX512PF:        " << (SystemStats::hasAVX512PF()        ? "yes" : "no") << newLine\r
-      << "CPU has AVX512VBMI:      " << (SystemStats::hasAVX512VBMI()      ? "yes" : "no") << newLine\r
-      << "CPU has AVX512VL:        " << (SystemStats::hasAVX512VL()        ? "yes" : "no") << newLine\r
-      << "CPU has AVX512VPOPCNTDQ: " << (SystemStats::hasAVX512VPOPCNTDQ() ? "yes" : "no") << newLine\r
-      << "CPU has Neon:            " << (SystemStats::hasNeon()            ? "yes" : "no") << newLine\r
+      << "Memory size:     " << SystemStats::getMemorySizeInMegabytes() << " MB" << newLine\r
+      << "CPU vendor:      " << SystemStats::getCpuVendor() << newLine\r
+      << "CPU model:       " << SystemStats::getCpuModel()  << newLine\r
+      << "CPU speed:       " << SystemStats::getCpuSpeedInMegaherz() << " MHz" << newLine\r
+      << "CPU has MMX:     " << (SystemStats::hasMMX()    ? "yes" : "no") << newLine\r
+      << "CPU has SSE:     " << (SystemStats::hasSSE()    ? "yes" : "no") << newLine\r
+      << "CPU has SSE2:    " << (SystemStats::hasSSE2()   ? "yes" : "no") << newLine\r
+      << "CPU has SSE3:    " << (SystemStats::hasSSE3()   ? "yes" : "no") << newLine\r
+      << "CPU has SSSE3:   " << (SystemStats::hasSSSE3()  ? "yes" : "no") << newLine\r
+      << "CPU has SSE4.1:  " << (SystemStats::hasSSE41()  ? "yes" : "no") << newLine\r
+      << "CPU has SSE4.2:  " << (SystemStats::hasSSE42()  ? "yes" : "no") << newLine\r
+      << "CPU has 3DNOW:   " << (SystemStats::has3DNow()  ? "yes" : "no") << newLine\r
+      << "CPU has AVX:     " << (SystemStats::hasAVX()    ? "yes" : "no") << newLine\r
+      << "CPU has AVX2:    " << (SystemStats::hasAVX2()   ? "yes" : "no") << newLine\r
+      << "CPU has Neon:    " << (SystemStats::hasNeon()   ? "yes" : "no") << newLine\r
       << newLine;\r
 \r
     systemInfo\r
index 0707708ff59942c9fe721650d9bc125243b10c89..4f34e78eafd43fe7940bf093366e263d6f43170d 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        TimersAndEventsDemo\r
 \r
index 4c2f9c3de42f0bb7f67aa9f04dd9b44c856dbfdd..066d0c40c9f49ce08416f972fe824b138d0ca6f9 100644 (file)
@@ -36,7 +36,6 @@
                    juce_opengl, juce_osc, juce_product_unlocking, juce_video\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
  defines:          JUCE_UNIT_TESTS=1\r
 \r
  type:             Component\r
index 97455087e2b94721e62da66e2e018d1383f469ff..7143bbaa3caf5228776e9f2c2b2cf417552e6907 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        ValueTreesDemo\r
 \r
index 8c5f7a34b32fe06b62320fbf6ec84b0a1b0d3164..f22235f976d28c9d8402c0f26222d98c481776a4 100644 (file)
@@ -33,8 +33,6 @@
                    juce_gui_basics, juce_gui_extra\r
  exporters:        xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
 \r
- moduleFlags:      JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
  type:             Component\r
  mainClass:        XMLandJSONDemo\r
 \r
index e27f832a1b8d5ba02f6860ba5ab0b6f9c861f007..862fe1f2cd0b2aaee58a79c1da6aa5af880136ed 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="AKfc5m" name="AudioPerformanceTest" projectType="guiapp"\r
-              bundleIdentifier="com.juce.AudioPerformanceTest" jucerVersion="5.4.1"\r
+              bundleIdentifier="com.juce.AudioPerformanceTest" jucerVersion="5.3.1"\r
               displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd."\r
               companyCopyright="ROLI Ltd.">\r
   <MAINGROUP id="b1eVTe" name="AudioPerformanceTest">\r
index e7c72285be8e2004639ea5d4a8b116ff96b86970..f688f097d17bb8ccd96dea5702ecae36f0249503 100644 (file)
@@ -37,8 +37,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
@@ -302,91 +300,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
@@ -398,6 +311,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+    "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
@@ -411,8 +325,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
@@ -431,7 +343,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
-    "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
@@ -473,8 +384,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
     "../../../../../modules/juce_core/containers/juce_Array.h"\r
     "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
     "../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
@@ -484,11 +393,9 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
-    "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
-    "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
     "../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
@@ -535,7 +442,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
     "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
     "../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
-    "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_Memory.h"\r
     "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
@@ -546,8 +452,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
     "../../../../../modules/juce_core/memory/juce_Singleton.h"\r
     "../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
     "../../../../../modules/juce_core/misc/juce_Result.cpp"\r
     "../../../../../modules/juce_core/misc/juce_Result.h"\r
     "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
@@ -578,7 +482,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
     "../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
     "../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
-    "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
     "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
     "../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
     "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
@@ -744,8 +647,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
     "../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
@@ -975,12 +876,10 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
@@ -1241,7 +1140,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
-    "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
     "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
@@ -1307,8 +1205,6 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/ju
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1572,91 +1468,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1668,6 +1479,7 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1681,8 +1493,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/proces
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1701,7 +1511,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/utilit
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1743,8 +1552,6 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Ab
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1754,11 +1561,9 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Li
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1805,7 +1610,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1816,8 +1620,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Scoped
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1848,7 +1650,6 @@ set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_St
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2014,8 +1815,6 @@ set_source_files_properties("../../../../../modules/juce_events/interprocess/juc
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2245,12 +2044,10 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/components/j
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2511,7 +2308,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juc
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
index a9566718b6319801cfc32cb79567907c29f9d230..a0ce9c2df12f9acd0135edba8e88ef1cf1ff2fee 100644 (file)
@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
 \r
 android {\r
     compileSdkVersion 23\r
-    buildToolsVersion "28.0.0"\r
+    buildToolsVersion "27.0.3"\r
     externalNativeBuild {\r
         cmake {\r
             path "CMakeLists.txt"\r
index 447fd462cdbe738a5e2aafebdcefe41156eb5cc3..af39d367572d94bc9675d69294d8f5a5d1e2b6a7 100644 (file)
@@ -3,6 +3,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
           package="com.juce.audioperformancetest">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+  <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
index 3a402c1d1d77a3a8b31c423aefdce635af647af7..2ca9c6d9291219b93591b3021f5025122dd63461 100644 (file)
@@ -31,9 +31,6 @@ import android.content.res.Configuration;
 import android.content.pm.PackageInfo;\r
 import android.content.pm.PackageManager;\r
 import android.hardware.camera2.*;\r
-import android.database.ContentObserver;\r
-import android.media.session.*;\r
-import android.media.MediaMetadata;\r
 import android.net.http.SslError;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
@@ -97,11 +94,8 @@ public class AudioPerformanceTest   extends Activity
     //==============================================================================\r
     public boolean isPermissionDeclaredInManifest (int permissionID)\r
     {\r
-        return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
-    }\r
+        String permissionToCheck = getAndroidPermissionName(permissionID);\r
 \r
-    public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
-    {\r
         try\r
         {\r
             PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
@@ -1494,9 +1488,7 @@ public class AudioPerformanceTest   extends Activity
     public final String getClipboardContent()\r
     {\r
         ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
-        CharSequence content = clipboard.getText();\r
-        return content != null ? content.toString() : new String();\r
+        return clipboard.getText().toString();\r
     }\r
 \r
     public final void setClipboardContent (String newText)\r
@@ -2005,13 +1997,11 @@ public class AudioPerformanceTest   extends Activity
                                           implements SurfaceHolder.Callback\r
     {\r
         private long nativeContext = 0;\r
-        private boolean forVideo;\r
 \r
-        NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+        NativeSurfaceView (Context context, long nativeContextPtr)\r
         {\r
             super (context);\r
             nativeContext = nativeContextPtr;\r
-            forVideo = createdForVideo;\r
         }\r
 \r
         public Surface getNativeSurface()\r
@@ -2029,51 +2019,38 @@ public class AudioPerformanceTest   extends Activity
         @Override\r
         public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
         {\r
-            if (forVideo)\r
-                surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
-            else\r
-                surfaceChangedNative (nativeContext, holder, format, width, height);\r
+            surfaceChangedNative (nativeContext, holder, format, width, height);\r
         }\r
 \r
         @Override\r
         public void surfaceCreated (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceCreatedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceCreatedNative (nativeContext, holder);\r
+            surfaceCreatedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         public void surfaceDestroyed (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceDestroyedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceDestroyedNative (nativeContext, holder);\r
+            surfaceDestroyedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         protected void dispatchDraw (Canvas canvas)\r
         {\r
             super.dispatchDraw (canvas);\r
-\r
-            if (forVideo)\r
-                dispatchDrawNativeVideo (nativeContext, canvas);\r
-            else\r
-                dispatchDrawNative (nativeContext, canvas);\r
+            dispatchDrawNative (nativeContext, canvas);\r
         }\r
 \r
         //==============================================================================\r
         @Override\r
-        protected void onAttachedToWindow()\r
+        protected void onAttachedToWindow ()\r
         {\r
             super.onAttachedToWindow();\r
             getHolder().addCallback (this);\r
         }\r
 \r
         @Override\r
-        protected void onDetachedFromWindow()\r
+        protected void onDetachedFromWindow ()\r
         {\r
             super.onDetachedFromWindow();\r
             getHolder().removeCallback (this);\r
@@ -2085,17 +2062,11 @@ public class AudioPerformanceTest   extends Activity
         private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
         private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
                                                   int format, int width, int height);\r
-\r
-        private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
-        private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
-                                                       int format, int width, int height);\r
     }\r
 \r
-    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
     {\r
-        return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+        return new NativeSurfaceView (this, nativeSurfacePtr);\r
     }\r
 \r
     //==============================================================================\r
@@ -2855,151 +2826,6 @@ public class AudioPerformanceTest   extends Activity
     }\r
 \r
 \r
-    //==============================================================================\r
-    public class MediaControllerCallback  extends MediaController.Callback\r
-    {\r
-        private native void mediaControllerAudioInfoChanged     (long host, MediaController.PlaybackInfo info);\r
-        private native void mediaControllerMetadataChanged      (long host, MediaMetadata metadata);\r
-        private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
-        private native void mediaControllerSessionDestroyed     (long host);\r
-\r
-        MediaControllerCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
-        {\r
-            mediaControllerAudioInfoChanged (host, info);\r
-        }\r
-\r
-        @Override\r
-        public void onMetadataChanged (MediaMetadata metadata)\r
-        {\r
-            mediaControllerMetadataChanged (host, metadata);\r
-        }\r
-\r
-        @Override\r
-        public void onPlaybackStateChanged (PlaybackState state)\r
-        {\r
-             mediaControllerPlaybackStateChanged (host, state);\r
-        }\r
-\r
-        @Override\r
-        public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
-        @Override\r
-        public void onSessionDestroyed()\r
-        {\r
-            mediaControllerSessionDestroyed (host);\r
-        }\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class MediaSessionCallback  extends MediaSession.Callback\r
-    {\r
-        private native void mediaSessionPause           (long host);\r
-        private native void mediaSessionPlay            (long host);\r
-        private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
-        private native void mediaSessionSeekTo          (long host, long pos);\r
-        private native void mediaSessionStop            (long host);\r
-\r
-\r
-        MediaSessionCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onPause()\r
-        {\r
-            mediaSessionPause (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlay()\r
-        {\r
-            mediaSessionPlay (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlayFromMediaId (String mediaId, Bundle extras)\r
-        {\r
-            mediaSessionPlayFromMediaId (host, mediaId, extras);\r
-        }\r
-\r
-        @Override\r
-        public void onSeekTo (long pos)\r
-        {\r
-            mediaSessionSeekTo (host, pos);\r
-        }\r
-\r
-        @Override\r
-        public void onStop()\r
-        {\r
-            mediaSessionStop (host);\r
-        }\r
-\r
-        @Override\r
-        public void onFastForward() {}\r
-\r
-        @Override\r
-        public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
-        {\r
-            return true;\r
-        }\r
-\r
-        @Override\r
-        public void onRewind() {}\r
-\r
-        @Override\r
-        public void onSkipToNext() {}\r
-\r
-        @Override\r
-        public void onSkipToPrevious() {}\r
-\r
-        @Override\r
-        public void onSkipToQueueItem (long id) {}\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class SystemVolumeObserver extends ContentObserver\r
-    {\r
-        private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
-        SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
-        {\r
-            super (null);\r
-\r
-            activity = activityToUse;\r
-            host = hostToUse;\r
-        }\r
-\r
-        void setEnabled (boolean shouldBeEnabled)\r
-        {\r
-            if (shouldBeEnabled)\r
-                activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
-            else\r
-                activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
-        }\r
-\r
-        @Override\r
-        public void onChange (boolean selfChange, Uri uri)\r
-        {\r
-            if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
-                mediaSessionSystemVolumeChanged (host);\r
-        }\r
-\r
-        private Activity activity;\r
-        private long host;\r
-    }\r
-\r
-\r
     //==============================================================================\r
     public static final String getLocaleValue (boolean isRegion)\r
     {\r
index 647f509e9ca3df4e45bee9a59ceebfc5067d81fe..651d63db63bdd2bf53a574bdde786ac927b14169 100644 (file)
@@ -4,7 +4,7 @@ buildscript {
        jcenter()\r
    }\r
    dependencies {\r
-       classpath 'com.android.tools.build:gradle:3.1.3'\r
+       classpath 'com.android.tools.build:gradle:3.1.1'\r
    }\r
 }\r
 \r
index 114cbfc4f9f987a3e60770b4bcb6f8f09bb496a1..c2ffab79cfbe4f51219dff51a5a37ff25d03cd4a 100644 (file)
@@ -35,13 +35,13 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := AudioPerformanceTest\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -56,13 +56,13 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := AudioPerformanceTest\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -81,13 +81,11 @@ OBJECTS_APP := \
   $(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \\r
   $(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
        @echo Linking "AudioPerformanceTest - App"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -154,6 +152,10 @@ $(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o: ../../JuceLibraryCode/include_
        @echo "Compiling include_juce_gui_extra.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
 clean:\r
        @echo Cleaning AudioPerformanceTest\r
        $(V_AT)$(CLEANCMD)\r
index 90094bdb6b0c846880da87753287022b1d45e030..7f38502a14561d14d3594de3a7528258189c8fff 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               E1282ABB96DD2E7FA7F63559 = {
-                       isa = PBXBuildFile;
-                       fileRef = 614F2084407B35D62101F69F;
-               };
-               8A0F71A4EEC7FE694352DD94 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9EADBF913B7A454B6BE93A4A;
-               };
-               30BE30F31D1AAED9FC893AA5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 18C1CCE5684F9FA0478F27AD;
-               };
-               9B19A6655FCC8086134C8656 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1DA5C6A474916745AFEC6DA5;
-               };
-               0319B40AD2FD96007FFA928B = {
-                       isa = PBXBuildFile;
-                       fileRef = 453777CEB7099A5D61901D13;
-               };
-               5AFD011031C266431687C922 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9F28F179EF6B90EB9F4DBEE9;
-               };
-               5923A711C0020F2CDD598714 = {
-                       isa = PBXBuildFile;
-                       fileRef = 12C680C68A15B9A590264B18;
-               };
-               3825E8984D8F6AA00DDC6BAC = {
-                       isa = PBXBuildFile;
-                       fileRef = EE758AD71415EB31BD3E82F3;
-               };
-               9031C69145EE085B60904363 = {
-                       isa = PBXBuildFile;
-                       fileRef = 43775DC3D9F7917846EA5327;
-               };
-               F8099BB77DC0D01DCCC6AFB9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0A58FDDF6FB9253F51939A52;
-               };
-               537E779F6008999191B2920A = {
-                       isa = PBXBuildFile;
-                       fileRef = 3058871156B921B9E5946C4F;
-               };
-               DA21A6E7A18555DCFC63B07C = {
-                       isa = PBXBuildFile;
-                       fileRef = FAAB4EAE4A57B642D3B9EC23;
-               };
-               07451DA87757F9EF80E31BE8 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0564535EEA7E4462926EA0C9;
-               };
-               2BAED5B831BB736E77A718AE = {
-                       isa = PBXBuildFile;
-                       fileRef = 89B3243200BAA6BD72905DBB;
-               };
-               01C9BC9A0A0F54B693CDA31A = {
-                       isa = PBXBuildFile;
-                       fileRef = 322D3066DCD98A8D0542236A;
-               };
-               48ADBEF873A610909D727C97 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9E05B63699A307598B66F829;
-               };
-               D145903EE5DBFD1BD98423F3 = {
-                       isa = PBXBuildFile;
-                       fileRef = 18E39207A0F5F9B8BC7EE94F;
-               };
-               C7B090C29D8DE4D2503204B1 = {
-                       isa = PBXBuildFile;
-                       fileRef = BAFDA8DE51E7A69E477439EB;
-               };
-               FFAF94080FF4A9995B33151E = {
-                       isa = PBXBuildFile;
-                       fileRef = 24425FFB0BCC7E54CADAA013;
-               };
-               D2CECF93178A1738DA02CA4A = {
-                       isa = PBXBuildFile;
-                       fileRef = EDD11E2CC0B18196ADA0C87B;
-               };
-               7E870C094BAE67D7EB149F1C = {
-                       isa = PBXBuildFile;
-                       fileRef = 248FAA119A4FC24C522165EF;
-               };
-               65FC2E13B65977FED63BDDE3 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7E951216B6138C76653B1460;
-               };
-               699954AF666E644C7B688381 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0BC3C6A4F4FC1DD30DD8E17C;
-               };
-               9D47995A33BBA693ED435B31 = {
-                       isa = PBXBuildFile;
-                       fileRef = B06AE97C86D27E7FEBCB4631;
-               };
-               0564535EEA7E4462926EA0C9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0A58FDDF6FB9253F51939A52 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               0BC3C6A4F4FC1DD30DD8E17C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               12C680C68A15B9A590264B18 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               18C1CCE5684F9FA0478F27AD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               18E39207A0F5F9B8BC7EE94F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1DA5C6A474916745AFEC6DA5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Carbon.framework;
-                       path = System/Library/Frameworks/Carbon.framework;
-                       sourceTree = SDKROOT;
-               };
-               24425FFB0BCC7E54CADAA013 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               248FAA119A4FC24C522165EF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               253CCF9514FE705169600047 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               26FE7BE182FBB9E7228A082D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3058871156B921B9E5946C4F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = WebKit.framework;
-                       path = System/Library/Frameworks/WebKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               322D3066DCD98A8D0542236A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               429C7CD0E88FC64E9A72514D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MainComponent.h;
-                       path = ../../Source/MainComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               43775DC3D9F7917846EA5327 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               453777CEB7099A5D61901D13 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               50FEDCEF881CC99174035167 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               614F2084407B35D62101F69F = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = AudioPerformanceTest.app;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               77AA9722BAADD4108205501A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7E951216B6138C76653B1460 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               81017699F857F5BBFCA6E055 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               89B3243200BAA6BD72905DBB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               920FF34D4A00A5AD433EE5F4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9516A19EE58DED8326DD0306 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E05B63699A307598B66F829 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EADBF913B7A454B6BE93A4A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               9F28F179EF6B90EB9F4DBEE9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               A3B86BB7483BC5697B58E417 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A65BB8D452A2A4859FA41F8B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AD134CACB71BED6A22743C18 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B06AE97C86D27E7FEBCB4631 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BAFDA8DE51E7A69E477439EB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C8EE61FDD1F06817A014B881 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CBBC98B7CD350A07F5145FB4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D03C9A859FB4DBA8268D7FBA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E575FE2AD2F19FA6AEB536C2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EDD11E2CC0B18196ADA0C87B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EE758AD71415EB31BD3E82F3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = DiscRecording.framework;
-                       path = System/Library/Frameworks/DiscRecording.framework;
-                       sourceTree = SDKROOT;
-               };
-               FAAB4EAE4A57B642D3B9EC23 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9F54D12C977843F8FEFCF041 = {
-                       isa = PBXGroup;
-                       children = (
-                               0564535EEA7E4462926EA0C9,
-                               429C7CD0E88FC64E9A72514D,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               4E2981EC48DBFD725AD8E626 = {
-                       isa = PBXGroup;
-                       children = (
-                               9F54D12C977843F8FEFCF041,
-                       );
-                       name = AudioPerformanceTest;
-                       sourceTree = "<group>";
-               };
-               90489A23F0DBAD5F1550CE20 = {
-                       isa = PBXGroup;
-                       children = (
-                               920FF34D4A00A5AD433EE5F4,
-                               A3B86BB7483BC5697B58E417,
-                               253CCF9514FE705169600047,
-                               D03C9A859FB4DBA8268D7FBA,
-                               CBBC98B7CD350A07F5145FB4,
-                               E575FE2AD2F19FA6AEB536C2,
-                               77AA9722BAADD4108205501A,
-                               81017699F857F5BBFCA6E055,
-                               C8EE61FDD1F06817A014B881,
-                               50FEDCEF881CC99174035167,
-                               AD134CACB71BED6A22743C18,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               0B8996A5E2671A4628476CFB = {
-                       isa = PBXGroup;
-                       children = (
-                               A65BB8D452A2A4859FA41F8B,
-                               89B3243200BAA6BD72905DBB,
-                               322D3066DCD98A8D0542236A,
-                               9E05B63699A307598B66F829,
-                               18E39207A0F5F9B8BC7EE94F,
-                               BAFDA8DE51E7A69E477439EB,
-                               24425FFB0BCC7E54CADAA013,
-                               EDD11E2CC0B18196ADA0C87B,
-                               248FAA119A4FC24C522165EF,
-                               7E951216B6138C76653B1460,
-                               0BC3C6A4F4FC1DD30DD8E17C,
-                               B06AE97C86D27E7FEBCB4631,
-                               26FE7BE182FBB9E7228A082D,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               ED3C55ACC14D6DE2BC3B8A1D = {
-                       isa = PBXGroup;
-                       children = (
-                               9516A19EE58DED8326DD0306,
-                               FAAB4EAE4A57B642D3B9EC23,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               02A7F817D49F2BC1D70F4242 = {
-                       isa = PBXGroup;
-                       children = (
-                               9EADBF913B7A454B6BE93A4A,
-                               18C1CCE5684F9FA0478F27AD,
-                               1DA5C6A474916745AFEC6DA5,
-                               453777CEB7099A5D61901D13,
-                               9F28F179EF6B90EB9F4DBEE9,
-                               12C680C68A15B9A590264B18,
-                               EE758AD71415EB31BD3E82F3,
-                               43775DC3D9F7917846EA5327,
-                               0A58FDDF6FB9253F51939A52,
-                               3058871156B921B9E5946C4F,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               1DFEAF972822E305E013CC06 = {
-                       isa = PBXGroup;
-                       children = (
-                               614F2084407B35D62101F69F,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               3BA1BA0CAFE969E99950C06B = {
-                       isa = PBXGroup;
-                       children = (
-                               4E2981EC48DBFD725AD8E626,
-                               90489A23F0DBAD5F1550CE20,
-                               0B8996A5E2671A4628476CFB,
-                               ED3C55ACC14D6DE2BC3B8A1D,
-                               02A7F817D49F2BC1D70F4242,
-                               1DFEAF972822E305E013CC06,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               19B7C16D592FB25D09022191 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               E1282ABB96DD2E7FA7F63559 = {isa = PBXBuildFile; fileRef = 614F2084407B35D62101F69F; };
+               8A0F71A4EEC7FE694352DD94 = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; };
+               30BE30F31D1AAED9FC893AA5 = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; };
+               9B19A6655FCC8086134C8656 = {isa = PBXBuildFile; fileRef = 1DA5C6A474916745AFEC6DA5; };
+               0319B40AD2FD96007FFA928B = {isa = PBXBuildFile; fileRef = 453777CEB7099A5D61901D13; };
+               5AFD011031C266431687C922 = {isa = PBXBuildFile; fileRef = 9F28F179EF6B90EB9F4DBEE9; };
+               5923A711C0020F2CDD598714 = {isa = PBXBuildFile; fileRef = 12C680C68A15B9A590264B18; };
+               3825E8984D8F6AA00DDC6BAC = {isa = PBXBuildFile; fileRef = EE758AD71415EB31BD3E82F3; };
+               9031C69145EE085B60904363 = {isa = PBXBuildFile; fileRef = 43775DC3D9F7917846EA5327; };
+               F8099BB77DC0D01DCCC6AFB9 = {isa = PBXBuildFile; fileRef = 0A58FDDF6FB9253F51939A52; };
+               537E779F6008999191B2920A = {isa = PBXBuildFile; fileRef = 3058871156B921B9E5946C4F; };
+               DA21A6E7A18555DCFC63B07C = {isa = PBXBuildFile; fileRef = FAAB4EAE4A57B642D3B9EC23; };
+               07451DA87757F9EF80E31BE8 = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; };
+               2BAED5B831BB736E77A718AE = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; };
+               01C9BC9A0A0F54B693CDA31A = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; };
+               48ADBEF873A610909D727C97 = {isa = PBXBuildFile; fileRef = 9E05B63699A307598B66F829; };
+               D145903EE5DBFD1BD98423F3 = {isa = PBXBuildFile; fileRef = 18E39207A0F5F9B8BC7EE94F; };
+               C7B090C29D8DE4D2503204B1 = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; };
+               FFAF94080FF4A9995B33151E = {isa = PBXBuildFile; fileRef = 24425FFB0BCC7E54CADAA013; };
+               D2CECF93178A1738DA02CA4A = {isa = PBXBuildFile; fileRef = EDD11E2CC0B18196ADA0C87B; };
+               7E870C094BAE67D7EB149F1C = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; };
+               65FC2E13B65977FED63BDDE3 = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; };
+               699954AF666E644C7B688381 = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; };
+               9D47995A33BBA693ED435B31 = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; };
+               0564535EEA7E4462926EA0C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               0A58FDDF6FB9253F51939A52 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               0BC3C6A4F4FC1DD30DD8E17C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               12C680C68A15B9A590264B18 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               18C1CCE5684F9FA0478F27AD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               18E39207A0F5F9B8BC7EE94F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               1DA5C6A474916745AFEC6DA5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+               24425FFB0BCC7E54CADAA013 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               248FAA119A4FC24C522165EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               253CCF9514FE705169600047 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               26FE7BE182FBB9E7228A082D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               3058871156B921B9E5946C4F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+               322D3066DCD98A8D0542236A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               429C7CD0E88FC64E9A72514D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+               43775DC3D9F7917846EA5327 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               453777CEB7099A5D61901D13 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               50FEDCEF881CC99174035167 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               614F2084407B35D62101F69F = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioPerformanceTest.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               77AA9722BAADD4108205501A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               7E951216B6138C76653B1460 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               81017699F857F5BBFCA6E055 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               89B3243200BAA6BD72905DBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               920FF34D4A00A5AD433EE5F4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               9516A19EE58DED8326DD0306 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               9E05B63699A307598B66F829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               9EADBF913B7A454B6BE93A4A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               9F28F179EF6B90EB9F4DBEE9 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               A3B86BB7483BC5697B58E417 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               A65BB8D452A2A4859FA41F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               AD134CACB71BED6A22743C18 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               B06AE97C86D27E7FEBCB4631 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               BAFDA8DE51E7A69E477439EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               C8EE61FDD1F06817A014B881 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               CBBC98B7CD350A07F5145FB4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               D03C9A859FB4DBA8268D7FBA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               E575FE2AD2F19FA6AEB536C2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               EDD11E2CC0B18196ADA0C87B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               EE758AD71415EB31BD3E82F3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+               FAAB4EAE4A57B642D3B9EC23 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               9F54D12C977843F8FEFCF041 = {isa = PBXGroup; children = (
+                                       0564535EEA7E4462926EA0C9,
+                                       429C7CD0E88FC64E9A72514D, ); name = Source; sourceTree = "<group>"; };
+               4E2981EC48DBFD725AD8E626 = {isa = PBXGroup; children = (
+                                       9F54D12C977843F8FEFCF041, ); name = AudioPerformanceTest; sourceTree = "<group>"; };
+               90489A23F0DBAD5F1550CE20 = {isa = PBXGroup; children = (
+                                       920FF34D4A00A5AD433EE5F4,
+                                       A3B86BB7483BC5697B58E417,
+                                       253CCF9514FE705169600047,
+                                       D03C9A859FB4DBA8268D7FBA,
+                                       CBBC98B7CD350A07F5145FB4,
+                                       E575FE2AD2F19FA6AEB536C2,
+                                       77AA9722BAADD4108205501A,
+                                       81017699F857F5BBFCA6E055,
+                                       C8EE61FDD1F06817A014B881,
+                                       50FEDCEF881CC99174035167,
+                                       AD134CACB71BED6A22743C18, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               0B8996A5E2671A4628476CFB = {isa = PBXGroup; children = (
+                                       A65BB8D452A2A4859FA41F8B,
+                                       89B3243200BAA6BD72905DBB,
+                                       322D3066DCD98A8D0542236A,
+                                       9E05B63699A307598B66F829,
+                                       18E39207A0F5F9B8BC7EE94F,
+                                       BAFDA8DE51E7A69E477439EB,
+                                       24425FFB0BCC7E54CADAA013,
+                                       EDD11E2CC0B18196ADA0C87B,
+                                       248FAA119A4FC24C522165EF,
+                                       7E951216B6138C76653B1460,
+                                       0BC3C6A4F4FC1DD30DD8E17C,
+                                       B06AE97C86D27E7FEBCB4631,
+                                       26FE7BE182FBB9E7228A082D, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               ED3C55ACC14D6DE2BC3B8A1D = {isa = PBXGroup; children = (
+                                       9516A19EE58DED8326DD0306,
+                                       FAAB4EAE4A57B642D3B9EC23, ); name = Resources; sourceTree = "<group>"; };
+               02A7F817D49F2BC1D70F4242 = {isa = PBXGroup; children = (
+                                       9EADBF913B7A454B6BE93A4A,
+                                       18C1CCE5684F9FA0478F27AD,
+                                       1DA5C6A474916745AFEC6DA5,
+                                       453777CEB7099A5D61901D13,
+                                       9F28F179EF6B90EB9F4DBEE9,
+                                       12C680C68A15B9A590264B18,
+                                       EE758AD71415EB31BD3E82F3,
+                                       43775DC3D9F7917846EA5327,
+                                       0A58FDDF6FB9253F51939A52,
+                                       3058871156B921B9E5946C4F, ); name = Frameworks; sourceTree = "<group>"; };
+               1DFEAF972822E305E013CC06 = {isa = PBXGroup; children = (
+                                       614F2084407B35D62101F69F, ); name = Products; sourceTree = "<group>"; };
+               3BA1BA0CAFE969E99950C06B = {isa = PBXGroup; children = (
+                                       4E2981EC48DBFD725AD8E626,
+                                       90489A23F0DBAD5F1550CE20,
+                                       0B8996A5E2671A4628476CFB,
+                                       ED3C55ACC14D6DE2BC3B8A1D,
+                                       02A7F817D49F2BC1D70F4242,
+                                       1DFEAF972822E305E013CC06, ); name = Source; sourceTree = "<group>"; };
+               19B7C16D592FB25D09022191 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
-                               PRODUCT_NAME = "AudioPerformanceTest";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               B7A6988E30C0A68B01EDC53B = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               B7A6988E30C0A68B01EDC53B = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
-                               PRODUCT_NAME = "AudioPerformanceTest";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               B907CDF95622107F20CD7617 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               B907CDF95622107F20CD7617 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "AudioPerformanceTest";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               BF82CBDF63CC37CADC61A511 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               BF82CBDF63CC37CADC61A511 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "AudioPerformanceTest";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               AA3837ADCB1CEB3B0E2D20B3 = {
-                       isa = PBXTargetDependency;
-                       target = E9FD2656EC625C9C8DE30219;
-               };
-               7097CF6AC086DAC346ACCCD9 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               B907CDF95622107F20CD7617,
-                               BF82CBDF63CC37CADC61A511,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               674C2AF5989C06689C6065FC = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               19B7C16D592FB25D09022191,
-                               B7A6988E30C0A68B01EDC53B,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               C86DD529EC94922C2AB61742 = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               DA21A6E7A18555DCFC63B07C,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               6C2BE2DE2ECC96615ED827AB = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               07451DA87757F9EF80E31BE8,
-                               2BAED5B831BB736E77A718AE,
-                               01C9BC9A0A0F54B693CDA31A,
-                               48ADBEF873A610909D727C97,
-                               D145903EE5DBFD1BD98423F3,
-                               C7B090C29D8DE4D2503204B1,
-                               FFAF94080FF4A9995B33151E,
-                               D2CECF93178A1738DA02CA4A,
-                               7E870C094BAE67D7EB149F1C,
-                               65FC2E13B65977FED63BDDE3,
-                               699954AF666E644C7B688381,
-                               9D47995A33BBA693ED435B31,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               409D569C572B6EF7F4F1702D = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               8A0F71A4EEC7FE694352DD94,
-                               30BE30F31D1AAED9FC893AA5,
-                               9B19A6655FCC8086134C8656,
-                               0319B40AD2FD96007FFA928B,
-                               5AFD011031C266431687C922,
-                               5923A711C0020F2CDD598714,
-                               3825E8984D8F6AA00DDC6BAC,
-                               9031C69145EE085B60904363,
-                               F8099BB77DC0D01DCCC6AFB9,
-                               537E779F6008999191B2920A,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               E9FD2656EC625C9C8DE30219 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = 674C2AF5989C06689C6065FC;
-                       buildPhases = (
-                               C86DD529EC94922C2AB61742,
-                               6C2BE2DE2ECC96615ED827AB,
-                               409D569C572B6EF7F4F1702D,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "AudioPerformanceTest - App";
-                       productName = AudioPerformanceTest;
-                       productReference = 614F2084407B35D62101F69F;
-                       productType = "com.apple.product-type.application";
-               };
-               9CE2A44801B5B4BE7A9667DA = {
-                       isa = PBXProject;
-                       buildConfigurationList = 7097CF6AC086DAC346ACCCD9;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 3BA1BA0CAFE969E99950C06B;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (E9FD2656EC625C9C8DE30219);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               AA3837ADCB1CEB3B0E2D20B3 = {isa = PBXTargetDependency; target = E9FD2656EC625C9C8DE30219; };
+               7097CF6AC086DAC346ACCCD9 = {isa = XCConfigurationList; buildConfigurations = (
+                                       B907CDF95622107F20CD7617,
+                                       BF82CBDF63CC37CADC61A511, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               674C2AF5989C06689C6065FC = {isa = XCConfigurationList; buildConfigurations = (
+                                       19B7C16D592FB25D09022191,
+                                       B7A6988E30C0A68B01EDC53B, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               C86DD529EC94922C2AB61742 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       DA21A6E7A18555DCFC63B07C, ); runOnlyForDeploymentPostprocessing = 0; };
+               6C2BE2DE2ECC96615ED827AB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       07451DA87757F9EF80E31BE8,
+                                       2BAED5B831BB736E77A718AE,
+                                       01C9BC9A0A0F54B693CDA31A,
+                                       48ADBEF873A610909D727C97,
+                                       D145903EE5DBFD1BD98423F3,
+                                       C7B090C29D8DE4D2503204B1,
+                                       FFAF94080FF4A9995B33151E,
+                                       D2CECF93178A1738DA02CA4A,
+                                       7E870C094BAE67D7EB149F1C,
+                                       65FC2E13B65977FED63BDDE3,
+                                       699954AF666E644C7B688381,
+                                       9D47995A33BBA693ED435B31, ); runOnlyForDeploymentPostprocessing = 0; };
+               409D569C572B6EF7F4F1702D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       8A0F71A4EEC7FE694352DD94,
+                                       30BE30F31D1AAED9FC893AA5,
+                                       9B19A6655FCC8086134C8656,
+                                       0319B40AD2FD96007FFA928B,
+                                       5AFD011031C266431687C922,
+                                       5923A711C0020F2CDD598714,
+                                       3825E8984D8F6AA00DDC6BAC,
+                                       9031C69145EE085B60904363,
+                                       F8099BB77DC0D01DCCC6AFB9,
+                                       537E779F6008999191B2920A, ); runOnlyForDeploymentPostprocessing = 0; };
+               E9FD2656EC625C9C8DE30219 = {isa = PBXNativeTarget; buildConfigurationList = 674C2AF5989C06689C6065FC; buildPhases = (
+                                       C86DD529EC94922C2AB61742,
+                                       6C2BE2DE2ECC96615ED827AB,
+                                       409D569C572B6EF7F4F1702D, ); buildRules = ( ); dependencies = (  ); name = "AudioPerformanceTest - App"; productName = AudioPerformanceTest; productReference = 614F2084407B35D62101F69F; productType = "com.apple.product-type.application"; };
+               9CE2A44801B5B4BE7A9667DA = {isa = PBXProject; buildConfigurationList = 7097CF6AC086DAC346ACCCD9; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 3BA1BA0CAFE969E99950C06B; projectDirPath = ""; projectRoot = ""; targets = (E9FD2656EC625C9C8DE30219); };
        };
        rootObject = 9CE2A44801B5B4BE7A9667DA;
 }
index 3b78d9845f37706fa58b6eeb8ade9c2e4a79d653..a7c1f197f14336267158013a3d1cd378e08d86ab 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{78607AE9-F43B-3DDB-0FE1-D745771AF527}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AudioPerformanceTest</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
   <ItemGroup>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
   </ItemGroup>\r
index 1a923753cdf6bc928a1d7d717ba70811584f8fde..f593065254684c6edc5d41f0b3e65f944f80ddaa 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index 60e4b3688d8ab4ff540edf6a7c17e22720b2a9b3..6e39bf51d43df3cb8230f58c83820dea8a8906e7 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               E1282ABB96DD2E7FA7F63559 = {
-                       isa = PBXBuildFile;
-                       fileRef = 614F2084407B35D62101F69F;
-               };
-               8A0F71A4EEC7FE694352DD94 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9EADBF913B7A454B6BE93A4A;
-               };
-               30BE30F31D1AAED9FC893AA5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 18C1CCE5684F9FA0478F27AD;
-               };
-               E74C8479F0E10EC28E1E2DE1 = {
-                       isa = PBXBuildFile;
-                       fileRef = C6030BFC7A19A5075AB0EC28;
-               };
-               5AFD011031C266431687C922 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9F28F179EF6B90EB9F4DBEE9;
-               };
-               71863EE98034AB7C3CBCAA81 = {
-                       isa = PBXBuildFile;
-                       fileRef = 24D90B40648CC05A9B1AA55B;
-               };
-               BF3ECEF0623C9B67C4CEAAF2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6B887CEE009353C410AB4F63;
-               };
-               893A86EF99F57B81286E58A1 = {
-                       isa = PBXBuildFile;
-                       fileRef = F40C1815F7E7E4FBAF3A3091;
-               };
-               5923A711C0020F2CDD598714 = {
-                       isa = PBXBuildFile;
-                       fileRef = 12C680C68A15B9A590264B18;
-               };
-               F749F6DA494103257C9874CC = {
-                       isa = PBXBuildFile;
-                       fileRef = 6406C6755E61B1DC93071FF0;
-               };
-               CC782AABFA20787BABBCED90 = {
-                       isa = PBXBuildFile;
-                       fileRef = E1BB9D521BF6C055F5B88628;
-               };
-               FA27764C3CB8C061B1B787CC = {
-                       isa = PBXBuildFile;
-                       fileRef = 418405DCE48C1B4926143469;
-               };
-               F8099BB77DC0D01DCCC6AFB9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0A58FDDF6FB9253F51939A52;
-               };
-               AA0C9E035BB509F01A09310B = {
-                       isa = PBXBuildFile;
-                       fileRef = 60795BF638A7024B62C0DF09;
-               };
-               A783F6E198806332E7FB9744 = {
-                       isa = PBXBuildFile;
-                       fileRef = 8693552B5FA53C2003A66302;
-               };
-               07451DA87757F9EF80E31BE8 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0564535EEA7E4462926EA0C9;
-               };
-               2BAED5B831BB736E77A718AE = {
-                       isa = PBXBuildFile;
-                       fileRef = 89B3243200BAA6BD72905DBB;
-               };
-               01C9BC9A0A0F54B693CDA31A = {
-                       isa = PBXBuildFile;
-                       fileRef = 322D3066DCD98A8D0542236A;
-               };
-               48ADBEF873A610909D727C97 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9E05B63699A307598B66F829;
-               };
-               D145903EE5DBFD1BD98423F3 = {
-                       isa = PBXBuildFile;
-                       fileRef = 18E39207A0F5F9B8BC7EE94F;
-               };
-               C7B090C29D8DE4D2503204B1 = {
-                       isa = PBXBuildFile;
-                       fileRef = BAFDA8DE51E7A69E477439EB;
-               };
-               FFAF94080FF4A9995B33151E = {
-                       isa = PBXBuildFile;
-                       fileRef = 24425FFB0BCC7E54CADAA013;
-               };
-               D2CECF93178A1738DA02CA4A = {
-                       isa = PBXBuildFile;
-                       fileRef = EDD11E2CC0B18196ADA0C87B;
-               };
-               7E870C094BAE67D7EB149F1C = {
-                       isa = PBXBuildFile;
-                       fileRef = 248FAA119A4FC24C522165EF;
-               };
-               65FC2E13B65977FED63BDDE3 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7E951216B6138C76653B1460;
-               };
-               699954AF666E644C7B688381 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0BC3C6A4F4FC1DD30DD8E17C;
-               };
-               9D47995A33BBA693ED435B31 = {
-                       isa = PBXBuildFile;
-                       fileRef = B06AE97C86D27E7FEBCB4631;
-               };
-               0564535EEA7E4462926EA0C9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0A58FDDF6FB9253F51939A52 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               0BC3C6A4F4FC1DD30DD8E17C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               12C680C68A15B9A590264B18 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               18C1CCE5684F9FA0478F27AD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               18E39207A0F5F9B8BC7EE94F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               24425FFB0BCC7E54CADAA013 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               248FAA119A4FC24C522165EF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               24D90B40648CC05A9B1AA55B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudioKit.framework;
-                       path = System/Library/Frameworks/CoreAudioKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               253CCF9514FE705169600047 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               26FE7BE182FBB9E7228A082D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               322D3066DCD98A8D0542236A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               418405DCE48C1B4926143469 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = MobileCoreServices.framework;
-                       path = System/Library/Frameworks/MobileCoreServices.framework;
-                       sourceTree = SDKROOT;
-               };
-               429C7CD0E88FC64E9A72514D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MainComponent.h;
-                       path = ../../Source/MainComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               50FEDCEF881CC99174035167 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               60795BF638A7024B62C0DF09 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = UIKit.framework;
-                       path = System/Library/Frameworks/UIKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               614F2084407B35D62101F69F = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = AudioPerformanceTest.app;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               6406C6755E61B1DC93071FF0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreText.framework;
-                       path = System/Library/Frameworks/CoreText.framework;
-                       sourceTree = SDKROOT;
-               };
-               6B887CEE009353C410AB4F63 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreGraphics.framework;
-                       path = System/Library/Frameworks/CoreGraphics.framework;
-                       sourceTree = SDKROOT;
-               };
-               77AA9722BAADD4108205501A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7E951216B6138C76653B1460 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               81017699F857F5BBFCA6E055 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8693552B5FA53C2003A66302 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder.assetcatalog;
-                       name = Images.xcassets;
-                       path = AudioPerformanceTest/Images.xcassets;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               89B3243200BAA6BD72905DBB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               920FF34D4A00A5AD433EE5F4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9516A19EE58DED8326DD0306 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E05B63699A307598B66F829 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EADBF913B7A454B6BE93A4A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               9F28F179EF6B90EB9F4DBEE9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               A3B86BB7483BC5697B58E417 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A65BB8D452A2A4859FA41F8B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AD134CACB71BED6A22743C18 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B06AE97C86D27E7FEBCB4631 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BAFDA8DE51E7A69E477439EB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C6030BFC7A19A5075AB0EC28 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               C8EE61FDD1F06817A014B881 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CBBC98B7CD350A07F5145FB4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D03C9A859FB4DBA8268D7FBA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E1BB9D521BF6C055F5B88628 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Foundation.framework;
-                       path = System/Library/Frameworks/Foundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               E575FE2AD2F19FA6AEB536C2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EDD11E2CC0B18196ADA0C87B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F40C1815F7E7E4FBAF3A3091 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreImage.framework;
-                       path = System/Library/Frameworks/CoreImage.framework;
-                       sourceTree = SDKROOT;
-               };
-               9F54D12C977843F8FEFCF041 = {
-                       isa = PBXGroup;
-                       children = (
-                               0564535EEA7E4462926EA0C9,
-                               429C7CD0E88FC64E9A72514D,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               4E2981EC48DBFD725AD8E626 = {
-                       isa = PBXGroup;
-                       children = (
-                               9F54D12C977843F8FEFCF041,
-                       );
-                       name = AudioPerformanceTest;
-                       sourceTree = "<group>";
-               };
-               90489A23F0DBAD5F1550CE20 = {
-                       isa = PBXGroup;
-                       children = (
-                               920FF34D4A00A5AD433EE5F4,
-                               A3B86BB7483BC5697B58E417,
-                               253CCF9514FE705169600047,
-                               D03C9A859FB4DBA8268D7FBA,
-                               CBBC98B7CD350A07F5145FB4,
-                               E575FE2AD2F19FA6AEB536C2,
-                               77AA9722BAADD4108205501A,
-                               81017699F857F5BBFCA6E055,
-                               C8EE61FDD1F06817A014B881,
-                               50FEDCEF881CC99174035167,
-                               AD134CACB71BED6A22743C18,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               0B8996A5E2671A4628476CFB = {
-                       isa = PBXGroup;
-                       children = (
-                               A65BB8D452A2A4859FA41F8B,
-                               89B3243200BAA6BD72905DBB,
-                               322D3066DCD98A8D0542236A,
-                               9E05B63699A307598B66F829,
-                               18E39207A0F5F9B8BC7EE94F,
-                               BAFDA8DE51E7A69E477439EB,
-                               24425FFB0BCC7E54CADAA013,
-                               EDD11E2CC0B18196ADA0C87B,
-                               248FAA119A4FC24C522165EF,
-                               7E951216B6138C76653B1460,
-                               0BC3C6A4F4FC1DD30DD8E17C,
-                               B06AE97C86D27E7FEBCB4631,
-                               26FE7BE182FBB9E7228A082D,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               ED3C55ACC14D6DE2BC3B8A1D = {
-                       isa = PBXGroup;
-                       children = (
-                               9516A19EE58DED8326DD0306,
-                               8693552B5FA53C2003A66302,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               02A7F817D49F2BC1D70F4242 = {
-                       isa = PBXGroup;
-                       children = (
-                               9EADBF913B7A454B6BE93A4A,
-                               18C1CCE5684F9FA0478F27AD,
-                               C6030BFC7A19A5075AB0EC28,
-                               9F28F179EF6B90EB9F4DBEE9,
-                               24D90B40648CC05A9B1AA55B,
-                               6B887CEE009353C410AB4F63,
-                               F40C1815F7E7E4FBAF3A3091,
-                               12C680C68A15B9A590264B18,
-                               6406C6755E61B1DC93071FF0,
-                               E1BB9D521BF6C055F5B88628,
-                               418405DCE48C1B4926143469,
-                               0A58FDDF6FB9253F51939A52,
-                               60795BF638A7024B62C0DF09,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               1DFEAF972822E305E013CC06 = {
-                       isa = PBXGroup;
-                       children = (
-                               614F2084407B35D62101F69F,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               3BA1BA0CAFE969E99950C06B = {
-                       isa = PBXGroup;
-                       children = (
-                               4E2981EC48DBFD725AD8E626,
-                               90489A23F0DBAD5F1550CE20,
-                               0B8996A5E2671A4628476CFB,
-                               ED3C55ACC14D6DE2BC3B8A1D,
-                               02A7F817D49F2BC1D70F4242,
-                               1DFEAF972822E305E013CC06,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               19B7C16D592FB25D09022191 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               E1282ABB96DD2E7FA7F63559 = {isa = PBXBuildFile; fileRef = 614F2084407B35D62101F69F; };
+               8A0F71A4EEC7FE694352DD94 = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; };
+               30BE30F31D1AAED9FC893AA5 = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; };
+               E74C8479F0E10EC28E1E2DE1 = {isa = PBXBuildFile; fileRef = C6030BFC7A19A5075AB0EC28; };
+               5AFD011031C266431687C922 = {isa = PBXBuildFile; fileRef = 9F28F179EF6B90EB9F4DBEE9; };
+               71863EE98034AB7C3CBCAA81 = {isa = PBXBuildFile; fileRef = 24D90B40648CC05A9B1AA55B; };
+               BF3ECEF0623C9B67C4CEAAF2 = {isa = PBXBuildFile; fileRef = 6B887CEE009353C410AB4F63; };
+               893A86EF99F57B81286E58A1 = {isa = PBXBuildFile; fileRef = F40C1815F7E7E4FBAF3A3091; };
+               5923A711C0020F2CDD598714 = {isa = PBXBuildFile; fileRef = 12C680C68A15B9A590264B18; };
+               F749F6DA494103257C9874CC = {isa = PBXBuildFile; fileRef = 6406C6755E61B1DC93071FF0; };
+               CC782AABFA20787BABBCED90 = {isa = PBXBuildFile; fileRef = E1BB9D521BF6C055F5B88628; };
+               FA27764C3CB8C061B1B787CC = {isa = PBXBuildFile; fileRef = 418405DCE48C1B4926143469; };
+               F8099BB77DC0D01DCCC6AFB9 = {isa = PBXBuildFile; fileRef = 0A58FDDF6FB9253F51939A52; };
+               AA0C9E035BB509F01A09310B = {isa = PBXBuildFile; fileRef = 60795BF638A7024B62C0DF09; };
+               A783F6E198806332E7FB9744 = {isa = PBXBuildFile; fileRef = 8693552B5FA53C2003A66302; };
+               07451DA87757F9EF80E31BE8 = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; };
+               2BAED5B831BB736E77A718AE = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; };
+               01C9BC9A0A0F54B693CDA31A = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; };
+               48ADBEF873A610909D727C97 = {isa = PBXBuildFile; fileRef = 9E05B63699A307598B66F829; };
+               D145903EE5DBFD1BD98423F3 = {isa = PBXBuildFile; fileRef = 18E39207A0F5F9B8BC7EE94F; };
+               C7B090C29D8DE4D2503204B1 = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; };
+               FFAF94080FF4A9995B33151E = {isa = PBXBuildFile; fileRef = 24425FFB0BCC7E54CADAA013; };
+               D2CECF93178A1738DA02CA4A = {isa = PBXBuildFile; fileRef = EDD11E2CC0B18196ADA0C87B; };
+               7E870C094BAE67D7EB149F1C = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; };
+               65FC2E13B65977FED63BDDE3 = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; };
+               699954AF666E644C7B688381 = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; };
+               9D47995A33BBA693ED435B31 = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; };
+               0564535EEA7E4462926EA0C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               0A58FDDF6FB9253F51939A52 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               0BC3C6A4F4FC1DD30DD8E17C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               12C680C68A15B9A590264B18 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               18C1CCE5684F9FA0478F27AD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               18E39207A0F5F9B8BC7EE94F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               24425FFB0BCC7E54CADAA013 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               248FAA119A4FC24C522165EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               24D90B40648CC05A9B1AA55B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+               253CCF9514FE705169600047 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               26FE7BE182FBB9E7228A082D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               322D3066DCD98A8D0542236A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               418405DCE48C1B4926143469 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+               429C7CD0E88FC64E9A72514D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+               50FEDCEF881CC99174035167 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               60795BF638A7024B62C0DF09 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+               614F2084407B35D62101F69F = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioPerformanceTest.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               6406C6755E61B1DC93071FF0 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+               6B887CEE009353C410AB4F63 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+               77AA9722BAADD4108205501A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               7E951216B6138C76653B1460 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               81017699F857F5BBFCA6E055 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               8693552B5FA53C2003A66302 = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioPerformanceTest/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+               89B3243200BAA6BD72905DBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               920FF34D4A00A5AD433EE5F4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               9516A19EE58DED8326DD0306 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               9E05B63699A307598B66F829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               9EADBF913B7A454B6BE93A4A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               9F28F179EF6B90EB9F4DBEE9 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               A3B86BB7483BC5697B58E417 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               A65BB8D452A2A4859FA41F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               AD134CACB71BED6A22743C18 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               B06AE97C86D27E7FEBCB4631 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               BAFDA8DE51E7A69E477439EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               C6030BFC7A19A5075AB0EC28 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               C8EE61FDD1F06817A014B881 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               CBBC98B7CD350A07F5145FB4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               D03C9A859FB4DBA8268D7FBA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               E1BB9D521BF6C055F5B88628 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+               E575FE2AD2F19FA6AEB536C2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               EDD11E2CC0B18196ADA0C87B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               F40C1815F7E7E4FBAF3A3091 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+               9F54D12C977843F8FEFCF041 = {isa = PBXGroup; children = (
+                                       0564535EEA7E4462926EA0C9,
+                                       429C7CD0E88FC64E9A72514D, ); name = Source; sourceTree = "<group>"; };
+               4E2981EC48DBFD725AD8E626 = {isa = PBXGroup; children = (
+                                       9F54D12C977843F8FEFCF041, ); name = AudioPerformanceTest; sourceTree = "<group>"; };
+               90489A23F0DBAD5F1550CE20 = {isa = PBXGroup; children = (
+                                       920FF34D4A00A5AD433EE5F4,
+                                       A3B86BB7483BC5697B58E417,
+                                       253CCF9514FE705169600047,
+                                       D03C9A859FB4DBA8268D7FBA,
+                                       CBBC98B7CD350A07F5145FB4,
+                                       E575FE2AD2F19FA6AEB536C2,
+                                       77AA9722BAADD4108205501A,
+                                       81017699F857F5BBFCA6E055,
+                                       C8EE61FDD1F06817A014B881,
+                                       50FEDCEF881CC99174035167,
+                                       AD134CACB71BED6A22743C18, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               0B8996A5E2671A4628476CFB = {isa = PBXGroup; children = (
+                                       A65BB8D452A2A4859FA41F8B,
+                                       89B3243200BAA6BD72905DBB,
+                                       322D3066DCD98A8D0542236A,
+                                       9E05B63699A307598B66F829,
+                                       18E39207A0F5F9B8BC7EE94F,
+                                       BAFDA8DE51E7A69E477439EB,
+                                       24425FFB0BCC7E54CADAA013,
+                                       EDD11E2CC0B18196ADA0C87B,
+                                       248FAA119A4FC24C522165EF,
+                                       7E951216B6138C76653B1460,
+                                       0BC3C6A4F4FC1DD30DD8E17C,
+                                       B06AE97C86D27E7FEBCB4631,
+                                       26FE7BE182FBB9E7228A082D, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               ED3C55ACC14D6DE2BC3B8A1D = {isa = PBXGroup; children = (
+                                       9516A19EE58DED8326DD0306,
+                                       8693552B5FA53C2003A66302, ); name = Resources; sourceTree = "<group>"; };
+               02A7F817D49F2BC1D70F4242 = {isa = PBXGroup; children = (
+                                       9EADBF913B7A454B6BE93A4A,
+                                       18C1CCE5684F9FA0478F27AD,
+                                       C6030BFC7A19A5075AB0EC28,
+                                       9F28F179EF6B90EB9F4DBEE9,
+                                       24D90B40648CC05A9B1AA55B,
+                                       6B887CEE009353C410AB4F63,
+                                       F40C1815F7E7E4FBAF3A3091,
+                                       12C680C68A15B9A590264B18,
+                                       6406C6755E61B1DC93071FF0,
+                                       E1BB9D521BF6C055F5B88628,
+                                       418405DCE48C1B4926143469,
+                                       0A58FDDF6FB9253F51939A52,
+                                       60795BF638A7024B62C0DF09, ); name = Frameworks; sourceTree = "<group>"; };
+               1DFEAF972822E305E013CC06 = {isa = PBXGroup; children = (
+                                       614F2084407B35D62101F69F, ); name = Products; sourceTree = "<group>"; };
+               3BA1BA0CAFE969E99950C06B = {isa = PBXGroup; children = (
+                                       4E2981EC48DBFD725AD8E626,
+                                       90489A23F0DBAD5F1550CE20,
+                                       0B8996A5E2671A4628476CFB,
+                                       ED3C55ACC14D6DE2BC3B8A1D,
+                                       02A7F817D49F2BC1D70F4242,
+                                       1DFEAF972822E305E013CC06, ); name = Source; sourceTree = "<group>"; };
+               19B7C16D592FB25D09022191 = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
-                               PRODUCT_NAME = "AudioPerformanceTest";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               B7A6988E30C0A68B01EDC53B = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               B7A6988E30C0A68B01EDC53B = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
-                               PRODUCT_NAME = "AudioPerformanceTest";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               B907CDF95622107F20CD7617 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Release; };
+               B907CDF95622107F20CD7617 = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               BF82CBDF63CC37CADC61A511 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               BF82CBDF63CC37CADC61A511 = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               AA3837ADCB1CEB3B0E2D20B3 = {
-                       isa = PBXTargetDependency;
-                       target = E9FD2656EC625C9C8DE30219;
-               };
-               7097CF6AC086DAC346ACCCD9 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               B907CDF95622107F20CD7617,
-                               BF82CBDF63CC37CADC61A511,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               674C2AF5989C06689C6065FC = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               19B7C16D592FB25D09022191,
-                               B7A6988E30C0A68B01EDC53B,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               C86DD529EC94922C2AB61742 = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               A783F6E198806332E7FB9744,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               6C2BE2DE2ECC96615ED827AB = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               07451DA87757F9EF80E31BE8,
-                               2BAED5B831BB736E77A718AE,
-                               01C9BC9A0A0F54B693CDA31A,
-                               48ADBEF873A610909D727C97,
-                               D145903EE5DBFD1BD98423F3,
-                               C7B090C29D8DE4D2503204B1,
-                               FFAF94080FF4A9995B33151E,
-                               D2CECF93178A1738DA02CA4A,
-                               7E870C094BAE67D7EB149F1C,
-                               65FC2E13B65977FED63BDDE3,
-                               699954AF666E644C7B688381,
-                               9D47995A33BBA693ED435B31,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               409D569C572B6EF7F4F1702D = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               8A0F71A4EEC7FE694352DD94,
-                               30BE30F31D1AAED9FC893AA5,
-                               E74C8479F0E10EC28E1E2DE1,
-                               5AFD011031C266431687C922,
-                               71863EE98034AB7C3CBCAA81,
-                               BF3ECEF0623C9B67C4CEAAF2,
-                               893A86EF99F57B81286E58A1,
-                               5923A711C0020F2CDD598714,
-                               F749F6DA494103257C9874CC,
-                               CC782AABFA20787BABBCED90,
-                               FA27764C3CB8C061B1B787CC,
-                               F8099BB77DC0D01DCCC6AFB9,
-                               AA0C9E035BB509F01A09310B,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               E9FD2656EC625C9C8DE30219 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = 674C2AF5989C06689C6065FC;
-                       buildPhases = (
-                               C86DD529EC94922C2AB61742,
-                               6C2BE2DE2ECC96615ED827AB,
-                               409D569C572B6EF7F4F1702D,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "AudioPerformanceTest - App";
-                       productName = AudioPerformanceTest;
-                       productReference = 614F2084407B35D62101F69F;
-                       productType = "com.apple.product-type.application";
-               };
-               9CE2A44801B5B4BE7A9667DA = {
-                       isa = PBXProject;
-                       buildConfigurationList = 7097CF6AC086DAC346ACCCD9;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 3BA1BA0CAFE969E99950C06B;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (E9FD2656EC625C9C8DE30219);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               AA3837ADCB1CEB3B0E2D20B3 = {isa = PBXTargetDependency; target = E9FD2656EC625C9C8DE30219; };
+               7097CF6AC086DAC346ACCCD9 = {isa = XCConfigurationList; buildConfigurations = (
+                                       B907CDF95622107F20CD7617,
+                                       BF82CBDF63CC37CADC61A511, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               674C2AF5989C06689C6065FC = {isa = XCConfigurationList; buildConfigurations = (
+                                       19B7C16D592FB25D09022191,
+                                       B7A6988E30C0A68B01EDC53B, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               C86DD529EC94922C2AB61742 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       A783F6E198806332E7FB9744, ); runOnlyForDeploymentPostprocessing = 0; };
+               6C2BE2DE2ECC96615ED827AB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       07451DA87757F9EF80E31BE8,
+                                       2BAED5B831BB736E77A718AE,
+                                       01C9BC9A0A0F54B693CDA31A,
+                                       48ADBEF873A610909D727C97,
+                                       D145903EE5DBFD1BD98423F3,
+                                       C7B090C29D8DE4D2503204B1,
+                                       FFAF94080FF4A9995B33151E,
+                                       D2CECF93178A1738DA02CA4A,
+                                       7E870C094BAE67D7EB149F1C,
+                                       65FC2E13B65977FED63BDDE3,
+                                       699954AF666E644C7B688381,
+                                       9D47995A33BBA693ED435B31, ); runOnlyForDeploymentPostprocessing = 0; };
+               409D569C572B6EF7F4F1702D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       8A0F71A4EEC7FE694352DD94,
+                                       30BE30F31D1AAED9FC893AA5,
+                                       E74C8479F0E10EC28E1E2DE1,
+                                       5AFD011031C266431687C922,
+                                       71863EE98034AB7C3CBCAA81,
+                                       BF3ECEF0623C9B67C4CEAAF2,
+                                       893A86EF99F57B81286E58A1,
+                                       5923A711C0020F2CDD598714,
+                                       F749F6DA494103257C9874CC,
+                                       CC782AABFA20787BABBCED90,
+                                       FA27764C3CB8C061B1B787CC,
+                                       F8099BB77DC0D01DCCC6AFB9,
+                                       AA0C9E035BB509F01A09310B, ); runOnlyForDeploymentPostprocessing = 0; };
+               E9FD2656EC625C9C8DE30219 = {isa = PBXNativeTarget; buildConfigurationList = 674C2AF5989C06689C6065FC; buildPhases = (
+                                       C86DD529EC94922C2AB61742,
+                                       6C2BE2DE2ECC96615ED827AB,
+                                       409D569C572B6EF7F4F1702D, ); buildRules = ( ); dependencies = (  ); name = "AudioPerformanceTest - App"; productName = AudioPerformanceTest; productReference = 614F2084407B35D62101F69F; productType = "com.apple.product-type.application"; };
+               9CE2A44801B5B4BE7A9667DA = {isa = PBXProject; buildConfigurationList = 7097CF6AC086DAC346ACCCD9; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 3BA1BA0CAFE969E99950C06B; projectDirPath = ""; projectRoot = ""; targets = (E9FD2656EC625C9C8DE30219); };
        };
        rootObject = 9CE2A44801B5B4BE7A9667DA;
 }
index 79b8844d90d1df0aec75d62faa7e31f314c715bf..29b0ea00b56dcd17472c4d4ee0651056acc651b7 100644 (file)
 //==============================================================================\r
 // juce_audio_devices flags:\r
 \r
-#ifndef    JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 #ifndef    JUCE_ASIO\r
  //#define JUCE_ASIO 0\r
 #endif\r
  //#define JUCE_USE_ANDROID_OPENSLES 0\r
 #endif\r
 \r
+#ifndef    JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 #ifndef    JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
  //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
 #endif\r
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
  //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_events flags:\r
 \r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
  //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0\r
 #endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index 82feea7ca6fd5d592fa262f4b732576d61909f5c..b4ce63a87872870406ee91814cdc40aaf6c33ff6 100644 (file)
@@ -37,7 +37,6 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "AudioPerformanceTest";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
     const char* const  versionString  = "1.0.0";\r
     const int          versionNumber  = 0x10000;\r
 }\r
index c1f30a99eb60c95612e1ca79701e08fb162246f0..074a4754b833d9ab7645affba48ba3d3ec0762b2 100644 (file)
@@ -2,13 +2,13 @@
 \r
 <JUCERPROJECT id="NTe0XB0ij" name="AudioPluginHost" projectType="guiapp" version="1.0.0"\r
               juceFolder="../../../juce" vstFolderMac="~/SDKs/vstsdk2.4" vstFolderPC="c:\SDKs\vstsdk2.4"\r
-              bundleIdentifier="com.roli.juce.pluginhost" jucerVersion="5.4.1"\r
+              bundleIdentifier="com.roli.juce.pluginhost" jucerVersion="5.3.1"\r
               companyName="ROLI Ltd." displaySplashScreen="0" reportAppUsage="0"\r
               companyCopyright="ROLI Ltd.">\r
   <EXPORTFORMATS>\r
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="" rtasFolder="~/SDKs/PT_80_SDK"\r
-               objCExtraSuffix="M73TRi" extraCompilerFlags="-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi"\r
-               smallIcon="c97aUr" bigIcon="c97aUr" microphonePermissionNeeded="1">\r
+               objCExtraSuffix="M73TRi" vst3Folder="" extraCompilerFlags="-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi"\r
+               smallIcon="c97aUr" bigIcon="c97aUr">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost"/>\r
         <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="AudioPluginHost"/>\r
@@ -54,8 +54,8 @@
         <MODULEPATH id="juce_audio_basics" path="../../modules"/>\r
       </MODULEPATHS>\r
     </LINUX_MAKE>\r
-    <VS2013 targetFolder="Builds/VisualStudio2013" vstFolder="" smallIcon="c97aUr"\r
-            bigIcon="c97aUr">\r
+    <VS2013 targetFolder="Builds/VisualStudio2013" vstFolder="" vst3Folder=""\r
+            smallIcon="c97aUr" bigIcon="c97aUr">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" winArchitecture="32-bit" isDebug="1" optimisation="1"\r
                        targetName="AudioPluginHost"/>\r
@@ -79,8 +79,8 @@
         <MODULEPATH id="juce_audio_basics" path="../../modules"/>\r
       </MODULEPATHS>\r
     </VS2013>\r
-    <VS2015 targetFolder="Builds/VisualStudio2015" vstFolder="" smallIcon="c97aUr"\r
-            bigIcon="c97aUr">\r
+    <VS2015 targetFolder="Builds/VisualStudio2015" vstFolder="" vst3Folder=""\r
+            smallIcon="c97aUr" bigIcon="c97aUr">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost"/>\r
         <CONFIGURATION name="Release" isDebug="0" targetName="AudioPluginHost" debugInformationFormat="ProgramDatabase"/>\r
         <MODULEPATH id="juce_audio_basics" path="../../modules"/>\r
       </MODULEPATHS>\r
     </VS2015>\r
-    <VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="c97aUr" bigIcon="c97aUr"\r
-            extraCompilerFlags="/w44265 /w45038 /w44062">\r
+    <VS2017 targetFolder="Builds/VisualStudio2017" vst3Folder="" smallIcon="c97aUr"\r
+            bigIcon="c97aUr">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost"/>\r
         <CONFIGURATION name="Release" isDebug="0" targetName="AudioPluginHost" debugInformationFormat="ProgramDatabase"/>\r
     </VS2017>\r
     <XCODE_IPHONE targetFolder="Builds/iOS" iosScreenOrientation="portraitlandscape"\r
                   iPadScreenOrientation="portraitlandscape" iosDeviceFamily="1,2"\r
-                  microphonePermissionNeeded="1" iosBackgroundAudio="1" iosBackgroundBle="1"\r
-                  smallIcon="c97aUr" bigIcon="c97aUr">\r
+                  vst3Folder="" microphonePermissionNeeded="1" iosBackgroundAudio="1"\r
+                  iosBackgroundBle="1" smallIcon="c97aUr" bigIcon="c97aUr">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" enablePluginBinaryCopyStep="1" isDebug="1" optimisation="1"\r
                        linkTimeOptimisation="0" targetName="Plugin Host"/>\r
                    androidMinimumSDK="23" androidInternetNeeded="1" microphonePermissionNeeded="1"\r
                    androidBluetoothNeeded="1" smallIcon="c97aUr" bigIcon="c97aUr">\r
       <CONFIGURATIONS>\r
-        <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
-                       optimisation="1" linkTimeOptimisation="0" targetName="Plugin Host"/>\r
+        <CONFIGURATION name="Debug" androidArchitectures="armeabi x86" isDebug="1" optimisation="1"\r
+                       linkTimeOptimisation="0" targetName="Plugin Host"/>\r
         <CONFIGURATION name="Release" androidArchitectures="" isDebug="0" optimisation="3"\r
                        linkTimeOptimisation="1" targetName="Plugin Host"/>\r
       </CONFIGURATIONS>\r
   </MAINGROUP>\r
   <JUCEOPTIONS JUCE_WASAPI="1" JUCE_DIRECTSOUND="1" JUCE_ALSA="1" JUCE_QUICKTIME="disabled"\r
                JUCE_USE_FLAC="0" JUCE_USE_OGGVORBIS="0" JUCE_USE_CDBURNER="0"\r
-               JUCE_USE_CDREADER="0" JUCE_USE_CAMERA="0" JUCE_PLUGINHOST_AU="1"\r
-               JUCE_WEB_BROWSER="0" JUCE_PLUGINHOST_VST3="1" JUCE_PLUGINHOST_LADSPA="1"/>\r
+               JUCE_USE_CDREADER="0" JUCE_USE_CAMERA="0" JUCE_PLUGINHOST_VST="1"\r
+               JUCE_PLUGINHOST_AU="1" JUCE_WEB_BROWSER="0" JUCE_PLUGINHOST_VST3="1"\r
+               JUCE_PLUGINHOST_LADSPA="1"/>\r
   <MODULES>\r
     <MODULE id="juce_audio_basics" showAllCode="1"/>\r
     <MODULE id="juce_audio_devices" showAllCode="1"/>\r
index 937852bf085cc0ab1c51a59214138e6cb8266ca0..3b05e76a115b270b9917d782eac024154f18e51e 100644 (file)
@@ -11,7 +11,6 @@ set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-feat
 add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_roli_juce_pluginhost_AudioPluginHost" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/roli/juce/pluginhost/AudioPluginHost\"" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSNAME=com_roli_juce_pluginhost_SharingContentProvider" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH=\"com/roli/juce/pluginhost/SharingContentProvider\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000")\r
 \r
 include_directories( AFTER\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK"\r
     "../../../JuceLibraryCode"\r
     "../../../../../modules"\r
     "${ANDROID_NDK}/sources/android/cpufeatures"\r
@@ -54,8 +53,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
@@ -319,91 +316,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
@@ -415,6 +327,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+    "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
@@ -428,8 +341,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
@@ -448,7 +359,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
-    "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
@@ -490,8 +400,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
     "../../../../../modules/juce_core/containers/juce_Array.h"\r
     "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
     "../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
@@ -501,11 +409,9 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
-    "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
-    "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
     "../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
@@ -552,7 +458,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
     "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
     "../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
-    "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_Memory.h"\r
     "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
@@ -563,8 +468,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
     "../../../../../modules/juce_core/memory/juce_Singleton.h"\r
     "../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
     "../../../../../modules/juce_core/misc/juce_Result.cpp"\r
     "../../../../../modules/juce_core/misc/juce_Result.h"\r
     "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
@@ -595,7 +498,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
     "../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
     "../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
-    "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
     "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
     "../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
     "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
@@ -776,8 +678,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
     "../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
@@ -1007,12 +907,10 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
@@ -1273,7 +1171,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
-    "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
     "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
@@ -1354,7 +1251,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"\r
     "../../../../../modules/juce_video/capture/juce_CameraDevice.h"\r
     "../../../../../modules/juce_video/native/juce_android_CameraDevice.h"\r
-    "../../../../../modules/juce_video/native/juce_android_Video.h"\r
     "../../../../../modules/juce_video/native/juce_ios_CameraDevice.h"\r
     "../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"\r
     "../../../../../modules/juce_video/native/juce_mac_Video.h"\r
@@ -1397,8 +1293,6 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/ju
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1662,91 +1556,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1758,6 +1567,7 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1771,8 +1581,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/proces
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1791,7 +1599,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/utilit
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1833,8 +1640,6 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Ab
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1844,11 +1649,9 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Li
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1895,7 +1698,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1906,8 +1708,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Scoped
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1938,7 +1738,6 @@ set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_St
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2119,8 +1918,6 @@ set_source_files_properties("../../../../../modules/juce_events/interprocess/juc
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2350,12 +2147,10 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/components/j
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2616,7 +2411,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juc
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2697,7 +2491,6 @@ set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" P
 set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
index 31fc97b388a4caa75067340dfba0953ef59cde1a..e6e07fc1a627ff8b75e65823630cd57b721a3389 100644 (file)
@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
 \r
 android {\r
     compileSdkVersion 23\r
-    buildToolsVersion "28.0.0"\r
+    buildToolsVersion "27.0.3"\r
     externalNativeBuild {\r
         cmake {\r
             path "CMakeLists.txt"\r
@@ -50,7 +50,7 @@ android {
     productFlavors {\r
         debug_ {\r
             ndk {\r
-                abiFilters "armeabi-v7a", "x86"\r
+                abiFilters "armeabi", "x86"\r
             }\r
             externalNativeBuild {\r
                 cmake {\r
index 7a68c4f7d9546687b0176f2851ccc11983181159..df2ca3d5e2bf6c7c06489d400b23f901e21f9402 100644 (file)
@@ -3,6 +3,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
           package="com.roli.juce.pluginhost">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+  <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
index 64ef716482a9734d49c646b4ef7e9d545b15e6be..2b62f5a596df7519dac15fde7bb6450722a25c54 100644 (file)
@@ -31,9 +31,6 @@ import android.content.res.Configuration;
 import android.content.pm.PackageInfo;\r
 import android.content.pm.PackageManager;\r
 import android.hardware.camera2.*;\r
-import android.database.ContentObserver;\r
-import android.media.session.*;\r
-import android.media.MediaMetadata;\r
 import android.net.http.SslError;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
@@ -97,11 +94,8 @@ public class AudioPluginHost   extends Activity
     //==============================================================================\r
     public boolean isPermissionDeclaredInManifest (int permissionID)\r
     {\r
-        return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
-    }\r
+        String permissionToCheck = getAndroidPermissionName(permissionID);\r
 \r
-    public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
-    {\r
         try\r
         {\r
             PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
@@ -1494,9 +1488,7 @@ public class AudioPluginHost   extends Activity
     public final String getClipboardContent()\r
     {\r
         ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
-        CharSequence content = clipboard.getText();\r
-        return content != null ? content.toString() : new String();\r
+        return clipboard.getText().toString();\r
     }\r
 \r
     public final void setClipboardContent (String newText)\r
@@ -2005,13 +1997,11 @@ public class AudioPluginHost   extends Activity
                                           implements SurfaceHolder.Callback\r
     {\r
         private long nativeContext = 0;\r
-        private boolean forVideo;\r
 \r
-        NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+        NativeSurfaceView (Context context, long nativeContextPtr)\r
         {\r
             super (context);\r
             nativeContext = nativeContextPtr;\r
-            forVideo = createdForVideo;\r
         }\r
 \r
         public Surface getNativeSurface()\r
@@ -2029,51 +2019,38 @@ public class AudioPluginHost   extends Activity
         @Override\r
         public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
         {\r
-            if (forVideo)\r
-                surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
-            else\r
-                surfaceChangedNative (nativeContext, holder, format, width, height);\r
+            surfaceChangedNative (nativeContext, holder, format, width, height);\r
         }\r
 \r
         @Override\r
         public void surfaceCreated (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceCreatedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceCreatedNative (nativeContext, holder);\r
+            surfaceCreatedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         public void surfaceDestroyed (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceDestroyedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceDestroyedNative (nativeContext, holder);\r
+            surfaceDestroyedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         protected void dispatchDraw (Canvas canvas)\r
         {\r
             super.dispatchDraw (canvas);\r
-\r
-            if (forVideo)\r
-                dispatchDrawNativeVideo (nativeContext, canvas);\r
-            else\r
-                dispatchDrawNative (nativeContext, canvas);\r
+            dispatchDrawNative (nativeContext, canvas);\r
         }\r
 \r
         //==============================================================================\r
         @Override\r
-        protected void onAttachedToWindow()\r
+        protected void onAttachedToWindow ()\r
         {\r
             super.onAttachedToWindow();\r
             getHolder().addCallback (this);\r
         }\r
 \r
         @Override\r
-        protected void onDetachedFromWindow()\r
+        protected void onDetachedFromWindow ()\r
         {\r
             super.onDetachedFromWindow();\r
             getHolder().removeCallback (this);\r
@@ -2085,17 +2062,11 @@ public class AudioPluginHost   extends Activity
         private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
         private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
                                                   int format, int width, int height);\r
-\r
-        private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
-        private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
-                                                       int format, int width, int height);\r
     }\r
 \r
-    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
     {\r
-        return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+        return new NativeSurfaceView (this, nativeSurfacePtr);\r
     }\r
 \r
     //==============================================================================\r
@@ -2855,151 +2826,6 @@ public class AudioPluginHost   extends Activity
     }\r
 \r
 \r
-    //==============================================================================\r
-    public class MediaControllerCallback  extends MediaController.Callback\r
-    {\r
-        private native void mediaControllerAudioInfoChanged     (long host, MediaController.PlaybackInfo info);\r
-        private native void mediaControllerMetadataChanged      (long host, MediaMetadata metadata);\r
-        private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
-        private native void mediaControllerSessionDestroyed     (long host);\r
-\r
-        MediaControllerCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
-        {\r
-            mediaControllerAudioInfoChanged (host, info);\r
-        }\r
-\r
-        @Override\r
-        public void onMetadataChanged (MediaMetadata metadata)\r
-        {\r
-            mediaControllerMetadataChanged (host, metadata);\r
-        }\r
-\r
-        @Override\r
-        public void onPlaybackStateChanged (PlaybackState state)\r
-        {\r
-             mediaControllerPlaybackStateChanged (host, state);\r
-        }\r
-\r
-        @Override\r
-        public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
-        @Override\r
-        public void onSessionDestroyed()\r
-        {\r
-            mediaControllerSessionDestroyed (host);\r
-        }\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class MediaSessionCallback  extends MediaSession.Callback\r
-    {\r
-        private native void mediaSessionPause           (long host);\r
-        private native void mediaSessionPlay            (long host);\r
-        private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
-        private native void mediaSessionSeekTo          (long host, long pos);\r
-        private native void mediaSessionStop            (long host);\r
-\r
-\r
-        MediaSessionCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onPause()\r
-        {\r
-            mediaSessionPause (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlay()\r
-        {\r
-            mediaSessionPlay (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlayFromMediaId (String mediaId, Bundle extras)\r
-        {\r
-            mediaSessionPlayFromMediaId (host, mediaId, extras);\r
-        }\r
-\r
-        @Override\r
-        public void onSeekTo (long pos)\r
-        {\r
-            mediaSessionSeekTo (host, pos);\r
-        }\r
-\r
-        @Override\r
-        public void onStop()\r
-        {\r
-            mediaSessionStop (host);\r
-        }\r
-\r
-        @Override\r
-        public void onFastForward() {}\r
-\r
-        @Override\r
-        public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
-        {\r
-            return true;\r
-        }\r
-\r
-        @Override\r
-        public void onRewind() {}\r
-\r
-        @Override\r
-        public void onSkipToNext() {}\r
-\r
-        @Override\r
-        public void onSkipToPrevious() {}\r
-\r
-        @Override\r
-        public void onSkipToQueueItem (long id) {}\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class SystemVolumeObserver extends ContentObserver\r
-    {\r
-        private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
-        SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
-        {\r
-            super (null);\r
-\r
-            activity = activityToUse;\r
-            host = hostToUse;\r
-        }\r
-\r
-        void setEnabled (boolean shouldBeEnabled)\r
-        {\r
-            if (shouldBeEnabled)\r
-                activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
-            else\r
-                activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
-        }\r
-\r
-        @Override\r
-        public void onChange (boolean selfChange, Uri uri)\r
-        {\r
-            if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
-                mediaSessionSystemVolumeChanged (host);\r
-        }\r
-\r
-        private Activity activity;\r
-        private long host;\r
-    }\r
-\r
-\r
     //==============================================================================\r
     public static final String getLocaleValue (boolean isRegion)\r
     {\r
index 647f509e9ca3df4e45bee9a59ceebfc5067d81fe..651d63db63bdd2bf53a574bdde786ac927b14169 100644 (file)
@@ -4,7 +4,7 @@ buildscript {
        jcenter()\r
    }\r
    dependencies {\r
-       classpath 'com.android.tools.build:gradle:3.1.3'\r
+       classpath 'com.android.tools.build:gradle:3.1.1'\r
    }\r
 }\r
 \r
index a43b4166b963a3c3732535b6c44618ea0dcdf1c4..2d619282be2b1e4fad11aa15991829e7920ef66f 100644 (file)
@@ -35,13 +35,13 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := AudioPluginHost\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -56,13 +56,13 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := AudioPluginHost\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -90,13 +90,11 @@ OBJECTS_APP := \
   $(JUCE_OBJDIR)/include_juce_opengl_a8a032b.o \\r
   $(JUCE_OBJDIR)/include_juce_video_be78589.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors alsa freetype2 x11 xext xinerama libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
        @echo Linking "AudioPluginHost - App"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -208,6 +206,10 @@ $(JUCE_OBJDIR)/include_juce_video_be78589.o: ../../JuceLibraryCode/include_juce_
        @echo "Compiling include_juce_video.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama\r
+\r
 clean:\r
        @echo Cleaning AudioPluginHost\r
        $(V_AT)$(CLEANCMD)\r
index 7b2e79b647590fae374dd17ca662e785a93bcf29..58f02ecb50eeb6f7464fe05bd8a61ac12c3ad03f 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               FCDB1F8A93F59E0F97821456 = {
-                       isa = PBXBuildFile;
-                       fileRef = 8D8BBC353637DA442C5575DA;
-               };
-               73E371F1B912FCCAE0CD7E5D = {
-                       isa = PBXBuildFile;
-                       fileRef = 86CA337014D3F67E906FFD28;
-               };
-               21D330A5B13178B12BEAFC3C = {
-                       isa = PBXBuildFile;
-                       fileRef = D4EBC17BDB7F88CCBC76730B;
-               };
-               B288A89F96704F142ED8E939 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5ACC21AA45BBF48C3C64D56D;
-               };
-               851C1165C9E4ACDD19C56A96 = {
-                       isa = PBXBuildFile;
-                       fileRef = 942A0F04EFB8D0B2FF9780BA;
-               };
-               AF42316D915057E930A5624E = {
-                       isa = PBXBuildFile;
-                       fileRef = A4B568E26157FC282214976F;
-               };
-               2B4B9CF71F94BDD1E3AC89AE = {
-                       isa = PBXBuildFile;
-                       fileRef = B0935EBBA4F6E2B05F3D1C0A;
-               };
-               AC3BED74AC7C6D9F5739F38B = {
-                       isa = PBXBuildFile;
-                       fileRef = 9794142D24966F93FFDE51A1;
-               };
-               E3CB85BA817BC9E3942A8AB0 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9F9B445E6755CAA19E4344ED;
-               };
-               70580743C3D5695F065FF698 = {
-                       isa = PBXBuildFile;
-                       fileRef = E68018DE199135B7F738FB17;
-               };
-               3470F40DA5D68EC217872906 = {
-                       isa = PBXBuildFile;
-                       fileRef = 31D55A751C790CB81F58DDB7;
-               };
-               E092A70431B046BF1F50A482 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5AF0CA7CDFCA90B4DE1F55C3;
-               };
-               E2BAA7CFC729809530FD71EE = {
-                       isa = PBXBuildFile;
-                       fileRef = B8774D8AD307D798831C0DF7;
-               };
-               68FBFDA1FE637B3EDA09A592 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4DF6E6E41E10965AD169143B;
-               };
-               BBA1733CF8B064A5FD0B4CF4 = {
-                       isa = PBXBuildFile;
-                       fileRef = D313CF37B25D7FD313C4F336;
-               };
-               A02C9F4C4B840C27B6CAFEBD = {
-                       isa = PBXBuildFile;
-                       fileRef = 89309C0C5F3269BD06BE7F27;
-               };
-               4DB15177DDC357F4503F88CF = {
-                       isa = PBXBuildFile;
-                       fileRef = B457EE687507BF1DEEA7581F;
-               };
-               D92C7BF86C9CCF6B4D14F809 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7DA35787B5F6F7440D667CC8;
-               };
-               443244451A0F2064D4767337 = {
-                       isa = PBXBuildFile;
-                       fileRef = 2A6983F82B13F9E8B10299AE;
-               };
-               2E74188531792924F0C73142 = {
-                       isa = PBXBuildFile;
-                       fileRef = 05863BDFC582C9552A86DF49;
-               };
-               C8423A9611C8AAF27468847D = {
-                       isa = PBXBuildFile;
-                       fileRef = 336FD30C38BD0A176161B8AE;
-               };
-               786AF545C1C1E4D11140C3DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 43647951ECC7F030B9953965;
-               };
-               3E1689E23B9C85F03209DCEF = {
-                       isa = PBXBuildFile;
-                       fileRef = 3D78A731234A833CA112AE45;
-               };
-               F635D974599DEC2ED91E6A88 = {
-                       isa = PBXBuildFile;
-                       fileRef = 04AABCD3491318FB32E844B4;
-               };
-               A1B0416DA378BB0C3AD6F74B = {
-                       isa = PBXBuildFile;
-                       fileRef = A66EFAC64B1B67B536C73415;
-               };
-               A0144A682BF4843C8CF53FE4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6D107D7946DC5976B766345B;
-               };
-               15CCE43D7DCFC649638919D4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4C7D82F9274A4F9DBF11235C;
-               };
-               5C4D406B924230F83E3580AD = {
-                       isa = PBXBuildFile;
-                       fileRef = 65968EA1B476D71F14DE1D58;
-               };
-               F4DD98B9310B679D50A2C8A6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5D250A57C7DEA80248F30EED;
-               };
-               CAF0DE157C8F7D9F168AA3B6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5FBD6C402617272052BB4D81;
-               };
-               0F20A4AE04736634F097F5A6 = {
-                       isa = PBXBuildFile;
-                       fileRef = B285CAB91AE928C476CA4F9C;
-               };
-               76A80851698FC773D2479B4E = {
-                       isa = PBXBuildFile;
-                       fileRef = 683CEE986A2467C850FE99E6;
-               };
-               E4A926EF695823F0F13268FF = {
-                       isa = PBXBuildFile;
-                       fileRef = B8E24A5CEE6B7055537725CF;
-               };
-               A09E93F1B354E1FF8B3E9ABE = {
-                       isa = PBXBuildFile;
-                       fileRef = 5EF1D381F42AA8764597F189;
-               };
-               7DE202DC1D876F49266D9E7D = {
-                       isa = PBXBuildFile;
-                       fileRef = 8290D7BAC160B3A56B66891A;
-               };
-               075C54DDDBDEA5AAD2F60154 = {
-                       isa = PBXBuildFile;
-                       fileRef = 82800DBA287EF4BAB13B42FB;
-               };
-               2C3D221D2AA87F07B3F1044D = {
-                       isa = PBXBuildFile;
-                       fileRef = 8FE7B37CDE0818DB27BDDEBD;
-               };
-               C38D14DC58F1941DD5E4BF60 = {
-                       isa = PBXBuildFile;
-                       fileRef = 2BE6C2DFD6EBB9A89109AEB5;
-               };
-               2727A191DB1BAAC9C04B9081 = {
-                       isa = PBXBuildFile;
-                       fileRef = 37E4D5C341406B7072120006;
-               };
-               84BAFE82A102D9C350672689 = {
-                       isa = PBXBuildFile;
-                       fileRef = 29D746FC68F69751796671A2;
-               };
-               04AABCD3491318FB32E844B4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = MainHostWindow.cpp;
-                       path = ../../Source/UI/MainHostWindow.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               04DB9A49969ECC740CC25665 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = GraphEditorPanel.h;
-                       path = ../../Source/UI/GraphEditorPanel.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               05863BDFC582C9552A86DF49 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = FilterGraph.cpp;
-                       path = ../../Source/Filters/FilterGraph.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1DADAD8E34AAF4AFF1C69DC4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = BinaryData.h;
-                       path = ../../JuceLibraryCode/BinaryData.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               29D746FC68F69751796671A2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_video.mm";
-                       path = "../../JuceLibraryCode/include_juce_video.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2A6983F82B13F9E8B10299AE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2BE6C2DFD6EBB9A89109AEB5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               30F22843EFEBF7AA841EB4D6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               31D55A751C790CB81F58DDB7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMedia.framework;
-                       path = System/Library/Frameworks/CoreMedia.framework;
-                       sourceTree = SDKROOT;
-               };
-               336FD30C38BD0A176161B8AE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = FilterIOConfiguration.cpp;
-                       path = ../../Source/Filters/FilterIOConfiguration.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               37E4D5C341406B7072120006 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3C070DD522CDD11FFC87425D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D57FE2A8877F12A61054726 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D78A731234A833CA112AE45 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = GraphEditorPanel.cpp;
-                       path = ../../Source/UI/GraphEditorPanel.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               43647951ECC7F030B9953965 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = InternalFilters.cpp;
-                       path = ../../Source/Filters/InternalFilters.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4C7D82F9274A4F9DBF11235C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4DF6E6E41E10965AD169143B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               5313EB852E41EE58B199B9A2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               545D57A6AA801B38548B0CAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = FilterGraph.h;
-                       path = ../../Source/Filters/FilterGraph.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               57DF618F1DE781556B7AFC32 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               59842A98E5EBBC54B50C04CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5ACC21AA45BBF48C3C64D56D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioUnit.framework;
-                       path = System/Library/Frameworks/AudioUnit.framework;
-                       sourceTree = SDKROOT;
-               };
-               5AF0CA7CDFCA90B4DE1F55C3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               5D250A57C7DEA80248F30EED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5EF1D381F42AA8764597F189 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5FBD6C402617272052BB4D81 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               65968EA1B476D71F14DE1D58 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               683CEE986A2467C850FE99E6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6A71B2BCAC4239072BC2BD7E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6D107D7946DC5976B766345B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = BinaryData.cpp;
-                       path = ../../JuceLibraryCode/BinaryData.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               725D0D9C8C7FF7B3FB3020ED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = FilterIOConfiguration.h;
-                       path = ../../Source/Filters/FilterIOConfiguration.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7DA35787B5F6F7440D667CC8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               81C1A7770E082F56FE5A90A7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               82800DBA287EF4BAB13B42FB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8290D7BAC160B3A56B66891A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               86CA337014D3F67E906FFD28 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               89309C0C5F3269BD06BE7F27 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               8D8BBC353637DA442C5575DA = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = AudioPluginHost.app;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               8FE7B37CDE0818DB27BDDEBD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               938AE72315C6C93949F6220E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               942A0F04EFB8D0B2FF9780BA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               94CB96C8E4B51F52776C2638 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               97918AB43AD460AFA8FA2FFE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = PluginWindow.h;
-                       path = ../../Source/UI/PluginWindow.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9794142D24966F93FFDE51A1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               9EBEE3AE5856E877478607C7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = InternalFilters.h;
-                       path = ../../Source/Filters/InternalFilters.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9F9B445E6755CAA19E4344ED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               A4B568E26157FC282214976F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVKit.framework;
-                       path = System/Library/Frameworks/AVKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               A5DFC13E4F09134B0D226A3E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MainHostWindow.h;
-                       path = ../../Source/UI/MainHostWindow.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A5E7CA8A71D049BE2BD33861 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A66EFAC64B1B67B536C73415 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = HostStartup.cpp;
-                       path = ../../Source/HostStartup.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B0935EBBA4F6E2B05F3D1C0A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Carbon.framework;
-                       path = System/Library/Frameworks/Carbon.framework;
-                       sourceTree = SDKROOT;
-               };
-               B285CAB91AE928C476CA4F9C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B2A1E626CC120982805754F6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = JUCEAppIcon.png;
-                       path = ../../Source/JUCEAppIcon.png;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B457EE687507BF1DEEA7581F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = WebKit.framework;
-                       path = System/Library/Frameworks/WebKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               B86B918291E1090C6A720971 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B8774D8AD307D798831C0DF7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = DiscRecording.framework;
-                       path = System/Library/Frameworks/DiscRecording.framework;
-                       sourceTree = SDKROOT;
-               };
-               B8E24A5CEE6B7055537725CF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D313CF37B25D7FD313C4F336 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGL.framework;
-                       path = System/Library/Frameworks/OpenGL.framework;
-                       sourceTree = SDKROOT;
-               };
-               D4EBC17BDB7F88CCBC76730B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               DDE115D3084ACA6DD6AA4471 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_video";
-                       path = "../../../../modules/juce_video";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E68018DE199135B7F738FB17 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudioKit.framework;
-                       path = System/Library/Frameworks/CoreAudioKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               F299BECFB2AEA6105F014848 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F9AC862E9A3583B6C1488EE0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FA21631C5536EA3DF55C7FA6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FAF867E9E731D0880D40511F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AA37F82D57C9BB4BE78FCCB9 = {
-                       isa = PBXGroup;
-                       children = (
-                               05863BDFC582C9552A86DF49,
-                               545D57A6AA801B38548B0CAC,
-                               336FD30C38BD0A176161B8AE,
-                               725D0D9C8C7FF7B3FB3020ED,
-                               43647951ECC7F030B9953965,
-                               9EBEE3AE5856E877478607C7,
-                       );
-                       name = Filters;
-                       sourceTree = "<group>";
-               };
-               DE7B77306553B1204071B39A = {
-                       isa = PBXGroup;
-                       children = (
-                               3D78A731234A833CA112AE45,
-                               04DB9A49969ECC740CC25665,
-                               04AABCD3491318FB32E844B4,
-                               A5DFC13E4F09134B0D226A3E,
-                               97918AB43AD460AFA8FA2FFE,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               B225B7F2CAABD28A41E7C339 = {
-                       isa = PBXGroup;
-                       children = (
-                               AA37F82D57C9BB4BE78FCCB9,
-                               DE7B77306553B1204071B39A,
-                               A66EFAC64B1B67B536C73415,
-                               B2A1E626CC120982805754F6,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               97790EAEA01CFA5C3CA9737A = {
-                       isa = PBXGroup;
-                       children = (
-                               B225B7F2CAABD28A41E7C339,
-                       );
-                       name = AudioPluginHost;
-                       sourceTree = "<group>";
-               };
-               9D8FE1F65CAD416AA606C47A = {
-                       isa = PBXGroup;
-                       children = (
-                               6A71B2BCAC4239072BC2BD7E,
-                               5313EB852E41EE58B199B9A2,
-                               F9AC862E9A3583B6C1488EE0,
-                               FAF867E9E731D0880D40511F,
-                               3C070DD522CDD11FFC87425D,
-                               3D57FE2A8877F12A61054726,
-                               FA21631C5536EA3DF55C7FA6,
-                               B86B918291E1090C6A720971,
-                               59842A98E5EBBC54B50C04CD,
-                               94CB96C8E4B51F52776C2638,
-                               938AE72315C6C93949F6220E,
-                               F299BECFB2AEA6105F014848,
-                               81C1A7770E082F56FE5A90A7,
-                               DDE115D3084ACA6DD6AA4471,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               7E30376DDAD775FEFE64944C = {
-                       isa = PBXGroup;
-                       children = (
-                               30F22843EFEBF7AA841EB4D6,
-                               6D107D7946DC5976B766345B,
-                               1DADAD8E34AAF4AFF1C69DC4,
-                               4C7D82F9274A4F9DBF11235C,
-                               65968EA1B476D71F14DE1D58,
-                               5D250A57C7DEA80248F30EED,
-                               5FBD6C402617272052BB4D81,
-                               B285CAB91AE928C476CA4F9C,
-                               683CEE986A2467C850FE99E6,
-                               B8E24A5CEE6B7055537725CF,
-                               5EF1D381F42AA8764597F189,
-                               8290D7BAC160B3A56B66891A,
-                               82800DBA287EF4BAB13B42FB,
-                               8FE7B37CDE0818DB27BDDEBD,
-                               2BE6C2DFD6EBB9A89109AEB5,
-                               37E4D5C341406B7072120006,
-                               29D746FC68F69751796671A2,
-                               A5E7CA8A71D049BE2BD33861,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               A97EE73C79DA3F729D46AF48 = {
-                       isa = PBXGroup;
-                       children = (
-                               57DF618F1DE781556B7AFC32,
-                               7DA35787B5F6F7440D667CC8,
-                               2A6983F82B13F9E8B10299AE,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               D1C4804CD275CB57A5C89A2D = {
-                       isa = PBXGroup;
-                       children = (
-                               86CA337014D3F67E906FFD28,
-                               D4EBC17BDB7F88CCBC76730B,
-                               5ACC21AA45BBF48C3C64D56D,
-                               942A0F04EFB8D0B2FF9780BA,
-                               A4B568E26157FC282214976F,
-                               B0935EBBA4F6E2B05F3D1C0A,
-                               9794142D24966F93FFDE51A1,
-                               9F9B445E6755CAA19E4344ED,
-                               E68018DE199135B7F738FB17,
-                               31D55A751C790CB81F58DDB7,
-                               5AF0CA7CDFCA90B4DE1F55C3,
-                               B8774D8AD307D798831C0DF7,
-                               4DF6E6E41E10965AD169143B,
-                               D313CF37B25D7FD313C4F336,
-                               89309C0C5F3269BD06BE7F27,
-                               B457EE687507BF1DEEA7581F,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               D85C0D11EE4F6C73B9EB5BCD = {
-                       isa = PBXGroup;
-                       children = (
-                               8D8BBC353637DA442C5575DA,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               65BEFC705A89E5C8A9E35C97 = {
-                       isa = PBXGroup;
-                       children = (
-                               97790EAEA01CFA5C3CA9737A,
-                               9D8FE1F65CAD416AA606C47A,
-                               7E30376DDAD775FEFE64944C,
-                               A97EE73C79DA3F729D46AF48,
-                               D1C4804CD275CB57A5C89A2D,
-                               D85C0D11EE4F6C73B9EB5BCD,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               C8B793AC1BEFBE7A99BE8352 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               FCDB1F8A93F59E0F97821456 = {isa = PBXBuildFile; fileRef = 8D8BBC353637DA442C5575DA; };
+               73E371F1B912FCCAE0CD7E5D = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; };
+               21D330A5B13178B12BEAFC3C = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; };
+               B288A89F96704F142ED8E939 = {isa = PBXBuildFile; fileRef = 5ACC21AA45BBF48C3C64D56D; };
+               851C1165C9E4ACDD19C56A96 = {isa = PBXBuildFile; fileRef = 942A0F04EFB8D0B2FF9780BA; };
+               AF42316D915057E930A5624E = {isa = PBXBuildFile; fileRef = A4B568E26157FC282214976F; };
+               2B4B9CF71F94BDD1E3AC89AE = {isa = PBXBuildFile; fileRef = B0935EBBA4F6E2B05F3D1C0A; };
+               AC3BED74AC7C6D9F5739F38B = {isa = PBXBuildFile; fileRef = 9794142D24966F93FFDE51A1; };
+               E3CB85BA817BC9E3942A8AB0 = {isa = PBXBuildFile; fileRef = 9F9B445E6755CAA19E4344ED; };
+               70580743C3D5695F065FF698 = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; };
+               3470F40DA5D68EC217872906 = {isa = PBXBuildFile; fileRef = 31D55A751C790CB81F58DDB7; };
+               E092A70431B046BF1F50A482 = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; };
+               E2BAA7CFC729809530FD71EE = {isa = PBXBuildFile; fileRef = B8774D8AD307D798831C0DF7; };
+               68FBFDA1FE637B3EDA09A592 = {isa = PBXBuildFile; fileRef = 4DF6E6E41E10965AD169143B; };
+               BBA1733CF8B064A5FD0B4CF4 = {isa = PBXBuildFile; fileRef = D313CF37B25D7FD313C4F336; };
+               A02C9F4C4B840C27B6CAFEBD = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; };
+               4DB15177DDC357F4503F88CF = {isa = PBXBuildFile; fileRef = B457EE687507BF1DEEA7581F; };
+               D92C7BF86C9CCF6B4D14F809 = {isa = PBXBuildFile; fileRef = 7DA35787B5F6F7440D667CC8; };
+               443244451A0F2064D4767337 = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; };
+               2E74188531792924F0C73142 = {isa = PBXBuildFile; fileRef = 05863BDFC582C9552A86DF49; };
+               C8423A9611C8AAF27468847D = {isa = PBXBuildFile; fileRef = 336FD30C38BD0A176161B8AE; };
+               786AF545C1C1E4D11140C3DF = {isa = PBXBuildFile; fileRef = 43647951ECC7F030B9953965; };
+               3E1689E23B9C85F03209DCEF = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; };
+               F635D974599DEC2ED91E6A88 = {isa = PBXBuildFile; fileRef = 04AABCD3491318FB32E844B4; };
+               A1B0416DA378BB0C3AD6F74B = {isa = PBXBuildFile; fileRef = A66EFAC64B1B67B536C73415; };
+               A0144A682BF4843C8CF53FE4 = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; };
+               15CCE43D7DCFC649638919D4 = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; };
+               5C4D406B924230F83E3580AD = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; };
+               F4DD98B9310B679D50A2C8A6 = {isa = PBXBuildFile; fileRef = 5D250A57C7DEA80248F30EED; };
+               CAF0DE157C8F7D9F168AA3B6 = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; };
+               0F20A4AE04736634F097F5A6 = {isa = PBXBuildFile; fileRef = B285CAB91AE928C476CA4F9C; };
+               76A80851698FC773D2479B4E = {isa = PBXBuildFile; fileRef = 683CEE986A2467C850FE99E6; };
+               E4A926EF695823F0F13268FF = {isa = PBXBuildFile; fileRef = B8E24A5CEE6B7055537725CF; };
+               A09E93F1B354E1FF8B3E9ABE = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; };
+               7DE202DC1D876F49266D9E7D = {isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; };
+               075C54DDDBDEA5AAD2F60154 = {isa = PBXBuildFile; fileRef = 82800DBA287EF4BAB13B42FB; };
+               2C3D221D2AA87F07B3F1044D = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; };
+               C38D14DC58F1941DD5E4BF60 = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; };
+               2727A191DB1BAAC9C04B9081 = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; };
+               84BAFE82A102D9C350672689 = {isa = PBXBuildFile; fileRef = 29D746FC68F69751796671A2; };
+               04AABCD3491318FB32E844B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainHostWindow.cpp; path = ../../Source/UI/MainHostWindow.cpp; sourceTree = "SOURCE_ROOT"; };
+               04DB9A49969ECC740CC25665 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/UI/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; };
+               05863BDFC582C9552A86DF49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterGraph.cpp; path = ../../Source/Filters/FilterGraph.cpp; sourceTree = "SOURCE_ROOT"; };
+               1DADAD8E34AAF4AFF1C69DC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+               29D746FC68F69751796671A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+               2A6983F82B13F9E8B10299AE = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               2BE6C2DFD6EBB9A89109AEB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               30F22843EFEBF7AA841EB4D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               31D55A751C790CB81F58DDB7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+               336FD30C38BD0A176161B8AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterIOConfiguration.cpp; path = ../../Source/Filters/FilterIOConfiguration.cpp; sourceTree = "SOURCE_ROOT"; };
+               37E4D5C341406B7072120006 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               3C070DD522CDD11FFC87425D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               3D57FE2A8877F12A61054726 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               3D78A731234A833CA112AE45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GraphEditorPanel.cpp; path = ../../Source/UI/GraphEditorPanel.cpp; sourceTree = "SOURCE_ROOT"; };
+               43647951ECC7F030B9953965 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InternalFilters.cpp; path = ../../Source/Filters/InternalFilters.cpp; sourceTree = "SOURCE_ROOT"; };
+               4C7D82F9274A4F9DBF11235C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               4DF6E6E41E10965AD169143B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               5313EB852E41EE58B199B9A2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               545D57A6AA801B38548B0CAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterGraph.h; path = ../../Source/Filters/FilterGraph.h; sourceTree = "SOURCE_ROOT"; };
+               57DF618F1DE781556B7AFC32 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               59842A98E5EBBC54B50C04CD = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               5ACC21AA45BBF48C3C64D56D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
+               5AF0CA7CDFCA90B4DE1F55C3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               5D250A57C7DEA80248F30EED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               5EF1D381F42AA8764597F189 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               5FBD6C402617272052BB4D81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               65968EA1B476D71F14DE1D58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               683CEE986A2467C850FE99E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               6A71B2BCAC4239072BC2BD7E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               6D107D7946DC5976B766345B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+               725D0D9C8C7FF7B3FB3020ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterIOConfiguration.h; path = ../../Source/Filters/FilterIOConfiguration.h; sourceTree = "SOURCE_ROOT"; };
+               7DA35787B5F6F7440D667CC8 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               81C1A7770E082F56FE5A90A7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               82800DBA287EF4BAB13B42FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               8290D7BAC160B3A56B66891A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               86CA337014D3F67E906FFD28 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               89309C0C5F3269BD06BE7F27 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               8D8BBC353637DA442C5575DA = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioPluginHost.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               8FE7B37CDE0818DB27BDDEBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               938AE72315C6C93949F6220E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               942A0F04EFB8D0B2FF9780BA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               94CB96C8E4B51F52776C2638 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               97918AB43AD460AFA8FA2FFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = ../../Source/UI/PluginWindow.h; sourceTree = "SOURCE_ROOT"; };
+               9794142D24966F93FFDE51A1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               9EBEE3AE5856E877478607C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalFilters.h; path = ../../Source/Filters/InternalFilters.h; sourceTree = "SOURCE_ROOT"; };
+               9F9B445E6755CAA19E4344ED = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               A4B568E26157FC282214976F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+               A5DFC13E4F09134B0D226A3E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = "SOURCE_ROOT"; };
+               A5E7CA8A71D049BE2BD33861 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               A66EFAC64B1B67B536C73415 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = "SOURCE_ROOT"; };
+               B0935EBBA4F6E2B05F3D1C0A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+               B285CAB91AE928C476CA4F9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               B2A1E626CC120982805754F6 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+               B457EE687507BF1DEEA7581F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+               B86B918291E1090C6A720971 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               B8774D8AD307D798831C0DF7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+               B8E24A5CEE6B7055537725CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               D313CF37B25D7FD313C4F336 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+               D4EBC17BDB7F88CCBC76730B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               DDE115D3084ACA6DD6AA4471 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+               E68018DE199135B7F738FB17 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+               F299BECFB2AEA6105F014848 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               F9AC862E9A3583B6C1488EE0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               FA21631C5536EA3DF55C7FA6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               FAF867E9E731D0880D40511F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               AA37F82D57C9BB4BE78FCCB9 = {isa = PBXGroup; children = (
+                                       05863BDFC582C9552A86DF49,
+                                       545D57A6AA801B38548B0CAC,
+                                       336FD30C38BD0A176161B8AE,
+                                       725D0D9C8C7FF7B3FB3020ED,
+                                       43647951ECC7F030B9953965,
+                                       9EBEE3AE5856E877478607C7, ); name = Filters; sourceTree = "<group>"; };
+               DE7B77306553B1204071B39A = {isa = PBXGroup; children = (
+                                       3D78A731234A833CA112AE45,
+                                       04DB9A49969ECC740CC25665,
+                                       04AABCD3491318FB32E844B4,
+                                       A5DFC13E4F09134B0D226A3E,
+                                       97918AB43AD460AFA8FA2FFE, ); name = UI; sourceTree = "<group>"; };
+               B225B7F2CAABD28A41E7C339 = {isa = PBXGroup; children = (
+                                       AA37F82D57C9BB4BE78FCCB9,
+                                       DE7B77306553B1204071B39A,
+                                       A66EFAC64B1B67B536C73415,
+                                       B2A1E626CC120982805754F6, ); name = Source; sourceTree = "<group>"; };
+               97790EAEA01CFA5C3CA9737A = {isa = PBXGroup; children = (
+                                       B225B7F2CAABD28A41E7C339, ); name = AudioPluginHost; sourceTree = "<group>"; };
+               9D8FE1F65CAD416AA606C47A = {isa = PBXGroup; children = (
+                                       6A71B2BCAC4239072BC2BD7E,
+                                       5313EB852E41EE58B199B9A2,
+                                       F9AC862E9A3583B6C1488EE0,
+                                       FAF867E9E731D0880D40511F,
+                                       3C070DD522CDD11FFC87425D,
+                                       3D57FE2A8877F12A61054726,
+                                       FA21631C5536EA3DF55C7FA6,
+                                       B86B918291E1090C6A720971,
+                                       59842A98E5EBBC54B50C04CD,
+                                       94CB96C8E4B51F52776C2638,
+                                       938AE72315C6C93949F6220E,
+                                       F299BECFB2AEA6105F014848,
+                                       81C1A7770E082F56FE5A90A7,
+                                       DDE115D3084ACA6DD6AA4471, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               7E30376DDAD775FEFE64944C = {isa = PBXGroup; children = (
+                                       30F22843EFEBF7AA841EB4D6,
+                                       6D107D7946DC5976B766345B,
+                                       1DADAD8E34AAF4AFF1C69DC4,
+                                       4C7D82F9274A4F9DBF11235C,
+                                       65968EA1B476D71F14DE1D58,
+                                       5D250A57C7DEA80248F30EED,
+                                       5FBD6C402617272052BB4D81,
+                                       B285CAB91AE928C476CA4F9C,
+                                       683CEE986A2467C850FE99E6,
+                                       B8E24A5CEE6B7055537725CF,
+                                       5EF1D381F42AA8764597F189,
+                                       8290D7BAC160B3A56B66891A,
+                                       82800DBA287EF4BAB13B42FB,
+                                       8FE7B37CDE0818DB27BDDEBD,
+                                       2BE6C2DFD6EBB9A89109AEB5,
+                                       37E4D5C341406B7072120006,
+                                       29D746FC68F69751796671A2,
+                                       A5E7CA8A71D049BE2BD33861, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               A97EE73C79DA3F729D46AF48 = {isa = PBXGroup; children = (
+                                       57DF618F1DE781556B7AFC32,
+                                       7DA35787B5F6F7440D667CC8,
+                                       2A6983F82B13F9E8B10299AE, ); name = Resources; sourceTree = "<group>"; };
+               D1C4804CD275CB57A5C89A2D = {isa = PBXGroup; children = (
+                                       86CA337014D3F67E906FFD28,
+                                       D4EBC17BDB7F88CCBC76730B,
+                                       5ACC21AA45BBF48C3C64D56D,
+                                       942A0F04EFB8D0B2FF9780BA,
+                                       A4B568E26157FC282214976F,
+                                       B0935EBBA4F6E2B05F3D1C0A,
+                                       9794142D24966F93FFDE51A1,
+                                       9F9B445E6755CAA19E4344ED,
+                                       E68018DE199135B7F738FB17,
+                                       31D55A751C790CB81F58DDB7,
+                                       5AF0CA7CDFCA90B4DE1F55C3,
+                                       B8774D8AD307D798831C0DF7,
+                                       4DF6E6E41E10965AD169143B,
+                                       D313CF37B25D7FD313C4F336,
+                                       89309C0C5F3269BD06BE7F27,
+                                       B457EE687507BF1DEEA7581F, ); name = Frameworks; sourceTree = "<group>"; };
+               D85C0D11EE4F6C73B9EB5BCD = {isa = PBXGroup; children = (
+                                       8D8BBC353637DA442C5575DA, ); name = Products; sourceTree = "<group>"; };
+               65BEFC705A89E5C8A9E35C97 = {isa = PBXGroup; children = (
+                                       97790EAEA01CFA5C3CA9737A,
+                                       9D8FE1F65CAD416AA606C47A,
+                                       7E30376DDAD775FEFE64944C,
+                                       A97EE73C79DA3F729D46AF48,
+                                       D1C4804CD275CB57A5C89A2D,
+                                       D85C0D11EE4F6C73B9EB5BCD, ); name = Source; sourceTree = "<group>"; };
+               C8B793AC1BEFBE7A99BE8352 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi";
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
-                               PRODUCT_NAME = "AudioPluginHost";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               49453CC5AD9F08D2738464AC = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               49453CC5AD9F08D2738464AC = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi";
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
-                               PRODUCT_NAME = "AudioPluginHost";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               8D1CA827F1EFD443BDCF198A = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               8D1CA827F1EFD443BDCF198A = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "AudioPluginHost";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               C9295196717FABE454A210B7 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               C9295196717FABE454A210B7 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "AudioPluginHost";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               B9D79D85AC7DE5BED1B6547C = {
-                       isa = PBXTargetDependency;
-                       target = DE12B7643D374BFF7E4FEB1C;
-               };
-               493C2C5E457692E5149C5525 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               8D1CA827F1EFD443BDCF198A,
-                               C9295196717FABE454A210B7,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               E4ECAE24A646A7D1585F776C = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               C8B793AC1BEFBE7A99BE8352,
-                               49453CC5AD9F08D2738464AC,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               2429BB4D705CC57F49418CFB = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               D92C7BF86C9CCF6B4D14F809,
-                               443244451A0F2064D4767337,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               E8E94B3C187DA578BFCBDA98 = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               2E74188531792924F0C73142,
-                               C8423A9611C8AAF27468847D,
-                               786AF545C1C1E4D11140C3DF,
-                               3E1689E23B9C85F03209DCEF,
-                               F635D974599DEC2ED91E6A88,
-                               A1B0416DA378BB0C3AD6F74B,
-                               A0144A682BF4843C8CF53FE4,
-                               15CCE43D7DCFC649638919D4,
-                               5C4D406B924230F83E3580AD,
-                               F4DD98B9310B679D50A2C8A6,
-                               CAF0DE157C8F7D9F168AA3B6,
-                               0F20A4AE04736634F097F5A6,
-                               76A80851698FC773D2479B4E,
-                               E4A926EF695823F0F13268FF,
-                               A09E93F1B354E1FF8B3E9ABE,
-                               7DE202DC1D876F49266D9E7D,
-                               075C54DDDBDEA5AAD2F60154,
-                               2C3D221D2AA87F07B3F1044D,
-                               C38D14DC58F1941DD5E4BF60,
-                               2727A191DB1BAAC9C04B9081,
-                               84BAFE82A102D9C350672689,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               C515A1FE1A53D3968C22FAEF = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               73E371F1B912FCCAE0CD7E5D,
-                               21D330A5B13178B12BEAFC3C,
-                               B288A89F96704F142ED8E939,
-                               851C1165C9E4ACDD19C56A96,
-                               AF42316D915057E930A5624E,
-                               2B4B9CF71F94BDD1E3AC89AE,
-                               AC3BED74AC7C6D9F5739F38B,
-                               E3CB85BA817BC9E3942A8AB0,
-                               70580743C3D5695F065FF698,
-                               3470F40DA5D68EC217872906,
-                               E092A70431B046BF1F50A482,
-                               E2BAA7CFC729809530FD71EE,
-                               68FBFDA1FE637B3EDA09A592,
-                               BBA1733CF8B064A5FD0B4CF4,
-                               A02C9F4C4B840C27B6CAFEBD,
-                               4DB15177DDC357F4503F88CF,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               DE12B7643D374BFF7E4FEB1C = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = E4ECAE24A646A7D1585F776C;
-                       buildPhases = (
-                               2429BB4D705CC57F49418CFB,
-                               E8E94B3C187DA578BFCBDA98,
-                               C515A1FE1A53D3968C22FAEF,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "AudioPluginHost - App";
-                       productName = AudioPluginHost;
-                       productReference = 8D8BBC353637DA442C5575DA;
-                       productType = "com.apple.product-type.application";
-               };
-               ADE6E539DB98A302483A82D0 = {
-                       isa = PBXProject;
-                       buildConfigurationList = 493C2C5E457692E5149C5525;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 65BEFC705A89E5C8A9E35C97;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (DE12B7643D374BFF7E4FEB1C);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               B9D79D85AC7DE5BED1B6547C = {isa = PBXTargetDependency; target = DE12B7643D374BFF7E4FEB1C; };
+               493C2C5E457692E5149C5525 = {isa = XCConfigurationList; buildConfigurations = (
+                                       8D1CA827F1EFD443BDCF198A,
+                                       C9295196717FABE454A210B7, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               E4ECAE24A646A7D1585F776C = {isa = XCConfigurationList; buildConfigurations = (
+                                       C8B793AC1BEFBE7A99BE8352,
+                                       49453CC5AD9F08D2738464AC, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               2429BB4D705CC57F49418CFB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       D92C7BF86C9CCF6B4D14F809,
+                                       443244451A0F2064D4767337, ); runOnlyForDeploymentPostprocessing = 0; };
+               E8E94B3C187DA578BFCBDA98 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       2E74188531792924F0C73142,
+                                       C8423A9611C8AAF27468847D,
+                                       786AF545C1C1E4D11140C3DF,
+                                       3E1689E23B9C85F03209DCEF,
+                                       F635D974599DEC2ED91E6A88,
+                                       A1B0416DA378BB0C3AD6F74B,
+                                       A0144A682BF4843C8CF53FE4,
+                                       15CCE43D7DCFC649638919D4,
+                                       5C4D406B924230F83E3580AD,
+                                       F4DD98B9310B679D50A2C8A6,
+                                       CAF0DE157C8F7D9F168AA3B6,
+                                       0F20A4AE04736634F097F5A6,
+                                       76A80851698FC773D2479B4E,
+                                       E4A926EF695823F0F13268FF,
+                                       A09E93F1B354E1FF8B3E9ABE,
+                                       7DE202DC1D876F49266D9E7D,
+                                       075C54DDDBDEA5AAD2F60154,
+                                       2C3D221D2AA87F07B3F1044D,
+                                       C38D14DC58F1941DD5E4BF60,
+                                       2727A191DB1BAAC9C04B9081,
+                                       84BAFE82A102D9C350672689, ); runOnlyForDeploymentPostprocessing = 0; };
+               C515A1FE1A53D3968C22FAEF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       73E371F1B912FCCAE0CD7E5D,
+                                       21D330A5B13178B12BEAFC3C,
+                                       B288A89F96704F142ED8E939,
+                                       851C1165C9E4ACDD19C56A96,
+                                       AF42316D915057E930A5624E,
+                                       2B4B9CF71F94BDD1E3AC89AE,
+                                       AC3BED74AC7C6D9F5739F38B,
+                                       E3CB85BA817BC9E3942A8AB0,
+                                       70580743C3D5695F065FF698,
+                                       3470F40DA5D68EC217872906,
+                                       E092A70431B046BF1F50A482,
+                                       E2BAA7CFC729809530FD71EE,
+                                       68FBFDA1FE637B3EDA09A592,
+                                       BBA1733CF8B064A5FD0B4CF4,
+                                       A02C9F4C4B840C27B6CAFEBD,
+                                       4DB15177DDC357F4503F88CF, ); runOnlyForDeploymentPostprocessing = 0; };
+               DE12B7643D374BFF7E4FEB1C = {isa = PBXNativeTarget; buildConfigurationList = E4ECAE24A646A7D1585F776C; buildPhases = (
+                                       2429BB4D705CC57F49418CFB,
+                                       E8E94B3C187DA578BFCBDA98,
+                                       C515A1FE1A53D3968C22FAEF, ); buildRules = ( ); dependencies = (  ); name = "AudioPluginHost - App"; productName = AudioPluginHost; productReference = 8D8BBC353637DA442C5575DA; productType = "com.apple.product-type.application"; };
+               ADE6E539DB98A302483A82D0 = {isa = PBXProject; buildConfigurationList = 493C2C5E457692E5149C5525; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 65BEFC705A89E5C8A9E35C97; projectDirPath = ""; projectRoot = ""; targets = (DE12B7643D374BFF7E4FEB1C); };
        };
        rootObject = ADE6E539DB98A302483A82D0;
 }
index ef1b5254c5eb6d1aa82c78e504420464c106df70..bc0a8928552e6dcaaadf86c88b73d3de83d7f267 100644 (file)
@@ -3,8 +3,6 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
 <plist>\r
   <dict>\r
-    <key>NSMicrophoneUsageDescription</key>\r
-    <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
     <key>CFBundleExecutable</key>\r
     <string>${EXECUTABLE_NAME}</string>\r
     <key>CFBundleIconFile</key>\r
index d735396962f1e3b817acaaab3e8dbf8b295f8d21..5a1405834680febdb0f7cb93d72c48b47fbfb39c 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{5666EAA2-C82B-D06A-5228-D0E810428536}</ProjectGuid>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +57,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AudioPluginHost</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
     <Midl>\r
@@ -63,8 +71,8 @@
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
-      <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     </Midl>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
-      <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <None Include="..\..\Source\JUCEAppIcon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
     <None Include=".\icon.ico"/>\r
index 7afc1bcae4a2589e5bb511bc7c03e92c3663919b..d73bb1e3348b88a7af0bef9611a73759d061eeda 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index 61878faa29ea5b28a06c42ab4d06766f79a13192..03cea25fd4d775d50cd067dcfe66422579584d74 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{5666EAA2-C82B-D06A-5228-D0E810428536}</ProjectGuid>\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,6 +25,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v140</PlatformToolset>\r
+    <PlatformToolset>v140</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
@@ -31,6 +34,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v140</PlatformToolset>\r
+    <PlatformToolset>v140</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AudioPluginHost</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -63,8 +73,8 @@
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
-      <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     </Midl>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
-      <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <None Include="..\..\Source\JUCEAppIcon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
     <None Include=".\icon.ico"/>\r
index e1bf89e0fcab2426c4e2788cd09d6d839bd89e7b..3425cca7a58e50977acc7ce00a31f608eb4c5666 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index f6645ecc6067c0c849d86406db81ee5716e32dbd..5d76b0597bd299bf27bca00695a38a0b623f93b5 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{5666EAA2-C82B-D06A-5228-D0E810428536}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AudioPluginHost</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -63,8 +73,8 @@
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
-      <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
@@ -74,7 +84,6 @@
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ResourceCompile>\r
     </Midl>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
-      <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ResourceCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <None Include="..\..\Source\JUCEAppIcon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
     <None Include=".\icon.ico"/>\r
index f61d76de807e566bab16b9cc40acce46738cdb3e..33384a787edb862ae0bb15cb3c253e3b9be55e90 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index 349d1ce32e1c06a62bf44228bec17631c564b34d..a3452b3e1aa8aca2730d3868554ffb58974e13a3 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               FCDB1F8A93F59E0F97821456 = {
-                       isa = PBXBuildFile;
-                       fileRef = 8D8BBC353637DA442C5575DA;
-               };
-               73E371F1B912FCCAE0CD7E5D = {
-                       isa = PBXBuildFile;
-                       fileRef = 86CA337014D3F67E906FFD28;
-               };
-               21D330A5B13178B12BEAFC3C = {
-                       isa = PBXBuildFile;
-                       fileRef = D4EBC17BDB7F88CCBC76730B;
-               };
-               851C1165C9E4ACDD19C56A96 = {
-                       isa = PBXBuildFile;
-                       fileRef = 942A0F04EFB8D0B2FF9780BA;
-               };
-               AF42316D915057E930A5624E = {
-                       isa = PBXBuildFile;
-                       fileRef = A4B568E26157FC282214976F;
-               };
-               E3CB85BA817BC9E3942A8AB0 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9F9B445E6755CAA19E4344ED;
-               };
-               70580743C3D5695F065FF698 = {
-                       isa = PBXBuildFile;
-                       fileRef = E68018DE199135B7F738FB17;
-               };
-               1570FCC5CDB7A44DF0077E39 = {
-                       isa = PBXBuildFile;
-                       fileRef = 2F7D965A1284CEF0B20EB657;
-               };
-               B0D5475F716126465FCE1586 = {
-                       isa = PBXBuildFile;
-                       fileRef = CFFA8E9A7820C5A27B4393C9;
-               };
-               3470F40DA5D68EC217872906 = {
-                       isa = PBXBuildFile;
-                       fileRef = 31D55A751C790CB81F58DDB7;
-               };
-               E092A70431B046BF1F50A482 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5AF0CA7CDFCA90B4DE1F55C3;
-               };
-               92EE84159C7027A137F06204 = {
-                       isa = PBXBuildFile;
-                       fileRef = 66643EDF46AE8C5B7956B91D;
-               };
-               9056B642BEF870098DE344E5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 03FA420AACDD03D50AA16E4A;
-               };
-               7DE81C004B0FBC563040CC5F = {
-                       isa = PBXBuildFile;
-                       fileRef = B1CD9599EB12D77E8AF9241D;
-               };
-               2AB9A26C9359C40CA0A937ED = {
-                       isa = PBXBuildFile;
-                       fileRef = D0026F0A29B486D87E92BB8B;
-               };
-               A02C9F4C4B840C27B6CAFEBD = {
-                       isa = PBXBuildFile;
-                       fileRef = 89309C0C5F3269BD06BE7F27;
-               };
-               50AFD116DCA6EC228EFB322D = {
-                       isa = PBXBuildFile;
-                       fileRef = F9EDC54DFBCF3A63E0AA5D73;
-               };
-               59F4F23BFFDAB414B4801F85 = {
-                       isa = PBXBuildFile;
-                       fileRef = 29E0972229FB44D969035B4E;
-               };
-               443244451A0F2064D4767337 = {
-                       isa = PBXBuildFile;
-                       fileRef = 2A6983F82B13F9E8B10299AE;
-               };
-               2E74188531792924F0C73142 = {
-                       isa = PBXBuildFile;
-                       fileRef = 05863BDFC582C9552A86DF49;
-               };
-               C8423A9611C8AAF27468847D = {
-                       isa = PBXBuildFile;
-                       fileRef = 336FD30C38BD0A176161B8AE;
-               };
-               786AF545C1C1E4D11140C3DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 43647951ECC7F030B9953965;
-               };
-               3E1689E23B9C85F03209DCEF = {
-                       isa = PBXBuildFile;
-                       fileRef = 3D78A731234A833CA112AE45;
-               };
-               F635D974599DEC2ED91E6A88 = {
-                       isa = PBXBuildFile;
-                       fileRef = 04AABCD3491318FB32E844B4;
-               };
-               A1B0416DA378BB0C3AD6F74B = {
-                       isa = PBXBuildFile;
-                       fileRef = A66EFAC64B1B67B536C73415;
-               };
-               A0144A682BF4843C8CF53FE4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6D107D7946DC5976B766345B;
-               };
-               15CCE43D7DCFC649638919D4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4C7D82F9274A4F9DBF11235C;
-               };
-               5C4D406B924230F83E3580AD = {
-                       isa = PBXBuildFile;
-                       fileRef = 65968EA1B476D71F14DE1D58;
-               };
-               F4DD98B9310B679D50A2C8A6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5D250A57C7DEA80248F30EED;
-               };
-               CAF0DE157C8F7D9F168AA3B6 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5FBD6C402617272052BB4D81;
-               };
-               0F20A4AE04736634F097F5A6 = {
-                       isa = PBXBuildFile;
-                       fileRef = B285CAB91AE928C476CA4F9C;
-               };
-               76A80851698FC773D2479B4E = {
-                       isa = PBXBuildFile;
-                       fileRef = 683CEE986A2467C850FE99E6;
-               };
-               E4A926EF695823F0F13268FF = {
-                       isa = PBXBuildFile;
-                       fileRef = B8E24A5CEE6B7055537725CF;
-               };
-               A09E93F1B354E1FF8B3E9ABE = {
-                       isa = PBXBuildFile;
-                       fileRef = 5EF1D381F42AA8764597F189;
-               };
-               7DE202DC1D876F49266D9E7D = {
-                       isa = PBXBuildFile;
-                       fileRef = 8290D7BAC160B3A56B66891A;
-               };
-               075C54DDDBDEA5AAD2F60154 = {
-                       isa = PBXBuildFile;
-                       fileRef = 82800DBA287EF4BAB13B42FB;
-               };
-               2C3D221D2AA87F07B3F1044D = {
-                       isa = PBXBuildFile;
-                       fileRef = 8FE7B37CDE0818DB27BDDEBD;
-               };
-               C38D14DC58F1941DD5E4BF60 = {
-                       isa = PBXBuildFile;
-                       fileRef = 2BE6C2DFD6EBB9A89109AEB5;
-               };
-               2727A191DB1BAAC9C04B9081 = {
-                       isa = PBXBuildFile;
-                       fileRef = 37E4D5C341406B7072120006;
-               };
-               84BAFE82A102D9C350672689 = {
-                       isa = PBXBuildFile;
-                       fileRef = 29D746FC68F69751796671A2;
-               };
-               03FA420AACDD03D50AA16E4A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Foundation.framework;
-                       path = System/Library/Frameworks/Foundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               04AABCD3491318FB32E844B4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = MainHostWindow.cpp;
-                       path = ../../Source/UI/MainHostWindow.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               04DB9A49969ECC740CC25665 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = GraphEditorPanel.h;
-                       path = ../../Source/UI/GraphEditorPanel.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               05863BDFC582C9552A86DF49 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = FilterGraph.cpp;
-                       path = ../../Source/Filters/FilterGraph.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1DADAD8E34AAF4AFF1C69DC4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = BinaryData.h;
-                       path = ../../JuceLibraryCode/BinaryData.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               29D746FC68F69751796671A2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_video.mm";
-                       path = "../../JuceLibraryCode/include_juce_video.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               29E0972229FB44D969035B4E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder.assetcatalog;
-                       name = Images.xcassets;
-                       path = AudioPluginHost/Images.xcassets;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2A6983F82B13F9E8B10299AE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2BE6C2DFD6EBB9A89109AEB5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2F7D965A1284CEF0B20EB657 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreGraphics.framework;
-                       path = System/Library/Frameworks/CoreGraphics.framework;
-                       sourceTree = SDKROOT;
-               };
-               30F22843EFEBF7AA841EB4D6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               31D55A751C790CB81F58DDB7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMedia.framework;
-                       path = System/Library/Frameworks/CoreMedia.framework;
-                       sourceTree = SDKROOT;
-               };
-               336FD30C38BD0A176161B8AE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = FilterIOConfiguration.cpp;
-                       path = ../../Source/Filters/FilterIOConfiguration.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               37E4D5C341406B7072120006 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3C070DD522CDD11FFC87425D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D57FE2A8877F12A61054726 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D78A731234A833CA112AE45 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = GraphEditorPanel.cpp;
-                       path = ../../Source/UI/GraphEditorPanel.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               43647951ECC7F030B9953965 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = InternalFilters.cpp;
-                       path = ../../Source/Filters/InternalFilters.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4C7D82F9274A4F9DBF11235C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5313EB852E41EE58B199B9A2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               545D57A6AA801B38548B0CAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = FilterGraph.h;
-                       path = ../../Source/Filters/FilterGraph.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               57DF618F1DE781556B7AFC32 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               59842A98E5EBBC54B50C04CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5AF0CA7CDFCA90B4DE1F55C3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               5D250A57C7DEA80248F30EED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5EF1D381F42AA8764597F189 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5FBD6C402617272052BB4D81 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               65968EA1B476D71F14DE1D58 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               66643EDF46AE8C5B7956B91D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreText.framework;
-                       path = System/Library/Frameworks/CoreText.framework;
-                       sourceTree = SDKROOT;
-               };
-               683CEE986A2467C850FE99E6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6A71B2BCAC4239072BC2BD7E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6D107D7946DC5976B766345B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = BinaryData.cpp;
-                       path = ../../JuceLibraryCode/BinaryData.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               725D0D9C8C7FF7B3FB3020ED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = FilterIOConfiguration.h;
-                       path = ../../Source/Filters/FilterIOConfiguration.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               81C1A7770E082F56FE5A90A7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               82800DBA287EF4BAB13B42FB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8290D7BAC160B3A56B66891A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               86CA337014D3F67E906FFD28 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               89309C0C5F3269BD06BE7F27 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               8D8BBC353637DA442C5575DA = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = "Plugin Host.app";
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               8FE7B37CDE0818DB27BDDEBD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               938AE72315C6C93949F6220E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               942A0F04EFB8D0B2FF9780BA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               94CB96C8E4B51F52776C2638 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               97918AB43AD460AFA8FA2FFE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = PluginWindow.h;
-                       path = ../../Source/UI/PluginWindow.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EBEE3AE5856E877478607C7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = InternalFilters.h;
-                       path = ../../Source/Filters/InternalFilters.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9F9B445E6755CAA19E4344ED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               A4B568E26157FC282214976F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVKit.framework;
-                       path = System/Library/Frameworks/AVKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               A5DFC13E4F09134B0D226A3E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MainHostWindow.h;
-                       path = ../../Source/UI/MainHostWindow.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A5E7CA8A71D049BE2BD33861 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A66EFAC64B1B67B536C73415 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = HostStartup.cpp;
-                       path = ../../Source/HostStartup.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B1CD9599EB12D77E8AF9241D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = MobileCoreServices.framework;
-                       path = System/Library/Frameworks/MobileCoreServices.framework;
-                       sourceTree = SDKROOT;
-               };
-               B285CAB91AE928C476CA4F9C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B2A1E626CC120982805754F6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = JUCEAppIcon.png;
-                       path = ../../Source/JUCEAppIcon.png;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B86B918291E1090C6A720971 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B8E24A5CEE6B7055537725CF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CFFA8E9A7820C5A27B4393C9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreImage.framework;
-                       path = System/Library/Frameworks/CoreImage.framework;
-                       sourceTree = SDKROOT;
-               };
-               D0026F0A29B486D87E92BB8B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGLES.framework;
-                       path = System/Library/Frameworks/OpenGLES.framework;
-                       sourceTree = SDKROOT;
-               };
-               D4EBC17BDB7F88CCBC76730B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               DDE115D3084ACA6DD6AA4471 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_video";
-                       path = "../../../../modules/juce_video";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E68018DE199135B7F738FB17 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudioKit.framework;
-                       path = System/Library/Frameworks/CoreAudioKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               F299BECFB2AEA6105F014848 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F9AC862E9A3583B6C1488EE0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F9EDC54DFBCF3A63E0AA5D73 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = UIKit.framework;
-                       path = System/Library/Frameworks/UIKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               FA21631C5536EA3DF55C7FA6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FAF867E9E731D0880D40511F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AA37F82D57C9BB4BE78FCCB9 = {
-                       isa = PBXGroup;
-                       children = (
-                               05863BDFC582C9552A86DF49,
-                               545D57A6AA801B38548B0CAC,
-                               336FD30C38BD0A176161B8AE,
-                               725D0D9C8C7FF7B3FB3020ED,
-                               43647951ECC7F030B9953965,
-                               9EBEE3AE5856E877478607C7,
-                       );
-                       name = Filters;
-                       sourceTree = "<group>";
-               };
-               DE7B77306553B1204071B39A = {
-                       isa = PBXGroup;
-                       children = (
-                               3D78A731234A833CA112AE45,
-                               04DB9A49969ECC740CC25665,
-                               04AABCD3491318FB32E844B4,
-                               A5DFC13E4F09134B0D226A3E,
-                               97918AB43AD460AFA8FA2FFE,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               B225B7F2CAABD28A41E7C339 = {
-                       isa = PBXGroup;
-                       children = (
-                               AA37F82D57C9BB4BE78FCCB9,
-                               DE7B77306553B1204071B39A,
-                               A66EFAC64B1B67B536C73415,
-                               B2A1E626CC120982805754F6,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               97790EAEA01CFA5C3CA9737A = {
-                       isa = PBXGroup;
-                       children = (
-                               B225B7F2CAABD28A41E7C339,
-                       );
-                       name = AudioPluginHost;
-                       sourceTree = "<group>";
-               };
-               9D8FE1F65CAD416AA606C47A = {
-                       isa = PBXGroup;
-                       children = (
-                               6A71B2BCAC4239072BC2BD7E,
-                               5313EB852E41EE58B199B9A2,
-                               F9AC862E9A3583B6C1488EE0,
-                               FAF867E9E731D0880D40511F,
-                               3C070DD522CDD11FFC87425D,
-                               3D57FE2A8877F12A61054726,
-                               FA21631C5536EA3DF55C7FA6,
-                               B86B918291E1090C6A720971,
-                               59842A98E5EBBC54B50C04CD,
-                               94CB96C8E4B51F52776C2638,
-                               938AE72315C6C93949F6220E,
-                               F299BECFB2AEA6105F014848,
-                               81C1A7770E082F56FE5A90A7,
-                               DDE115D3084ACA6DD6AA4471,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               7E30376DDAD775FEFE64944C = {
-                       isa = PBXGroup;
-                       children = (
-                               30F22843EFEBF7AA841EB4D6,
-                               6D107D7946DC5976B766345B,
-                               1DADAD8E34AAF4AFF1C69DC4,
-                               4C7D82F9274A4F9DBF11235C,
-                               65968EA1B476D71F14DE1D58,
-                               5D250A57C7DEA80248F30EED,
-                               5FBD6C402617272052BB4D81,
-                               B285CAB91AE928C476CA4F9C,
-                               683CEE986A2467C850FE99E6,
-                               B8E24A5CEE6B7055537725CF,
-                               5EF1D381F42AA8764597F189,
-                               8290D7BAC160B3A56B66891A,
-                               82800DBA287EF4BAB13B42FB,
-                               8FE7B37CDE0818DB27BDDEBD,
-                               2BE6C2DFD6EBB9A89109AEB5,
-                               37E4D5C341406B7072120006,
-                               29D746FC68F69751796671A2,
-                               A5E7CA8A71D049BE2BD33861,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               A97EE73C79DA3F729D46AF48 = {
-                       isa = PBXGroup;
-                       children = (
-                               57DF618F1DE781556B7AFC32,
-                               29E0972229FB44D969035B4E,
-                               2A6983F82B13F9E8B10299AE,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               D1C4804CD275CB57A5C89A2D = {
-                       isa = PBXGroup;
-                       children = (
-                               86CA337014D3F67E906FFD28,
-                               D4EBC17BDB7F88CCBC76730B,
-                               942A0F04EFB8D0B2FF9780BA,
-                               A4B568E26157FC282214976F,
-                               9F9B445E6755CAA19E4344ED,
-                               E68018DE199135B7F738FB17,
-                               2F7D965A1284CEF0B20EB657,
-                               CFFA8E9A7820C5A27B4393C9,
-                               31D55A751C790CB81F58DDB7,
-                               5AF0CA7CDFCA90B4DE1F55C3,
-                               66643EDF46AE8C5B7956B91D,
-                               03FA420AACDD03D50AA16E4A,
-                               B1CD9599EB12D77E8AF9241D,
-                               D0026F0A29B486D87E92BB8B,
-                               89309C0C5F3269BD06BE7F27,
-                               F9EDC54DFBCF3A63E0AA5D73,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               D85C0D11EE4F6C73B9EB5BCD = {
-                       isa = PBXGroup;
-                       children = (
-                               8D8BBC353637DA442C5575DA,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               65BEFC705A89E5C8A9E35C97 = {
-                       isa = PBXGroup;
-                       children = (
-                               97790EAEA01CFA5C3CA9737A,
-                               9D8FE1F65CAD416AA606C47A,
-                               7E30376DDAD775FEFE64944C,
-                               A97EE73C79DA3F729D46AF48,
-                               D1C4804CD275CB57A5C89A2D,
-                               D85C0D11EE4F6C73B9EB5BCD,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               C8B793AC1BEFBE7A99BE8352 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               FCDB1F8A93F59E0F97821456 = {isa = PBXBuildFile; fileRef = 8D8BBC353637DA442C5575DA; };
+               73E371F1B912FCCAE0CD7E5D = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; };
+               21D330A5B13178B12BEAFC3C = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; };
+               851C1165C9E4ACDD19C56A96 = {isa = PBXBuildFile; fileRef = 942A0F04EFB8D0B2FF9780BA; };
+               AF42316D915057E930A5624E = {isa = PBXBuildFile; fileRef = A4B568E26157FC282214976F; };
+               E3CB85BA817BC9E3942A8AB0 = {isa = PBXBuildFile; fileRef = 9F9B445E6755CAA19E4344ED; };
+               70580743C3D5695F065FF698 = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; };
+               1570FCC5CDB7A44DF0077E39 = {isa = PBXBuildFile; fileRef = 2F7D965A1284CEF0B20EB657; };
+               B0D5475F716126465FCE1586 = {isa = PBXBuildFile; fileRef = CFFA8E9A7820C5A27B4393C9; };
+               3470F40DA5D68EC217872906 = {isa = PBXBuildFile; fileRef = 31D55A751C790CB81F58DDB7; };
+               E092A70431B046BF1F50A482 = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; };
+               92EE84159C7027A137F06204 = {isa = PBXBuildFile; fileRef = 66643EDF46AE8C5B7956B91D; };
+               9056B642BEF870098DE344E5 = {isa = PBXBuildFile; fileRef = 03FA420AACDD03D50AA16E4A; };
+               7DE81C004B0FBC563040CC5F = {isa = PBXBuildFile; fileRef = B1CD9599EB12D77E8AF9241D; };
+               2AB9A26C9359C40CA0A937ED = {isa = PBXBuildFile; fileRef = D0026F0A29B486D87E92BB8B; };
+               A02C9F4C4B840C27B6CAFEBD = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; };
+               50AFD116DCA6EC228EFB322D = {isa = PBXBuildFile; fileRef = F9EDC54DFBCF3A63E0AA5D73; };
+               59F4F23BFFDAB414B4801F85 = {isa = PBXBuildFile; fileRef = 29E0972229FB44D969035B4E; };
+               443244451A0F2064D4767337 = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; };
+               2E74188531792924F0C73142 = {isa = PBXBuildFile; fileRef = 05863BDFC582C9552A86DF49; };
+               C8423A9611C8AAF27468847D = {isa = PBXBuildFile; fileRef = 336FD30C38BD0A176161B8AE; };
+               786AF545C1C1E4D11140C3DF = {isa = PBXBuildFile; fileRef = 43647951ECC7F030B9953965; };
+               3E1689E23B9C85F03209DCEF = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; };
+               F635D974599DEC2ED91E6A88 = {isa = PBXBuildFile; fileRef = 04AABCD3491318FB32E844B4; };
+               A1B0416DA378BB0C3AD6F74B = {isa = PBXBuildFile; fileRef = A66EFAC64B1B67B536C73415; };
+               A0144A682BF4843C8CF53FE4 = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; };
+               15CCE43D7DCFC649638919D4 = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; };
+               5C4D406B924230F83E3580AD = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; };
+               F4DD98B9310B679D50A2C8A6 = {isa = PBXBuildFile; fileRef = 5D250A57C7DEA80248F30EED; };
+               CAF0DE157C8F7D9F168AA3B6 = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; };
+               0F20A4AE04736634F097F5A6 = {isa = PBXBuildFile; fileRef = B285CAB91AE928C476CA4F9C; };
+               76A80851698FC773D2479B4E = {isa = PBXBuildFile; fileRef = 683CEE986A2467C850FE99E6; };
+               E4A926EF695823F0F13268FF = {isa = PBXBuildFile; fileRef = B8E24A5CEE6B7055537725CF; };
+               A09E93F1B354E1FF8B3E9ABE = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; };
+               7DE202DC1D876F49266D9E7D = {isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; };
+               075C54DDDBDEA5AAD2F60154 = {isa = PBXBuildFile; fileRef = 82800DBA287EF4BAB13B42FB; };
+               2C3D221D2AA87F07B3F1044D = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; };
+               C38D14DC58F1941DD5E4BF60 = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; };
+               2727A191DB1BAAC9C04B9081 = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; };
+               84BAFE82A102D9C350672689 = {isa = PBXBuildFile; fileRef = 29D746FC68F69751796671A2; };
+               03FA420AACDD03D50AA16E4A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+               04AABCD3491318FB32E844B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainHostWindow.cpp; path = ../../Source/UI/MainHostWindow.cpp; sourceTree = "SOURCE_ROOT"; };
+               04DB9A49969ECC740CC25665 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/UI/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; };
+               05863BDFC582C9552A86DF49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterGraph.cpp; path = ../../Source/Filters/FilterGraph.cpp; sourceTree = "SOURCE_ROOT"; };
+               1DADAD8E34AAF4AFF1C69DC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+               29D746FC68F69751796671A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+               29E0972229FB44D969035B4E = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioPluginHost/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+               2A6983F82B13F9E8B10299AE = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               2BE6C2DFD6EBB9A89109AEB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               2F7D965A1284CEF0B20EB657 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+               30F22843EFEBF7AA841EB4D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               31D55A751C790CB81F58DDB7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+               336FD30C38BD0A176161B8AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterIOConfiguration.cpp; path = ../../Source/Filters/FilterIOConfiguration.cpp; sourceTree = "SOURCE_ROOT"; };
+               37E4D5C341406B7072120006 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               3C070DD522CDD11FFC87425D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               3D57FE2A8877F12A61054726 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               3D78A731234A833CA112AE45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GraphEditorPanel.cpp; path = ../../Source/UI/GraphEditorPanel.cpp; sourceTree = "SOURCE_ROOT"; };
+               43647951ECC7F030B9953965 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InternalFilters.cpp; path = ../../Source/Filters/InternalFilters.cpp; sourceTree = "SOURCE_ROOT"; };
+               4C7D82F9274A4F9DBF11235C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               5313EB852E41EE58B199B9A2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               545D57A6AA801B38548B0CAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterGraph.h; path = ../../Source/Filters/FilterGraph.h; sourceTree = "SOURCE_ROOT"; };
+               57DF618F1DE781556B7AFC32 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               59842A98E5EBBC54B50C04CD = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               5AF0CA7CDFCA90B4DE1F55C3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               5D250A57C7DEA80248F30EED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               5EF1D381F42AA8764597F189 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               5FBD6C402617272052BB4D81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               65968EA1B476D71F14DE1D58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               66643EDF46AE8C5B7956B91D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+               683CEE986A2467C850FE99E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               6A71B2BCAC4239072BC2BD7E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               6D107D7946DC5976B766345B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+               725D0D9C8C7FF7B3FB3020ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterIOConfiguration.h; path = ../../Source/Filters/FilterIOConfiguration.h; sourceTree = "SOURCE_ROOT"; };
+               81C1A7770E082F56FE5A90A7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               82800DBA287EF4BAB13B42FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               8290D7BAC160B3A56B66891A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               86CA337014D3F67E906FFD28 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               89309C0C5F3269BD06BE7F27 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               8D8BBC353637DA442C5575DA = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Plugin Host.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               8FE7B37CDE0818DB27BDDEBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               938AE72315C6C93949F6220E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               942A0F04EFB8D0B2FF9780BA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               94CB96C8E4B51F52776C2638 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               97918AB43AD460AFA8FA2FFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = ../../Source/UI/PluginWindow.h; sourceTree = "SOURCE_ROOT"; };
+               9EBEE3AE5856E877478607C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalFilters.h; path = ../../Source/Filters/InternalFilters.h; sourceTree = "SOURCE_ROOT"; };
+               9F9B445E6755CAA19E4344ED = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               A4B568E26157FC282214976F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+               A5DFC13E4F09134B0D226A3E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = "SOURCE_ROOT"; };
+               A5E7CA8A71D049BE2BD33861 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               A66EFAC64B1B67B536C73415 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = "SOURCE_ROOT"; };
+               B1CD9599EB12D77E8AF9241D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+               B285CAB91AE928C476CA4F9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               B2A1E626CC120982805754F6 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+               B86B918291E1090C6A720971 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               B8E24A5CEE6B7055537725CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               CFFA8E9A7820C5A27B4393C9 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+               D0026F0A29B486D87E92BB8B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+               D4EBC17BDB7F88CCBC76730B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               DDE115D3084ACA6DD6AA4471 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+               E68018DE199135B7F738FB17 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+               F299BECFB2AEA6105F014848 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               F9AC862E9A3583B6C1488EE0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               F9EDC54DFBCF3A63E0AA5D73 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+               FA21631C5536EA3DF55C7FA6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               FAF867E9E731D0880D40511F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               AA37F82D57C9BB4BE78FCCB9 = {isa = PBXGroup; children = (
+                                       05863BDFC582C9552A86DF49,
+                                       545D57A6AA801B38548B0CAC,
+                                       336FD30C38BD0A176161B8AE,
+                                       725D0D9C8C7FF7B3FB3020ED,
+                                       43647951ECC7F030B9953965,
+                                       9EBEE3AE5856E877478607C7, ); name = Filters; sourceTree = "<group>"; };
+               DE7B77306553B1204071B39A = {isa = PBXGroup; children = (
+                                       3D78A731234A833CA112AE45,
+                                       04DB9A49969ECC740CC25665,
+                                       04AABCD3491318FB32E844B4,
+                                       A5DFC13E4F09134B0D226A3E,
+                                       97918AB43AD460AFA8FA2FFE, ); name = UI; sourceTree = "<group>"; };
+               B225B7F2CAABD28A41E7C339 = {isa = PBXGroup; children = (
+                                       AA37F82D57C9BB4BE78FCCB9,
+                                       DE7B77306553B1204071B39A,
+                                       A66EFAC64B1B67B536C73415,
+                                       B2A1E626CC120982805754F6, ); name = Source; sourceTree = "<group>"; };
+               97790EAEA01CFA5C3CA9737A = {isa = PBXGroup; children = (
+                                       B225B7F2CAABD28A41E7C339, ); name = AudioPluginHost; sourceTree = "<group>"; };
+               9D8FE1F65CAD416AA606C47A = {isa = PBXGroup; children = (
+                                       6A71B2BCAC4239072BC2BD7E,
+                                       5313EB852E41EE58B199B9A2,
+                                       F9AC862E9A3583B6C1488EE0,
+                                       FAF867E9E731D0880D40511F,
+                                       3C070DD522CDD11FFC87425D,
+                                       3D57FE2A8877F12A61054726,
+                                       FA21631C5536EA3DF55C7FA6,
+                                       B86B918291E1090C6A720971,
+                                       59842A98E5EBBC54B50C04CD,
+                                       94CB96C8E4B51F52776C2638,
+                                       938AE72315C6C93949F6220E,
+                                       F299BECFB2AEA6105F014848,
+                                       81C1A7770E082F56FE5A90A7,
+                                       DDE115D3084ACA6DD6AA4471, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               7E30376DDAD775FEFE64944C = {isa = PBXGroup; children = (
+                                       30F22843EFEBF7AA841EB4D6,
+                                       6D107D7946DC5976B766345B,
+                                       1DADAD8E34AAF4AFF1C69DC4,
+                                       4C7D82F9274A4F9DBF11235C,
+                                       65968EA1B476D71F14DE1D58,
+                                       5D250A57C7DEA80248F30EED,
+                                       5FBD6C402617272052BB4D81,
+                                       B285CAB91AE928C476CA4F9C,
+                                       683CEE986A2467C850FE99E6,
+                                       B8E24A5CEE6B7055537725CF,
+                                       5EF1D381F42AA8764597F189,
+                                       8290D7BAC160B3A56B66891A,
+                                       82800DBA287EF4BAB13B42FB,
+                                       8FE7B37CDE0818DB27BDDEBD,
+                                       2BE6C2DFD6EBB9A89109AEB5,
+                                       37E4D5C341406B7072120006,
+                                       29D746FC68F69751796671A2,
+                                       A5E7CA8A71D049BE2BD33861, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               A97EE73C79DA3F729D46AF48 = {isa = PBXGroup; children = (
+                                       57DF618F1DE781556B7AFC32,
+                                       29E0972229FB44D969035B4E,
+                                       2A6983F82B13F9E8B10299AE, ); name = Resources; sourceTree = "<group>"; };
+               D1C4804CD275CB57A5C89A2D = {isa = PBXGroup; children = (
+                                       86CA337014D3F67E906FFD28,
+                                       D4EBC17BDB7F88CCBC76730B,
+                                       942A0F04EFB8D0B2FF9780BA,
+                                       A4B568E26157FC282214976F,
+                                       9F9B445E6755CAA19E4344ED,
+                                       E68018DE199135B7F738FB17,
+                                       2F7D965A1284CEF0B20EB657,
+                                       CFFA8E9A7820C5A27B4393C9,
+                                       31D55A751C790CB81F58DDB7,
+                                       5AF0CA7CDFCA90B4DE1F55C3,
+                                       66643EDF46AE8C5B7956B91D,
+                                       03FA420AACDD03D50AA16E4A,
+                                       B1CD9599EB12D77E8AF9241D,
+                                       D0026F0A29B486D87E92BB8B,
+                                       89309C0C5F3269BD06BE7F27,
+                                       F9EDC54DFBCF3A63E0AA5D73, ); name = Frameworks; sourceTree = "<group>"; };
+               D85C0D11EE4F6C73B9EB5BCD = {isa = PBXGroup; children = (
+                                       8D8BBC353637DA442C5575DA, ); name = Products; sourceTree = "<group>"; };
+               65BEFC705A89E5C8A9E35C97 = {isa = PBXGroup; children = (
+                                       97790EAEA01CFA5C3CA9737A,
+                                       9D8FE1F65CAD416AA606C47A,
+                                       7E30376DDAD775FEFE64944C,
+                                       A97EE73C79DA3F729D46AF48,
+                                       D1C4804CD275CB57A5C89A2D,
+                                       D85C0D11EE4F6C73B9EB5BCD, ); name = Source; sourceTree = "<group>"; };
+               C8B793AC1BEFBE7A99BE8352 = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
-                               PRODUCT_NAME = "Plugin Host";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               49453CC5AD9F08D2738464AC = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               49453CC5AD9F08D2738464AC = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
-                               PRODUCT_NAME = "Plugin Host";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               8D1CA827F1EFD443BDCF198A = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Release; };
+               8D1CA827F1EFD443BDCF198A = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               C9295196717FABE454A210B7 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               C9295196717FABE454A210B7 = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               B9D79D85AC7DE5BED1B6547C = {
-                       isa = PBXTargetDependency;
-                       target = DE12B7643D374BFF7E4FEB1C;
-               };
-               493C2C5E457692E5149C5525 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               8D1CA827F1EFD443BDCF198A,
-                               C9295196717FABE454A210B7,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               E4ECAE24A646A7D1585F776C = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               C8B793AC1BEFBE7A99BE8352,
-                               49453CC5AD9F08D2738464AC,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               2429BB4D705CC57F49418CFB = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               59F4F23BFFDAB414B4801F85,
-                               443244451A0F2064D4767337,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               E8E94B3C187DA578BFCBDA98 = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               2E74188531792924F0C73142,
-                               C8423A9611C8AAF27468847D,
-                               786AF545C1C1E4D11140C3DF,
-                               3E1689E23B9C85F03209DCEF,
-                               F635D974599DEC2ED91E6A88,
-                               A1B0416DA378BB0C3AD6F74B,
-                               A0144A682BF4843C8CF53FE4,
-                               15CCE43D7DCFC649638919D4,
-                               5C4D406B924230F83E3580AD,
-                               F4DD98B9310B679D50A2C8A6,
-                               CAF0DE157C8F7D9F168AA3B6,
-                               0F20A4AE04736634F097F5A6,
-                               76A80851698FC773D2479B4E,
-                               E4A926EF695823F0F13268FF,
-                               A09E93F1B354E1FF8B3E9ABE,
-                               7DE202DC1D876F49266D9E7D,
-                               075C54DDDBDEA5AAD2F60154,
-                               2C3D221D2AA87F07B3F1044D,
-                               C38D14DC58F1941DD5E4BF60,
-                               2727A191DB1BAAC9C04B9081,
-                               84BAFE82A102D9C350672689,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               C515A1FE1A53D3968C22FAEF = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               73E371F1B912FCCAE0CD7E5D,
-                               21D330A5B13178B12BEAFC3C,
-                               851C1165C9E4ACDD19C56A96,
-                               AF42316D915057E930A5624E,
-                               E3CB85BA817BC9E3942A8AB0,
-                               70580743C3D5695F065FF698,
-                               1570FCC5CDB7A44DF0077E39,
-                               B0D5475F716126465FCE1586,
-                               3470F40DA5D68EC217872906,
-                               E092A70431B046BF1F50A482,
-                               92EE84159C7027A137F06204,
-                               9056B642BEF870098DE344E5,
-                               7DE81C004B0FBC563040CC5F,
-                               2AB9A26C9359C40CA0A937ED,
-                               A02C9F4C4B840C27B6CAFEBD,
-                               50AFD116DCA6EC228EFB322D,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               DE12B7643D374BFF7E4FEB1C = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = E4ECAE24A646A7D1585F776C;
-                       buildPhases = (
-                               2429BB4D705CC57F49418CFB,
-                               E8E94B3C187DA578BFCBDA98,
-                               C515A1FE1A53D3968C22FAEF,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "AudioPluginHost - App";
-                       productName = AudioPluginHost;
-                       productReference = 8D8BBC353637DA442C5575DA;
-                       productType = "com.apple.product-type.application";
-               };
-               ADE6E539DB98A302483A82D0 = {
-                       isa = PBXProject;
-                       buildConfigurationList = 493C2C5E457692E5149C5525;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 65BEFC705A89E5C8A9E35C97;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (DE12B7643D374BFF7E4FEB1C);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               B9D79D85AC7DE5BED1B6547C = {isa = PBXTargetDependency; target = DE12B7643D374BFF7E4FEB1C; };
+               493C2C5E457692E5149C5525 = {isa = XCConfigurationList; buildConfigurations = (
+                                       8D1CA827F1EFD443BDCF198A,
+                                       C9295196717FABE454A210B7, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               E4ECAE24A646A7D1585F776C = {isa = XCConfigurationList; buildConfigurations = (
+                                       C8B793AC1BEFBE7A99BE8352,
+                                       49453CC5AD9F08D2738464AC, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               2429BB4D705CC57F49418CFB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       59F4F23BFFDAB414B4801F85,
+                                       443244451A0F2064D4767337, ); runOnlyForDeploymentPostprocessing = 0; };
+               E8E94B3C187DA578BFCBDA98 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       2E74188531792924F0C73142,
+                                       C8423A9611C8AAF27468847D,
+                                       786AF545C1C1E4D11140C3DF,
+                                       3E1689E23B9C85F03209DCEF,
+                                       F635D974599DEC2ED91E6A88,
+                                       A1B0416DA378BB0C3AD6F74B,
+                                       A0144A682BF4843C8CF53FE4,
+                                       15CCE43D7DCFC649638919D4,
+                                       5C4D406B924230F83E3580AD,
+                                       F4DD98B9310B679D50A2C8A6,
+                                       CAF0DE157C8F7D9F168AA3B6,
+                                       0F20A4AE04736634F097F5A6,
+                                       76A80851698FC773D2479B4E,
+                                       E4A926EF695823F0F13268FF,
+                                       A09E93F1B354E1FF8B3E9ABE,
+                                       7DE202DC1D876F49266D9E7D,
+                                       075C54DDDBDEA5AAD2F60154,
+                                       2C3D221D2AA87F07B3F1044D,
+                                       C38D14DC58F1941DD5E4BF60,
+                                       2727A191DB1BAAC9C04B9081,
+                                       84BAFE82A102D9C350672689, ); runOnlyForDeploymentPostprocessing = 0; };
+               C515A1FE1A53D3968C22FAEF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       73E371F1B912FCCAE0CD7E5D,
+                                       21D330A5B13178B12BEAFC3C,
+                                       851C1165C9E4ACDD19C56A96,
+                                       AF42316D915057E930A5624E,
+                                       E3CB85BA817BC9E3942A8AB0,
+                                       70580743C3D5695F065FF698,
+                                       1570FCC5CDB7A44DF0077E39,
+                                       B0D5475F716126465FCE1586,
+                                       3470F40DA5D68EC217872906,
+                                       E092A70431B046BF1F50A482,
+                                       92EE84159C7027A137F06204,
+                                       9056B642BEF870098DE344E5,
+                                       7DE81C004B0FBC563040CC5F,
+                                       2AB9A26C9359C40CA0A937ED,
+                                       A02C9F4C4B840C27B6CAFEBD,
+                                       50AFD116DCA6EC228EFB322D, ); runOnlyForDeploymentPostprocessing = 0; };
+               DE12B7643D374BFF7E4FEB1C = {isa = PBXNativeTarget; buildConfigurationList = E4ECAE24A646A7D1585F776C; buildPhases = (
+                                       2429BB4D705CC57F49418CFB,
+                                       E8E94B3C187DA578BFCBDA98,
+                                       C515A1FE1A53D3968C22FAEF, ); buildRules = ( ); dependencies = (  ); name = "AudioPluginHost - App"; productName = AudioPluginHost; productReference = 8D8BBC353637DA442C5575DA; productType = "com.apple.product-type.application"; };
+               ADE6E539DB98A302483A82D0 = {isa = PBXProject; buildConfigurationList = 493C2C5E457692E5149C5525; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 65BEFC705A89E5C8A9E35C97; projectDirPath = ""; projectRoot = ""; targets = (DE12B7643D374BFF7E4FEB1C); };
        };
        rootObject = ADE6E539DB98A302483A82D0;
 }
index 5cc40c08338afa816115590ab1cac3ff5146993e..209e253f24dd5eaf87d2e94038f4b41f4da7919f 100644 (file)
@@ -3,10 +3,10 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
 <plist>\r
   <dict>\r
-    <key>NSMicrophoneUsageDescription</key>\r
-    <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
     <key>LSRequiresIPhoneOS</key>\r
     <true/>\r
+    <key>NSMicrophoneUsageDescription</key>\r
+    <string>This is an audio app which requires audio input. If you do not have a USB audio interface connected it will use the microphone.</string>\r
     <key>UIViewControllerBasedStatusBarAppearance</key>\r
     <false/>\r
     <key>CFBundleExecutable</key>\r
index 2b5f6944d91649273046ba6880f74c354a39e682..6b8cbf5efae44e25bfd5a94702964078932b2952 100644 (file)
 //==============================================================================\r
 // juce_audio_devices flags:\r
 \r
-#ifndef    JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 #ifndef    JUCE_ASIO\r
  //#define JUCE_ASIO 0\r
 #endif\r
  //#define JUCE_USE_ANDROID_OPENSLES 0\r
 #endif\r
 \r
+#ifndef    JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 #ifndef    JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
  //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
 #endif\r
 // juce_audio_processors flags:\r
 \r
 #ifndef    JUCE_PLUGINHOST_VST\r
- //#define JUCE_PLUGINHOST_VST 0\r
+ #define   JUCE_PLUGINHOST_VST 1\r
 #endif\r
 \r
 #ifndef    JUCE_PLUGINHOST_VST3\r
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
  //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_events flags:\r
 \r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_USE_CAMERA\r
  #define   JUCE_USE_CAMERA 0\r
 #endif\r
-\r
-#ifndef    JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index de10104fc5c76f667f1cfeb0538a94bc30fa433f..07ae322ad172bb9a2c0eded8f1e6aa6a2dc2323f 100644 (file)
@@ -660,8 +660,7 @@ const char* JUCEAppIcon_png = (const char*) temp_binary_data_0;
 const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)\r
 {\r
     unsigned int hash = 0;\r
-\r
-    if (resourceNameUTF8 != nullptr)\r
+    if (resourceNameUTF8 != 0)\r
         while (*resourceNameUTF8 != 0)\r
             hash = 31 * hash + (unsigned int) *resourceNameUTF8++;\r
 \r
index 01d36b3b84f771af08c6dc108333c9d28c34c0e4..9d236c74b2f1da916c18c4b1576bc3984ffae016 100644 (file)
@@ -41,7 +41,6 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "AudioPluginHost";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
     const char* const  versionString  = "1.0.0";\r
     const int          versionNumber  = 0x10000;\r
 }\r
index 07ee7c67bf6a1a26791f1f98e3ae551969ead84d..47a3223712e3f6a563727cfb5f7aed1d10507962 100644 (file)
@@ -40,7 +40,11 @@ FilterGraph::FilterGraph (AudioPluginFormatManager& fm)
       formatManager (fm)\r
 {\r
     newDocument();\r
+\r
     graph.addListener (this);\r
+    graph.addChangeListener (this);\r
+\r
+    setChangedFlag (false);\r
 }\r
 \r
 FilterGraph::~FilterGraph()\r
@@ -52,7 +56,7 @@ FilterGraph::~FilterGraph()
 \r
 FilterGraph::NodeID FilterGraph::getNextUID() noexcept\r
 {\r
-    return FilterGraph::NodeID (++(lastUID.uid));\r
+    return ++lastUID;\r
 }\r
 \r
 //==============================================================================\r
@@ -152,7 +156,7 @@ PluginWindow* FilterGraph::getOrCreateWindowFor (AudioProcessorGraph::Node* node
     closeAnyOpenPluginWindows();\r
    #else\r
     for (auto* w : activePluginWindows)\r
-        if (w->node.get() == node && w->type == type)\r
+        if (w->node == node && w->type == type)\r
             return w;\r
    #endif\r
 \r
@@ -169,15 +173,6 @@ PluginWindow* FilterGraph::getOrCreateWindowFor (AudioProcessorGraph::Node* node
             }\r
         }\r
 \r
-       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (! node->properties["DPIAware"]\r
-            && ! node->getProcessor()->getName().contains ("Kontakt")) // Kontakt doesn't behave correctly in DPI unaware mode...\r
-        {\r
-            ScopedDPIAwarenessDisabler disableDPIAwareness;\r
-            return activePluginWindows.add (new PluginWindow (node, type, activePluginWindows));\r
-        }\r
-       #endif\r
-\r
         return activePluginWindows.add (new PluginWindow (node, type, activePluginWindows));\r
     }\r
 \r
@@ -205,18 +200,13 @@ void FilterGraph::newDocument()
     clear();\r
     setFile ({});\r
 \r
-    graph.removeChangeListener (this);\r
-\r
     InternalPluginFormat internalFormat;\r
 \r
     addPlugin (internalFormat.audioInDesc,  { 0.5,  0.1 });\r
     addPlugin (internalFormat.midiInDesc,   { 0.25, 0.1 });\r
     addPlugin (internalFormat.audioOutDesc, { 0.5,  0.9 });\r
 \r
-    MessageManager::callAsync ([this] () {\r
-        setChangedFlag (false);\r
-        graph.addChangeListener (this);\r
-    } );\r
+    setChangedFlag (false);\r
 }\r
 \r
 Result FilterGraph::loadDocument (const File& file)\r
@@ -227,14 +217,7 @@ Result FilterGraph::loadDocument (const File& file)
     if (xml == nullptr || ! xml->hasTagName ("FILTERGRAPH"))\r
         return Result::fail ("Not a valid filter graph file");\r
 \r
-    graph.removeChangeListener (this);\r
     restoreFromXml (*xml);\r
-\r
-    MessageManager::callAsync ([this] () {\r
-        setChangedFlag (false);\r
-        graph.addChangeListener (this);\r
-    } );\r
-\r
     return Result::ok();\r
 }\r
 \r
@@ -335,7 +318,7 @@ static XmlElement* createNodeXml (AudioProcessorGraph::Node* const node) noexcep
     if (auto* plugin = dynamic_cast<AudioPluginInstance*> (node->getProcessor()))\r
     {\r
         auto e = new XmlElement ("FILTER");\r
-        e->setAttribute ("uid", (int) node->nodeID.uid);\r
+        e->setAttribute ("uid", (int) node->nodeID);\r
         e->setAttribute ("x", node->properties ["x"].toString());\r
         e->setAttribute ("y", node->properties ["y"].toString());\r
 \r
@@ -401,7 +384,7 @@ void FilterGraph::createNodeFromXml (const XmlElement& xml)
             instance->setBusesLayout (layout);\r
         }\r
 \r
-        if (auto node = graph.addNode (instance, NodeID ((uint32) xml.getIntAttribute ("uid"))))\r
+        if (auto node = graph.addNode (instance, (NodeID) xml.getIntAttribute ("uid")))\r
         {\r
             if (auto* state = xml.getChildByName ("STATE"))\r
             {\r
@@ -448,9 +431,9 @@ XmlElement* FilterGraph::createXml() const
     {\r
         auto e = xml->createNewChildElement ("CONNECTION");\r
 \r
-        e->setAttribute ("srcFilter", (int) connection.source.nodeID.uid);\r
+        e->setAttribute ("srcFilter", (int) connection.source.nodeID);\r
         e->setAttribute ("srcChannel", connection.source.channelIndex);\r
-        e->setAttribute ("dstFilter", (int) connection.destination.nodeID.uid);\r
+        e->setAttribute ("dstFilter", (int) connection.destination.nodeID);\r
         e->setAttribute ("dstChannel", connection.destination.channelIndex);\r
     }\r
 \r
@@ -469,8 +452,8 @@ void FilterGraph::restoreFromXml (const XmlElement& xml)
 \r
     forEachXmlChildElementWithTagName (xml, e, "CONNECTION")\r
     {\r
-        graph.addConnection ({ { NodeID ((uint32) e->getIntAttribute ("srcFilter")), e->getIntAttribute ("srcChannel") },\r
-                               { NodeID ((uint32) e->getIntAttribute ("dstFilter")), e->getIntAttribute ("dstChannel") } });\r
+        graph.addConnection ({ { (NodeID) e->getIntAttribute ("srcFilter"), e->getIntAttribute ("srcChannel") },\r
+                               { (NodeID) e->getIntAttribute ("dstFilter"), e->getIntAttribute ("dstChannel") } });\r
     }\r
 \r
     graph.removeIllegalConnections();\r
index 592642d4dffc0d33c49bb3c918d8867ceb483291..62661b52839cc121ff5e9ef54c77b4944e9843f9 100644 (file)
@@ -43,7 +43,7 @@ public:
     ~FilterGraph();\r
 \r
     //==============================================================================\r
-    using NodeID = AudioProcessorGraph::NodeID;\r
+    typedef AudioProcessorGraph::NodeID NodeID;\r
 \r
     void addPlugin (const PluginDescription&, Point<double>);\r
 \r
@@ -88,7 +88,7 @@ private:
     AudioPluginFormatManager& formatManager;\r
     OwnedArray<PluginWindow> activePluginWindows;\r
 \r
-    NodeID lastUID;\r
+    NodeID lastUID = 0;\r
     NodeID getNextUID() noexcept;\r
 \r
     void createNodeFromXml (const XmlElement& xml);\r
index f5dc0b161cd776280bd4aa5c9b8d51349e4cc135..db17db82187a45426caff7a6626aff00b41c1fd7 100644 (file)
@@ -507,7 +507,7 @@ void FilterIOConfigurationWindow::update()
     auto nodeID = getNodeID();\r
 \r
     if (auto* graph = getGraph())\r
-        if (nodeID != AudioProcessorGraph::NodeID())\r
+        if (nodeID != 0)\r
             graph->disconnectNode (nodeID);\r
 \r
     if (auto* graphEditor = getGraphEditor())\r
@@ -522,7 +522,7 @@ AudioProcessorGraph::NodeID FilterIOConfigurationWindow::getNodeID() const
             if (node->getProcessor() == getAudioProcessor())\r
                 return node->nodeID;\r
 \r
-    return {};\r
+    return 0;\r
 }\r
 \r
 MainHostWindow* FilterIOConfigurationWindow::getMainWindow() const\r
index c024e13c9de93f50d0a5891d14095ebd9e9031dd..0b1f2c8d8485652829f04f8315ce6a11a14a23cd 100644 (file)
@@ -377,7 +377,7 @@ void InternalPluginFormat::createPluginInstance (const PluginDescription& desc,
                                                  double /*initialSampleRate*/,\r
                                                  int /*initialBufferSize*/,\r
                                                  void* userData,\r
-                                                 PluginCreationCallback callback)\r
+                                                 void (*callback) (void*, AudioPluginInstance*, const String&))\r
 {\r
     auto* p = createInstance (desc.name);\r
 \r
index 4432ff08a1d67fc83b21f8c443103524260e6808..cdcde6dc65a86ad5e443557748356a25c29060bf 100644 (file)
@@ -59,7 +59,7 @@ public:
 private:\r
     //==============================================================================\r
     void createPluginInstance (const PluginDescription&, double initialSampleRate, int initialBufferSize,\r
-                               void* userData, PluginCreationCallback) override;\r
+                               void* userData, void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
     AudioPluginInstance* createInstance (const String& name);\r
 \r
     bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
index 2b7b8d04105da21d8e75bcd8ca7657d7c10df930..cd51a8bbded63db8551401c03202a651d0d24d00 100644 (file)
@@ -146,7 +146,7 @@ struct GraphEditorPanel::PinComponent   : public Component,
 \r
     void mouseDown (const MouseEvent& e) override\r
     {\r
-        AudioProcessorGraph::NodeAndChannel dummy { {}, 0 };\r
+        AudioProcessorGraph::NodeAndChannel dummy { 0, 0 };\r
 \r
         panel.beginConnectorDrag (isInput ? dummy : pin,\r
                                   isInput ? pin : dummy,\r
@@ -177,7 +177,7 @@ struct GraphEditorPanel::FilterComponent   : public Component,
                                              public Timer,\r
                                              private AudioProcessorParameter::Listener\r
 {\r
-    FilterComponent (GraphEditorPanel& p, AudioProcessorGraph::NodeID id)  : panel (p), graph (p.graph), pluginID (id)\r
+    FilterComponent (GraphEditorPanel& p, uint32 id)  : panel (p), graph (p.graph), pluginID (id)\r
     {\r
         shadow.setShadowProperties (DropShadow (Colours::black.withAlpha (0.5f), 3, { 0, 1 }));\r
         setComponentEffect (&shadow);\r
@@ -410,13 +410,6 @@ struct GraphEditorPanel::FilterComponent   : public Component,
             menu->addItem (10, "Show plugin GUI");\r
             menu->addItem (11, "Show all programs");\r
             menu->addItem (12, "Show all parameters");\r
-           #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            auto isTicked = false;\r
-            if (auto* node = graph.graph.getNodeForId (pluginID))\r
-                isTicked = node->properties["DPIAware"];\r
-\r
-            menu->addItem (13, "Enable DPI awareness", true, isTicked);\r
-           #endif\r
         }\r
 \r
         menu->addSeparator();\r
@@ -440,13 +433,7 @@ struct GraphEditorPanel::FilterComponent   : public Component,
             }\r
             case 10:  showWindow (PluginWindow::Type::normal); break;\r
             case 11:  showWindow (PluginWindow::Type::programs); break;\r
-            case 12:  showWindow (PluginWindow::Type::generic)  ; break;\r
-            case 13:\r
-            {\r
-                if (auto* node = graph.graph.getNodeForId (pluginID))\r
-                    node->properties.set ("DPIAware", ! node->properties ["DPIAware"]);\r
-                break;\r
-            }\r
+            case 12:  showWindow (PluginWindow::Type::generic); break;\r
             case 20:  showWindow (PluginWindow::Type::audioIO); break;\r
             case 21:  testStateSaveLoad(); break;\r
 \r
@@ -624,7 +611,7 @@ struct GraphEditorPanel::ConnectorComponent   : public Component,
             getDistancesFromEnds (getPosition().toFloat() + e.position, distanceFromStart, distanceFromEnd);\r
             const bool isNearerSource = (distanceFromStart < distanceFromEnd);\r
 \r
-            AudioProcessorGraph::NodeAndChannel dummy { {}, 0 };\r
+            AudioProcessorGraph::NodeAndChannel dummy { 0, 0 };\r
 \r
             panel.beginConnectorDrag (isNearerSource ? dummy : connection.source,\r
                                       isNearerSource ? connection.destination : dummy,\r
@@ -688,7 +675,7 @@ struct GraphEditorPanel::ConnectorComponent   : public Component,
 \r
     GraphEditorPanel& panel;\r
     FilterGraph& graph;\r
-    AudioProcessorGraph::Connection connection { { {}, 0 }, { {}, 0 } };\r
+    AudioProcessorGraph::Connection connection { { 0, 0 }, { 0, 0 } };\r
     Point<float> lastInputPos, lastOutputPos;\r
     Path linePath, hitPath;\r
     bool dragging = false;\r
@@ -749,10 +736,10 @@ void GraphEditorPanel::createNewPlugin (const PluginDescription& desc, Point<int
     graph.addPlugin (desc, position.toDouble() / Point<double> ((double) getWidth(), (double) getHeight()));\r
 }\r
 \r
-GraphEditorPanel::FilterComponent* GraphEditorPanel::getComponentForFilter (AudioProcessorGraph::NodeID nodeID) const\r
+GraphEditorPanel::FilterComponent* GraphEditorPanel::getComponentForFilter (const uint32 filterID) const\r
 {\r
     for (auto* fc : nodes)\r
-       if (fc->pluginID == nodeID)\r
+       if (fc->pluginID == filterID)\r
             return fc;\r
 \r
     return nullptr;\r
@@ -883,11 +870,11 @@ void GraphEditorPanel::dragConnector (const MouseEvent& e)
         {\r
             auto connection = draggingConnector->connection;\r
 \r
-            if (connection.source.nodeID == AudioProcessorGraph::NodeID() && ! pin->isInput)\r
+            if (connection.source.nodeID == 0 && ! pin->isInput)\r
             {\r
                 connection.source = pin->pin;\r
             }\r
-            else if (connection.destination.nodeID == AudioProcessorGraph::NodeID() && pin->isInput)\r
+            else if (connection.destination.nodeID == 0 && pin->isInput)\r
             {\r
                 connection.destination = pin->pin;\r
             }\r
@@ -899,7 +886,7 @@ void GraphEditorPanel::dragConnector (const MouseEvent& e)
             }\r
         }\r
 \r
-        if (draggingConnector->connection.source.nodeID == AudioProcessorGraph::NodeID())\r
+        if (draggingConnector->connection.source.nodeID == 0)\r
             draggingConnector->dragStart (pos);\r
         else\r
             draggingConnector->dragEnd (pos);\r
@@ -920,7 +907,7 @@ void GraphEditorPanel::endDraggingConnector (const MouseEvent& e)
 \r
     if (auto* pin = findPinAt (e2.position))\r
     {\r
-        if (connection.source.nodeID == AudioProcessorGraph::NodeID())\r
+        if (connection.source.nodeID == 0)\r
         {\r
             if (pin->isInput)\r
                 return;\r
index e39566749248ce749d26a7fdcc552540afea6fa4..9abd73a38c3a20b6e6286ebb7bd00bb1ee549ec3 100644 (file)
@@ -81,9 +81,8 @@ MainHostWindow::MainHostWindow()
     formatManager.addDefaultFormats();\r
     formatManager.addFormat (new InternalPluginFormat());\r
 \r
-    auto safeThis = SafePointer<MainHostWindow> (this);\r
     RuntimePermissions::request (RuntimePermissions::recordAudio,\r
-                                 [safeThis] (bool granted) mutable\r
+                                 [safeThis = SafePointer<MainHostWindow> (this)] (bool granted) mutable\r
                                  {\r
                                      std::unique_ptr<XmlElement> savedAudioState (getAppProperties().getUserSettings()\r
                                                                                   ->getXmlValue ("audioDeviceState"));\r
@@ -574,11 +573,9 @@ void MainHostWindow::showAudioSettings()
     o.resizable                     = false;\r
 \r
      auto* w = o.create();\r
-     auto safeThis = SafePointer<MainHostWindow> (this);\r
-\r
      w->enterModalState (true,\r
                          ModalCallbackFunction::create\r
-                         ([safeThis] (int)\r
+                         ([safeThis = SafePointer<MainHostWindow> (this)] (int)\r
                          {\r
                              std::unique_ptr<XmlElement> audioState (safeThis->deviceManager.createStateXml());\r
 \r
index 53fdfb18f029059b0093d49baec62ebb3ac22b2c..bbbbf3cbd261ec06105c8cd19e7ec8dc8d106147 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="3t6YqETY1" name="BinaryBuilder" projectType="consoleapp"\r
-              juceFolder="../../../juce" jucerVersion="5.4.1" bundleIdentifier="com.roli.binarybuilder"\r
+              juceFolder="../../../juce" jucerVersion="5.3.1" bundleIdentifier="com.roli.binarybuilder"\r
               displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd."\r
               companyCopyright="ROLI Ltd.">\r
   <EXPORTFORMATS>\r
index da7f25873b2dc31f55877dfd09a671de45ff4016..4650f638c5e7db3fb4985e43351368bec20fea75 100644 (file)
@@ -36,7 +36,7 @@ ifeq ($(CONFIG),Debug)
   endif\r
 \r
   JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_CONSOLEAPP := BinaryBuilder\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
@@ -57,7 +57,7 @@ ifeq ($(CONFIG),Release)
   endif\r
 \r
   JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_CONSOLEAPP := BinaryBuilder\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS)\r
@@ -71,13 +71,11 @@ OBJECTS_CONSOLEAPP := \
   $(JUCE_OBJDIR)/Main_90ebc5c2.o \\r
   $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : check-pkg-config $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
        @echo Linking "BinaryBuilder - ConsoleApp"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -94,6 +92,10 @@ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o: ../../JuceLibraryCode/include_juce_
        @echo "Compiling include_juce_core.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors libcurl\r
+\r
 clean:\r
        @echo Cleaning BinaryBuilder\r
        $(V_AT)$(CLEANCMD)\r
index a49dd35442b89c5b1b0d089774960f3f739ab063..a88b226942dad245ac1f7dab2f55b716f00bd600 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               281394C38788919D523BE021 = {
-                       isa = PBXBuildFile;
-                       fileRef = 799073185F72F5FAD05253C3;
-               };
-               4B72EFB0E9D74CA7227F6CAB = {
-                       isa = PBXBuildFile;
-                       fileRef = 57DDB771ED96A256F190ADF8;
-               };
-               0D53D8B0AEE37C02C147344B = {
-                       isa = PBXBuildFile;
-                       fileRef = F769CD634476C91F4C9D0596;
-               };
-               542006E949BB022F198DF0F2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1A71A586C0F50B6B328D877B;
-               };
-               3C6FF7689E2FD827A48E2303 = {
-                       isa = PBXBuildFile;
-                       fileRef = 50B7C64414A3E778021F5EC4;
-               };
-               9E4D85A3D54739A0FA80A446 = {
-                       isa = PBXBuildFile;
-                       fileRef = D186E2D509765FAE0758F17D;
-               };
-               1A71A586C0F50B6B328D877B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               50B7C64414A3E778021F5EC4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               57DDB771ED96A256F190ADF8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               799073185F72F5FAD05253C3 = {
-                       isa = PBXFileReference;
-                       explicitFileType = "compiled.mach-o.executable";
-                       includeInIndex = 0;
-                       path = BinaryBuilder;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               7E86227B01E504302C234A04 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8702176D2368B6F785546D2B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D186E2D509765FAE0758F17D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D6C3594C8BEC94040AF108FE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F769CD634476C91F4C9D0596 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               AF0451FEC95312712E8145CD = {
-                       isa = PBXGroup;
-                       children = (
-                               50B7C64414A3E778021F5EC4,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               9DC13797237D190C48A242C9 = {
-                       isa = PBXGroup;
-                       children = (
-                               AF0451FEC95312712E8145CD,
-                       );
-                       name = BinaryBuilder;
-                       sourceTree = "<group>";
-               };
-               5D4B80BC67BBCEDCC3B6BAB8 = {
-                       isa = PBXGroup;
-                       children = (
-                               8702176D2368B6F785546D2B,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               8905BD956C24F83087634C3A = {
-                       isa = PBXGroup;
-                       children = (
-                               7E86227B01E504302C234A04,
-                               D186E2D509765FAE0758F17D,
-                               D6C3594C8BEC94040AF108FE,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               87ECE820BF4D73DD50D614CB = {
-                       isa = PBXGroup;
-                       children = (
-                               1A71A586C0F50B6B328D877B,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               E28F51A0038F01E08E22F853 = {
-                       isa = PBXGroup;
-                       children = (
-                               57DDB771ED96A256F190ADF8,
-                               F769CD634476C91F4C9D0596,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               70A875922C34E55D4F48A196 = {
-                       isa = PBXGroup;
-                       children = (
-                               799073185F72F5FAD05253C3,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               C18D022743CF5BD14D6A6A9E = {
-                       isa = PBXGroup;
-                       children = (
-                               9DC13797237D190C48A242C9,
-                               5D4B80BC67BBCEDCC3B6BAB8,
-                               8905BD956C24F83087634C3A,
-                               87ECE820BF4D73DD50D614CB,
-                               E28F51A0038F01E08E22F853,
-                               70A875922C34E55D4F48A196,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               00F18709927DE6070FBA7BD0 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               281394C38788919D523BE021 = {isa = PBXBuildFile; fileRef = 799073185F72F5FAD05253C3; };
+               4B72EFB0E9D74CA7227F6CAB = {isa = PBXBuildFile; fileRef = 57DDB771ED96A256F190ADF8; };
+               0D53D8B0AEE37C02C147344B = {isa = PBXBuildFile; fileRef = F769CD634476C91F4C9D0596; };
+               542006E949BB022F198DF0F2 = {isa = PBXBuildFile; fileRef = 1A71A586C0F50B6B328D877B; };
+               3C6FF7689E2FD827A48E2303 = {isa = PBXBuildFile; fileRef = 50B7C64414A3E778021F5EC4; };
+               9E4D85A3D54739A0FA80A446 = {isa = PBXBuildFile; fileRef = D186E2D509765FAE0758F17D; };
+               1A71A586C0F50B6B328D877B = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               50B7C64414A3E778021F5EC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               57DDB771ED96A256F190ADF8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               799073185F72F5FAD05253C3 = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BinaryBuilder; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               7E86227B01E504302C234A04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               8702176D2368B6F785546D2B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               D186E2D509765FAE0758F17D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               D6C3594C8BEC94040AF108FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               F769CD634476C91F4C9D0596 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               AF0451FEC95312712E8145CD = {isa = PBXGroup; children = (
+                                       50B7C64414A3E778021F5EC4, ); name = Source; sourceTree = "<group>"; };
+               9DC13797237D190C48A242C9 = {isa = PBXGroup; children = (
+                                       AF0451FEC95312712E8145CD, ); name = BinaryBuilder; sourceTree = "<group>"; };
+               5D4B80BC67BBCEDCC3B6BAB8 = {isa = PBXGroup; children = (
+                                       8702176D2368B6F785546D2B, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               8905BD956C24F83087634C3A = {isa = PBXGroup; children = (
+                                       7E86227B01E504302C234A04,
+                                       D186E2D509765FAE0758F17D,
+                                       D6C3594C8BEC94040AF108FE, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               87ECE820BF4D73DD50D614CB = {isa = PBXGroup; children = (
+                                       1A71A586C0F50B6B328D877B, ); name = Resources; sourceTree = "<group>"; };
+               E28F51A0038F01E08E22F853 = {isa = PBXGroup; children = (
+                                       57DDB771ED96A256F190ADF8,
+                                       F769CD634476C91F4C9D0596, ); name = Frameworks; sourceTree = "<group>"; };
+               70A875922C34E55D4F48A196 = {isa = PBXGroup; children = (
+                                       799073185F72F5FAD05253C3, ); name = Products; sourceTree = "<group>"; };
+               C18D022743CF5BD14D6A6A9E = {isa = PBXGroup; children = (
+                                       9DC13797237D190C48A242C9,
+                                       5D4B80BC67BBCEDCC3B6BAB8,
+                                       8905BD956C24F83087634C3A,
+                                       87ECE820BF4D73DD50D614CB,
+                                       E28F51A0038F01E08E22F853,
+                                       70A875922C34E55D4F48A196, ); name = Source; sourceTree = "<group>"; };
+               00F18709927DE6070FBA7BD0 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INSTALL_PATH = "/usr/bin";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.binarybuilder;
-                               PRODUCT_NAME = "BinaryBuilder";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               8A190EF24B99F557190320DA = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               8A190EF24B99F557190320DA = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INSTALL_PATH = "/usr/bin";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.binarybuilder;
-                               PRODUCT_NAME = "BinaryBuilder";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               D9552CAECBA3D7D5725848E5 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               D9552CAECBA3D7D5725848E5 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "BinaryBuilder";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               7545BE591FD462C37E44B903 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               7545BE591FD462C37E44B903 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "BinaryBuilder";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               78C9910DF129FD687A56D083 = {
-                       isa = PBXTargetDependency;
-                       target = 80B70DE094998C267F152DD5;
-               };
-               E4C85B0464A93027D035AA1F = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               D9552CAECBA3D7D5725848E5,
-                               7545BE591FD462C37E44B903,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               A88E30959D785F48A594450E = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               00F18709927DE6070FBA7BD0,
-                               8A190EF24B99F557190320DA,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               4F5C64675AD3AC67829798FF = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               542006E949BB022F198DF0F2,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               A69CF4AD8F7015A8D3228FDE = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               3C6FF7689E2FD827A48E2303,
-                               9E4D85A3D54739A0FA80A446,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               2722C90F3B5DAD661891FDF4 = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               4B72EFB0E9D74CA7227F6CAB,
-                               0D53D8B0AEE37C02C147344B,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               80B70DE094998C267F152DD5 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = A88E30959D785F48A594450E;
-                       buildPhases = (
-                               4F5C64675AD3AC67829798FF,
-                               A69CF4AD8F7015A8D3228FDE,
-                               2722C90F3B5DAD661891FDF4,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "BinaryBuilder - ConsoleApp";
-                       productName = BinaryBuilder;
-                       productReference = 799073185F72F5FAD05253C3;
-                       productType = "com.apple.product-type.tool";
-               };
-               36B6F402BC83F21646259DEF = {
-                       isa = PBXProject;
-                       buildConfigurationList = E4C85B0464A93027D035AA1F;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = C18D022743CF5BD14D6A6A9E;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (80B70DE094998C267F152DD5);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               78C9910DF129FD687A56D083 = {isa = PBXTargetDependency; target = 80B70DE094998C267F152DD5; };
+               E4C85B0464A93027D035AA1F = {isa = XCConfigurationList; buildConfigurations = (
+                                       D9552CAECBA3D7D5725848E5,
+                                       7545BE591FD462C37E44B903, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               A88E30959D785F48A594450E = {isa = XCConfigurationList; buildConfigurations = (
+                                       00F18709927DE6070FBA7BD0,
+                                       8A190EF24B99F557190320DA, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               4F5C64675AD3AC67829798FF = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       542006E949BB022F198DF0F2, ); runOnlyForDeploymentPostprocessing = 0; };
+               A69CF4AD8F7015A8D3228FDE = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       3C6FF7689E2FD827A48E2303,
+                                       9E4D85A3D54739A0FA80A446, ); runOnlyForDeploymentPostprocessing = 0; };
+               2722C90F3B5DAD661891FDF4 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       4B72EFB0E9D74CA7227F6CAB,
+                                       0D53D8B0AEE37C02C147344B, ); runOnlyForDeploymentPostprocessing = 0; };
+               80B70DE094998C267F152DD5 = {isa = PBXNativeTarget; buildConfigurationList = A88E30959D785F48A594450E; buildPhases = (
+                                       4F5C64675AD3AC67829798FF,
+                                       A69CF4AD8F7015A8D3228FDE,
+                                       2722C90F3B5DAD661891FDF4, ); buildRules = ( ); dependencies = (  ); name = "BinaryBuilder - ConsoleApp"; productName = BinaryBuilder; productReference = 799073185F72F5FAD05253C3; productType = "com.apple.product-type.tool"; };
+               36B6F402BC83F21646259DEF = {isa = PBXProject; buildConfigurationList = E4C85B0464A93027D035AA1F; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = C18D022743CF5BD14D6A6A9E; projectDirPath = ""; projectRoot = ""; targets = (80B70DE094998C267F152DD5); };
        };
        rootObject = 36B6F402BC83F21646259DEF;
 }
index baa54a83a89903a615df395fc32b3ea6afa30f95..151ce86a9317f76b7b17dfc1a4795fa18e7f0d89 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{88983F7C-DB65-9E04-84E7-05F8979E0383}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\ConsoleApp\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">BinaryBuilder</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
index 0173574e05875606399de112974ccd2e38336e28..1150273d70c89adbbaf0133492d17f80b9807496 100644 (file)
@@ -79,9 +79,6 @@
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
index f24089181eed3412fc2cd117b4d6c6f321dd0621..0610122259f1cf5ecbd7871f66a680d2e21f6d6c 100644 (file)
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
 #ifndef    JUCE_ALLOW_STATIC_NULL_VARIABLES\r
  //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
-\r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index ce4d6d90ccf293bc08bfaefd6d7a9b2c2e496489..100a8e1b20c9b719fd3d910c8a939c7f8f9f2aaf 100644 (file)
@@ -27,7 +27,6 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "BinaryBuilder";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
     const char* const  versionString  = "1.0.0";\r
     const int          versionNumber  = 0x10000;\r
 }\r
index 5a8da270fe26bce2150d57f5a91d29cfddbee60f..0b94bf62c489ab8e7daea46fe665c2249ca3cb29 100644 (file)
@@ -41,8 +41,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
-    "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
     "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
@@ -306,91 +304,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
     "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
-    "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
@@ -402,6 +315,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+    "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
     "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
@@ -415,8 +329,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
-    "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
     "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
     "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
@@ -435,7 +347,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
     "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
-    "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
     "../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
@@ -477,8 +388,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
     "../../../../../modules/juce_core/containers/juce_Array.h"\r
     "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
-    "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
     "../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
     "../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
@@ -488,11 +397,9 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
-    "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
     "../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
-    "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
     "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
     "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
     "../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
@@ -539,7 +446,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
     "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
     "../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
-    "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
     "../../../../../modules/juce_core/memory/juce_Memory.h"\r
     "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
@@ -550,8 +456,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
     "../../../../../modules/juce_core/memory/juce_Singleton.h"\r
     "../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
-    "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
     "../../../../../modules/juce_core/misc/juce_Result.cpp"\r
     "../../../../../modules/juce_core/misc/juce_Result.h"\r
     "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
@@ -582,7 +486,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
     "../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
     "../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
-    "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
     "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
     "../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
     "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
@@ -763,8 +666,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
     "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
-    "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
     "../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
     "../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
@@ -994,12 +895,10 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+    "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
     "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
-    "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
     "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
@@ -1260,7 +1159,6 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
-    "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
     "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
     "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
@@ -1386,8 +1284,6 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/ju
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1651,91 +1547,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1747,6 +1558,7 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/format
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1760,8 +1572,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/proces
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1780,7 +1590,6 @@ set_source_files_properties("../../../../../modules/juce_audio_processors/utilit
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1822,8 +1631,6 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Ab
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1833,11 +1640,9 @@ set_source_files_properties("../../../../../modules/juce_core/containers/juce_Li
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1884,7 +1689,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1895,8 +1699,6 @@ set_source_files_properties("../../../../../modules/juce_core/memory/juce_Scoped
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -1927,7 +1729,6 @@ set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_St
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2108,8 +1909,6 @@ set_source_files_properties("../../../../../modules/juce_events/interprocess/juc
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2339,12 +2138,10 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/components/j
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
@@ -2605,7 +2402,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juc
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
 set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
index 98a8bc1afcb3dea3fd7a2e2e80588921ca3b30aa..d438cc288d2c1f8a5e8af37a170914b643169b5a 100644 (file)
@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
 \r
 android {\r
     compileSdkVersion 10\r
-    buildToolsVersion "28.0.0"\r
+    buildToolsVersion "27.0.3"\r
     externalNativeBuild {\r
         cmake {\r
             path "CMakeLists.txt"\r
@@ -50,7 +50,7 @@ android {
     productFlavors {\r
         debug_ {\r
             ndk {\r
-                abiFilters "armeabi-v7a", "x86"\r
+                abiFilters "armeabi", "armeabi-v7a", "x86"\r
             }\r
             externalNativeBuild {\r
                 cmake {\r
index 4c8c56ab3da2f36e9bee2d50648d74e8f1c52d2f..1fbb144a9f6ab8d3e45664ea58e4e949160b0879 100644 (file)
@@ -3,6 +3,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
           package="com.juce.networkgraphicsdemo">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+  <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
index 40223e011f8d06c35f4319751c1bc9695127ebba..fb24cf73542faf4a177a656e5450462c8187a89e 100644 (file)
@@ -87,11 +87,8 @@ public class JUCENetworkGraphicsDemo   extends Activity
     //==============================================================================\r
     public boolean isPermissionDeclaredInManifest (int permissionID)\r
     {\r
-        return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
-    }\r
+        String permissionToCheck = getAndroidPermissionName(permissionID);\r
 \r
-    public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
-    {\r
         try\r
         {\r
             PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
@@ -558,9 +555,7 @@ public class JUCENetworkGraphicsDemo   extends Activity
     public final String getClipboardContent()\r
     {\r
         ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
-        CharSequence content = clipboard.getText();\r
-        return content != null ? content.toString() : new String();\r
+        return clipboard.getText().toString();\r
     }\r
 \r
     public final void setClipboardContent (String newText)\r
@@ -1069,13 +1064,11 @@ public class JUCENetworkGraphicsDemo   extends Activity
                                           implements SurfaceHolder.Callback\r
     {\r
         private long nativeContext = 0;\r
-        private boolean forVideo;\r
 \r
-        NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+        NativeSurfaceView (Context context, long nativeContextPtr)\r
         {\r
             super (context);\r
             nativeContext = nativeContextPtr;\r
-            forVideo = createdForVideo;\r
         }\r
 \r
         public Surface getNativeSurface()\r
@@ -1093,51 +1086,38 @@ public class JUCENetworkGraphicsDemo   extends Activity
         @Override\r
         public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
         {\r
-            if (forVideo)\r
-                surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
-            else\r
-                surfaceChangedNative (nativeContext, holder, format, width, height);\r
+            surfaceChangedNative (nativeContext, holder, format, width, height);\r
         }\r
 \r
         @Override\r
         public void surfaceCreated (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceCreatedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceCreatedNative (nativeContext, holder);\r
+            surfaceCreatedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         public void surfaceDestroyed (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceDestroyedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceDestroyedNative (nativeContext, holder);\r
+            surfaceDestroyedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         protected void dispatchDraw (Canvas canvas)\r
         {\r
             super.dispatchDraw (canvas);\r
-\r
-            if (forVideo)\r
-                dispatchDrawNativeVideo (nativeContext, canvas);\r
-            else\r
-                dispatchDrawNative (nativeContext, canvas);\r
+            dispatchDrawNative (nativeContext, canvas);\r
         }\r
 \r
         //==============================================================================\r
         @Override\r
-        protected void onAttachedToWindow()\r
+        protected void onAttachedToWindow ()\r
         {\r
             super.onAttachedToWindow();\r
             getHolder().addCallback (this);\r
         }\r
 \r
         @Override\r
-        protected void onDetachedFromWindow()\r
+        protected void onDetachedFromWindow ()\r
         {\r
             super.onDetachedFromWindow();\r
             getHolder().removeCallback (this);\r
@@ -1149,17 +1129,11 @@ public class JUCENetworkGraphicsDemo   extends Activity
         private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
         private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
                                                   int format, int width, int height);\r
-\r
-        private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
-        private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
-                                                       int format, int width, int height);\r
     }\r
 \r
-    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
     {\r
-        return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+        return new NativeSurfaceView (this, nativeSurfacePtr);\r
     }\r
 \r
     //==============================================================================\r
index 647f509e9ca3df4e45bee9a59ceebfc5067d81fe..651d63db63bdd2bf53a574bdde786ac927b14169 100644 (file)
@@ -4,7 +4,7 @@ buildscript {
        jcenter()\r
    }\r
    dependencies {\r
-       classpath 'com.android.tools.build:gradle:3.1.3'\r
+       classpath 'com.android.tools.build:gradle:3.1.1'\r
    }\r
 }\r
 \r
index 849e181c8e6128321b7da2114bd6ffe8743603c4..4a7e4bcca7f2d8702e120c0d13f81a22611d6b65 100644 (file)
@@ -35,13 +35,13 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -56,13 +56,13 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -85,13 +85,11 @@ OBJECTS_APP := \
   $(JUCE_OBJDIR)/include_juce_opengl_a8a032b.o \\r
   $(JUCE_OBJDIR)/include_juce_osc_f3df604d.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
        @echo Linking "NetworkGraphicsDemo - App"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -178,6 +176,10 @@ $(JUCE_OBJDIR)/include_juce_osc_f3df604d.o: ../../JuceLibraryCode/include_juce_o
        @echo "Compiling include_juce_osc.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
 clean:\r
        @echo Cleaning NetworkGraphicsDemo\r
        $(V_AT)$(CLEANCMD)\r
index 4691d844488017c6dc16382639d77c7766098fa1..c783ae58a44485d8123745f17863e3f5b901694b 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               F468E8C7B02DFD4D53911277 = {
-                       isa = PBXBuildFile;
-                       fileRef = E4162459ED4C829EF7B19691;
-               };
-               80EE2C27B466BAFD83881D3F = {
-                       isa = PBXBuildFile;
-                       fileRef = 2E13A899F4E3C99054A3656F;
-               };
-               C4D6C466C41173D6970553D2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9E8129263CD42C6029FC2CAD;
-               };
-               BED88ADEA4DC91AA8C810FA8 = {
-                       isa = PBXBuildFile;
-                       fileRef = 398A945EFD9ED923162982B1;
-               };
-               3C30D7C28C86F4054257DCD5 = {
-                       isa = PBXBuildFile;
-                       fileRef = C78806A6727F44EACFDED4A5;
-               };
-               67DF295E93E54432043126DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 6799B056504F9F017998B9E2;
-               };
-               CA694B2A73FCF12D7F9E7E49 = {
-                       isa = PBXBuildFile;
-                       fileRef = 448838BE6E937D450A3C84CE;
-               };
-               80B9F7ED2009922C693B7DD4 = {
-                       isa = PBXBuildFile;
-                       fileRef = CB82A14817C3E2ABBBBC3864;
-               };
-               77745BF98931B91341FE17F6 = {
-                       isa = PBXBuildFile;
-                       fileRef = F3292E3563DB7ABB076DB400;
-               };
-               B323E5E5FBD5663B21A8E623 = {
-                       isa = PBXBuildFile;
-                       fileRef = 996E743A20FC78671766BF59;
-               };
-               EC14DA30C090DDC62084DB4C = {
-                       isa = PBXBuildFile;
-                       fileRef = 935CA85EF98714D3A17AE737;
-               };
-               8ECB0767EE340DD83869E37D = {
-                       isa = PBXBuildFile;
-                       fileRef = EC794872987FEA2E129C589A;
-               };
-               65B2C4ED19229E0EDC8EF993 = {
-                       isa = PBXBuildFile;
-                       fileRef = 696F7896036B652369517438;
-               };
-               006DF460F8DF66EFFA80D968 = {
-                       isa = PBXBuildFile;
-                       fileRef = 70F1CAF3C4C561DD81E6AFC1;
-               };
-               987CBD5330E76B404F0D966C = {
-                       isa = PBXBuildFile;
-                       fileRef = 77C0AC21C1028911123844FC;
-               };
-               9F618C008A503063D10076C4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 74711D7544168CCAC4969A07;
-               };
-               BB9A9692D99DD0DDB1047B60 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6D1F9E505D20C09647124F0A;
-               };
-               6C2200C52B65E1BE80544E50 = {
-                       isa = PBXBuildFile;
-                       fileRef = AF330F41D1A4865108690E3C;
-               };
-               A1F34D09F4E4338775917ED1 = {
-                       isa = PBXBuildFile;
-                       fileRef = C6E2284D86D93F1D9D5C7666;
-               };
-               2E28F61A64DEF942FE7B94C4 = {
-                       isa = PBXBuildFile;
-                       fileRef = AED58461CE961C62A0E0A552;
-               };
-               EA487FA4116517A8DFEE85B0 = {
-                       isa = PBXBuildFile;
-                       fileRef = FCEBB157FB526741DB6791D1;
-               };
-               0977FEC02DAF29438583198A = {
-                       isa = PBXBuildFile;
-                       fileRef = 01E0EEF68A11C1CAF180E173;
-               };
-               0FA2A3321630EBE83E439D99 = {
-                       isa = PBXBuildFile;
-                       fileRef = AFF729977947528F3E4AAA96;
-               };
-               9EFD2AA2FFF3C125FDAA4279 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7525879E73E8AF32FFA0CDDE;
-               };
-               C5E7BAD864E02CF37F7BD707 = {
-                       isa = PBXBuildFile;
-                       fileRef = 33AA348465F512DBA8778DAF;
-               };
-               CBC8F7E5225C73CEDFB3B72E = {
-                       isa = PBXBuildFile;
-                       fileRef = A7FF2B353C8568B5A7A80117;
-               };
-               CADEA83EAAC94E0011C07908 = {
-                       isa = PBXBuildFile;
-                       fileRef = 84B287BB2AD252B7D69AC47E;
-               };
-               3717B9F9A0F7C9CB95F1BE7F = {
-                       isa = PBXBuildFile;
-                       fileRef = 7BE6330821794919A88ED8ED;
-               };
-               61B523C52EBA17F738FFE31A = {
-                       isa = PBXBuildFile;
-                       fileRef = 660F1970CF687A7AE8371C6D;
-               };
-               C6348C6B1D0312580E97EA19 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3BF06B70407FFDBE9534F942;
-               };
-               01E0EEF68A11C1CAF180E173 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0555BAE6156EAF15CA77A2D8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0ADF0DECFCB1DB4D3A847EB5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = "juce_icon.png";
-                       path = "../../Source/juce_icon.png";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               18BFEBD944DDE4809C89F27A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1FD6DBAC73414DD4C152E34E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               25DEDA8C9F94A6C8DFC8E53E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = SharedCanvas.h;
-                       path = ../../Source/SharedCanvas.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2E13A899F4E3C99054A3656F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               33AA348465F512DBA8778DAF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               398A945EFD9ED923162982B1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Carbon.framework;
-                       path = System/Library/Frameworks/Carbon.framework;
-                       sourceTree = SDKROOT;
-               };
-               3BF06B70407FFDBE9534F942 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_osc.cpp";
-                       path = "../../JuceLibraryCode/include_juce_osc.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               448838BE6E937D450A3C84CE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               4FF648D72D6F1A78956CDA1B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = Demos.h;
-                       path = ../../Source/Demos.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               55CB060922ABCBC105FE38D2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_osc";
-                       path = "../../../../modules/juce_osc";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               660F1970CF687A7AE8371C6D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6799B056504F9F017998B9E2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               68EBC0BF5F01E05FDCB3EEAF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               696F7896036B652369517438 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6D1F9E505D20C09647124F0A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               70F1CAF3C4C561DD81E6AFC1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               74711D7544168CCAC4969A07 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = BinaryData.cpp;
-                       path = ../../JuceLibraryCode/BinaryData.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7525879E73E8AF32FFA0CDDE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               77C0AC21C1028911123844FC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7BE6330821794919A88ED8ED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               84B287BB2AD252B7D69AC47E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               89583CD42AD218E9753DF11C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8E2F72AFA0CDA64F0C07F105 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = SlaveComponent.h;
-                       path = ../../Source/SlaveComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8EACAADD3A23DED3E252C92F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               92800676AF753D1A60108F11 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = BinaryData.h;
-                       path = ../../JuceLibraryCode/BinaryData.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               935CA85EF98714D3A17AE737 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               996E743A20FC78671766BF59 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGL.framework;
-                       path = System/Library/Frameworks/OpenGL.framework;
-                       sourceTree = SDKROOT;
-               };
-               9982F39121710EFFD5FEEAEF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MasterComponent.h;
-                       path = ../../Source/MasterComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9C67BD1915C7FD5747C2BA8F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9C689AFBF364CB167C422D29 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E8129263CD42C6029FC2CAD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               A505E1DABB2ED630EFBA96DB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A7FF2B353C8568B5A7A80117 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AED58461CE961C62A0E0A552 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AF330F41D1A4865108690E3C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AFF729977947528F3E4AAA96 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B5433B00F012AD87AADBFCD6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B76F10A7778664E164A01934 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BA2E40409255F1B078406221 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C6E2284D86D93F1D9D5C7666 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C78806A6727F44EACFDED4A5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               CB82A14817C3E2ABBBBC3864 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = DiscRecording.framework;
-                       path = System/Library/Frameworks/DiscRecording.framework;
-                       sourceTree = SDKROOT;
-               };
-               D12A0DFFE18728E84D9AB739 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E4162459ED4C829EF7B19691 = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = "JUCE Network Graphics Demo.app";
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               E4EA870A22A0C6649E55DD30 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EC794872987FEA2E129C589A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = WebKit.framework;
-                       path = System/Library/Frameworks/WebKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               F3292E3563DB7ABB076DB400 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               F98A4DAA0502EE9252EBE06F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FA0A789443FD480003E40435 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FCEBB157FB526741DB6791D1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5A58AF0A052C539F0E342A88 = {
-                       isa = PBXGroup;
-                       children = (
-                               4FF648D72D6F1A78956CDA1B,
-                               77C0AC21C1028911123844FC,
-                               9982F39121710EFFD5FEEAEF,
-                               8E2F72AFA0CDA64F0C07F105,
-                               25DEDA8C9F94A6C8DFC8E53E,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               856518502A948813C90E6761 = {
-                       isa = PBXGroup;
-                       children = (
-                               5A58AF0A052C539F0E342A88,
-                               0ADF0DECFCB1DB4D3A847EB5,
-                       );
-                       name = NetworkGraphicsDemo;
-                       sourceTree = "<group>";
-               };
-               EF0AACA84F1CEE7F45F56339 = {
-                       isa = PBXGroup;
-                       children = (
-                               B76F10A7778664E164A01934,
-                               89583CD42AD218E9753DF11C,
-                               9C67BD1915C7FD5747C2BA8F,
-                               A505E1DABB2ED630EFBA96DB,
-                               E4EA870A22A0C6649E55DD30,
-                               8EACAADD3A23DED3E252C92F,
-                               B5433B00F012AD87AADBFCD6,
-                               BA2E40409255F1B078406221,
-                               F98A4DAA0502EE9252EBE06F,
-                               18BFEBD944DDE4809C89F27A,
-                               FA0A789443FD480003E40435,
-                               9C689AFBF364CB167C422D29,
-                               68EBC0BF5F01E05FDCB3EEAF,
-                               55CB060922ABCBC105FE38D2,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               C20D4DECE1291BF6AF8711DC = {
-                       isa = PBXGroup;
-                       children = (
-                               0555BAE6156EAF15CA77A2D8,
-                               74711D7544168CCAC4969A07,
-                               92800676AF753D1A60108F11,
-                               6D1F9E505D20C09647124F0A,
-                               AF330F41D1A4865108690E3C,
-                               C6E2284D86D93F1D9D5C7666,
-                               AED58461CE961C62A0E0A552,
-                               FCEBB157FB526741DB6791D1,
-                               01E0EEF68A11C1CAF180E173,
-                               AFF729977947528F3E4AAA96,
-                               7525879E73E8AF32FFA0CDDE,
-                               33AA348465F512DBA8778DAF,
-                               A7FF2B353C8568B5A7A80117,
-                               84B287BB2AD252B7D69AC47E,
-                               7BE6330821794919A88ED8ED,
-                               660F1970CF687A7AE8371C6D,
-                               3BF06B70407FFDBE9534F942,
-                               D12A0DFFE18728E84D9AB739,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               4AA57E2B5FD5374D348EEF7F = {
-                       isa = PBXGroup;
-                       children = (
-                               1FD6DBAC73414DD4C152E34E,
-                               696F7896036B652369517438,
-                               70F1CAF3C4C561DD81E6AFC1,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               71F5560BE0EE3A17A9CE44F6 = {
-                       isa = PBXGroup;
-                       children = (
-                               2E13A899F4E3C99054A3656F,
-                               9E8129263CD42C6029FC2CAD,
-                               398A945EFD9ED923162982B1,
-                               C78806A6727F44EACFDED4A5,
-                               6799B056504F9F017998B9E2,
-                               448838BE6E937D450A3C84CE,
-                               CB82A14817C3E2ABBBBC3864,
-                               F3292E3563DB7ABB076DB400,
-                               996E743A20FC78671766BF59,
-                               935CA85EF98714D3A17AE737,
-                               EC794872987FEA2E129C589A,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               8B59A884C62D960EE9DFEF47 = {
-                       isa = PBXGroup;
-                       children = (
-                               E4162459ED4C829EF7B19691,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               D2EB65517396C974F0415A7F = {
-                       isa = PBXGroup;
-                       children = (
-                               856518502A948813C90E6761,
-                               EF0AACA84F1CEE7F45F56339,
-                               C20D4DECE1291BF6AF8711DC,
-                               4AA57E2B5FD5374D348EEF7F,
-                               71F5560BE0EE3A17A9CE44F6,
-                               8B59A884C62D960EE9DFEF47,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               EE7498599191DDC73ECB55B0 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               F468E8C7B02DFD4D53911277 = {isa = PBXBuildFile; fileRef = E4162459ED4C829EF7B19691; };
+               80EE2C27B466BAFD83881D3F = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; };
+               C4D6C466C41173D6970553D2 = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; };
+               BED88ADEA4DC91AA8C810FA8 = {isa = PBXBuildFile; fileRef = 398A945EFD9ED923162982B1; };
+               3C30D7C28C86F4054257DCD5 = {isa = PBXBuildFile; fileRef = C78806A6727F44EACFDED4A5; };
+               67DF295E93E54432043126DF = {isa = PBXBuildFile; fileRef = 6799B056504F9F017998B9E2; };
+               CA694B2A73FCF12D7F9E7E49 = {isa = PBXBuildFile; fileRef = 448838BE6E937D450A3C84CE; };
+               80B9F7ED2009922C693B7DD4 = {isa = PBXBuildFile; fileRef = CB82A14817C3E2ABBBBC3864; };
+               77745BF98931B91341FE17F6 = {isa = PBXBuildFile; fileRef = F3292E3563DB7ABB076DB400; };
+               B323E5E5FBD5663B21A8E623 = {isa = PBXBuildFile; fileRef = 996E743A20FC78671766BF59; };
+               EC14DA30C090DDC62084DB4C = {isa = PBXBuildFile; fileRef = 935CA85EF98714D3A17AE737; };
+               8ECB0767EE340DD83869E37D = {isa = PBXBuildFile; fileRef = EC794872987FEA2E129C589A; };
+               65B2C4ED19229E0EDC8EF993 = {isa = PBXBuildFile; fileRef = 696F7896036B652369517438; };
+               006DF460F8DF66EFFA80D968 = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; };
+               987CBD5330E76B404F0D966C = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; };
+               9F618C008A503063D10076C4 = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; };
+               BB9A9692D99DD0DDB1047B60 = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; };
+               6C2200C52B65E1BE80544E50 = {isa = PBXBuildFile; fileRef = AF330F41D1A4865108690E3C; };
+               A1F34D09F4E4338775917ED1 = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; };
+               2E28F61A64DEF942FE7B94C4 = {isa = PBXBuildFile; fileRef = AED58461CE961C62A0E0A552; };
+               EA487FA4116517A8DFEE85B0 = {isa = PBXBuildFile; fileRef = FCEBB157FB526741DB6791D1; };
+               0977FEC02DAF29438583198A = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; };
+               0FA2A3321630EBE83E439D99 = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; };
+               9EFD2AA2FFF3C125FDAA4279 = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; };
+               C5E7BAD864E02CF37F7BD707 = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; };
+               CBC8F7E5225C73CEDFB3B72E = {isa = PBXBuildFile; fileRef = A7FF2B353C8568B5A7A80117; };
+               CADEA83EAAC94E0011C07908 = {isa = PBXBuildFile; fileRef = 84B287BB2AD252B7D69AC47E; };
+               3717B9F9A0F7C9CB95F1BE7F = {isa = PBXBuildFile; fileRef = 7BE6330821794919A88ED8ED; };
+               61B523C52EBA17F738FFE31A = {isa = PBXBuildFile; fileRef = 660F1970CF687A7AE8371C6D; };
+               C6348C6B1D0312580E97EA19 = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; };
+               01E0EEF68A11C1CAF180E173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               0555BAE6156EAF15CA77A2D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               0ADF0DECFCB1DB4D3A847EB5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "juce_icon.png"; path = "../../Source/juce_icon.png"; sourceTree = "SOURCE_ROOT"; };
+               18BFEBD944DDE4809C89F27A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               1FD6DBAC73414DD4C152E34E = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               25DEDA8C9F94A6C8DFC8E53E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = "SOURCE_ROOT"; };
+               2E13A899F4E3C99054A3656F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               33AA348465F512DBA8778DAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               398A945EFD9ED923162982B1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+               3BF06B70407FFDBE9534F942 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+               448838BE6E937D450A3C84CE = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               4FF648D72D6F1A78956CDA1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = "SOURCE_ROOT"; };
+               55CB060922ABCBC105FE38D2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+               660F1970CF687A7AE8371C6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               6799B056504F9F017998B9E2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               68EBC0BF5F01E05FDCB3EEAF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               696F7896036B652369517438 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               6D1F9E505D20C09647124F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               70F1CAF3C4C561DD81E6AFC1 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               74711D7544168CCAC4969A07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+               7525879E73E8AF32FFA0CDDE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               77C0AC21C1028911123844FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               7BE6330821794919A88ED8ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               84B287BB2AD252B7D69AC47E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               89583CD42AD218E9753DF11C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               8E2F72AFA0CDA64F0C07F105 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SlaveComponent.h; path = ../../Source/SlaveComponent.h; sourceTree = "SOURCE_ROOT"; };
+               8EACAADD3A23DED3E252C92F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               92800676AF753D1A60108F11 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+               935CA85EF98714D3A17AE737 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               996E743A20FC78671766BF59 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+               9982F39121710EFFD5FEEAEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MasterComponent.h; path = ../../Source/MasterComponent.h; sourceTree = "SOURCE_ROOT"; };
+               9C67BD1915C7FD5747C2BA8F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               9C689AFBF364CB167C422D29 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               9E8129263CD42C6029FC2CAD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               A505E1DABB2ED630EFBA96DB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               A7FF2B353C8568B5A7A80117 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               AED58461CE961C62A0E0A552 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               AF330F41D1A4865108690E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               AFF729977947528F3E4AAA96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               B5433B00F012AD87AADBFCD6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               B76F10A7778664E164A01934 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               BA2E40409255F1B078406221 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               C6E2284D86D93F1D9D5C7666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               C78806A6727F44EACFDED4A5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               CB82A14817C3E2ABBBBC3864 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+               D12A0DFFE18728E84D9AB739 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               E4162459ED4C829EF7B19691 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "JUCE Network Graphics Demo.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               E4EA870A22A0C6649E55DD30 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               EC794872987FEA2E129C589A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+               F3292E3563DB7ABB076DB400 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               F98A4DAA0502EE9252EBE06F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               FA0A789443FD480003E40435 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               FCEBB157FB526741DB6791D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               5A58AF0A052C539F0E342A88 = {isa = PBXGroup; children = (
+                                       4FF648D72D6F1A78956CDA1B,
+                                       77C0AC21C1028911123844FC,
+                                       9982F39121710EFFD5FEEAEF,
+                                       8E2F72AFA0CDA64F0C07F105,
+                                       25DEDA8C9F94A6C8DFC8E53E, ); name = Source; sourceTree = "<group>"; };
+               856518502A948813C90E6761 = {isa = PBXGroup; children = (
+                                       5A58AF0A052C539F0E342A88,
+                                       0ADF0DECFCB1DB4D3A847EB5, ); name = NetworkGraphicsDemo; sourceTree = "<group>"; };
+               EF0AACA84F1CEE7F45F56339 = {isa = PBXGroup; children = (
+                                       B76F10A7778664E164A01934,
+                                       89583CD42AD218E9753DF11C,
+                                       9C67BD1915C7FD5747C2BA8F,
+                                       A505E1DABB2ED630EFBA96DB,
+                                       E4EA870A22A0C6649E55DD30,
+                                       8EACAADD3A23DED3E252C92F,
+                                       B5433B00F012AD87AADBFCD6,
+                                       BA2E40409255F1B078406221,
+                                       F98A4DAA0502EE9252EBE06F,
+                                       18BFEBD944DDE4809C89F27A,
+                                       FA0A789443FD480003E40435,
+                                       9C689AFBF364CB167C422D29,
+                                       68EBC0BF5F01E05FDCB3EEAF,
+                                       55CB060922ABCBC105FE38D2, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               C20D4DECE1291BF6AF8711DC = {isa = PBXGroup; children = (
+                                       0555BAE6156EAF15CA77A2D8,
+                                       74711D7544168CCAC4969A07,
+                                       92800676AF753D1A60108F11,
+                                       6D1F9E505D20C09647124F0A,
+                                       AF330F41D1A4865108690E3C,
+                                       C6E2284D86D93F1D9D5C7666,
+                                       AED58461CE961C62A0E0A552,
+                                       FCEBB157FB526741DB6791D1,
+                                       01E0EEF68A11C1CAF180E173,
+                                       AFF729977947528F3E4AAA96,
+                                       7525879E73E8AF32FFA0CDDE,
+                                       33AA348465F512DBA8778DAF,
+                                       A7FF2B353C8568B5A7A80117,
+                                       84B287BB2AD252B7D69AC47E,
+                                       7BE6330821794919A88ED8ED,
+                                       660F1970CF687A7AE8371C6D,
+                                       3BF06B70407FFDBE9534F942,
+                                       D12A0DFFE18728E84D9AB739, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               4AA57E2B5FD5374D348EEF7F = {isa = PBXGroup; children = (
+                                       1FD6DBAC73414DD4C152E34E,
+                                       696F7896036B652369517438,
+                                       70F1CAF3C4C561DD81E6AFC1, ); name = Resources; sourceTree = "<group>"; };
+               71F5560BE0EE3A17A9CE44F6 = {isa = PBXGroup; children = (
+                                       2E13A899F4E3C99054A3656F,
+                                       9E8129263CD42C6029FC2CAD,
+                                       398A945EFD9ED923162982B1,
+                                       C78806A6727F44EACFDED4A5,
+                                       6799B056504F9F017998B9E2,
+                                       448838BE6E937D450A3C84CE,
+                                       CB82A14817C3E2ABBBBC3864,
+                                       F3292E3563DB7ABB076DB400,
+                                       996E743A20FC78671766BF59,
+                                       935CA85EF98714D3A17AE737,
+                                       EC794872987FEA2E129C589A, ); name = Frameworks; sourceTree = "<group>"; };
+               8B59A884C62D960EE9DFEF47 = {isa = PBXGroup; children = (
+                                       E4162459ED4C829EF7B19691, ); name = Products; sourceTree = "<group>"; };
+               D2EB65517396C974F0415A7F = {isa = PBXGroup; children = (
+                                       856518502A948813C90E6761,
+                                       EF0AACA84F1CEE7F45F56339,
+                                       C20D4DECE1291BF6AF8711DC,
+                                       4AA57E2B5FD5374D348EEF7F,
+                                       71F5560BE0EE3A17A9CE44F6,
+                                       8B59A884C62D960EE9DFEF47, ); name = Source; sourceTree = "<group>"; };
+               EE7498599191DDC73ECB55B0 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.9;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
-                               PRODUCT_NAME = "JUCE Network Graphics Demo";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               2E06386CE7CCA5FF76819BFF = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               2E06386CE7CCA5FF76819BFF = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.9;
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
-                               PRODUCT_NAME = "JUCE Network Graphics Demo";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               3BF0365A560ACD4FD24D40CE = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               3BF0365A560ACD4FD24D40CE = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               9C6D2FD441D79104734762A5 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               9C6D2FD441D79104734762A5 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               80BE97CC38B01FABC0E73204 = {
-                       isa = PBXTargetDependency;
-                       target = 4311FBCBD02948A0ED96C7DD;
-               };
-               02715337C584F3C721251428 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               3BF0365A560ACD4FD24D40CE,
-                               9C6D2FD441D79104734762A5,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               B73863F5D180C23D3EC40C38 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               EE7498599191DDC73ECB55B0,
-                               2E06386CE7CCA5FF76819BFF,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               714944DB86A4D402E7FA269E = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               65B2C4ED19229E0EDC8EF993,
-                               006DF460F8DF66EFFA80D968,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               C2977559BF9148DB70CA10AE = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               987CBD5330E76B404F0D966C,
-                               9F618C008A503063D10076C4,
-                               BB9A9692D99DD0DDB1047B60,
-                               6C2200C52B65E1BE80544E50,
-                               A1F34D09F4E4338775917ED1,
-                               2E28F61A64DEF942FE7B94C4,
-                               EA487FA4116517A8DFEE85B0,
-                               0977FEC02DAF29438583198A,
-                               0FA2A3321630EBE83E439D99,
-                               9EFD2AA2FFF3C125FDAA4279,
-                               C5E7BAD864E02CF37F7BD707,
-                               CBC8F7E5225C73CEDFB3B72E,
-                               CADEA83EAAC94E0011C07908,
-                               3717B9F9A0F7C9CB95F1BE7F,
-                               61B523C52EBA17F738FFE31A,
-                               C6348C6B1D0312580E97EA19,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               865E89B94B41EB14C202CBB0 = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               80EE2C27B466BAFD83881D3F,
-                               C4D6C466C41173D6970553D2,
-                               BED88ADEA4DC91AA8C810FA8,
-                               3C30D7C28C86F4054257DCD5,
-                               67DF295E93E54432043126DF,
-                               CA694B2A73FCF12D7F9E7E49,
-                               80B9F7ED2009922C693B7DD4,
-                               77745BF98931B91341FE17F6,
-                               B323E5E5FBD5663B21A8E623,
-                               EC14DA30C090DDC62084DB4C,
-                               8ECB0767EE340DD83869E37D,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               4311FBCBD02948A0ED96C7DD = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = B73863F5D180C23D3EC40C38;
-                       buildPhases = (
-                               714944DB86A4D402E7FA269E,
-                               C2977559BF9148DB70CA10AE,
-                               865E89B94B41EB14C202CBB0,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "NetworkGraphicsDemo - App";
-                       productName = NetworkGraphicsDemo;
-                       productReference = E4162459ED4C829EF7B19691;
-                       productType = "com.apple.product-type.application";
-               };
-               A5398ADB6F5B128C00EB935C = {
-                       isa = PBXProject;
-                       buildConfigurationList = 02715337C584F3C721251428;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = D2EB65517396C974F0415A7F;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (4311FBCBD02948A0ED96C7DD);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               80BE97CC38B01FABC0E73204 = {isa = PBXTargetDependency; target = 4311FBCBD02948A0ED96C7DD; };
+               02715337C584F3C721251428 = {isa = XCConfigurationList; buildConfigurations = (
+                                       3BF0365A560ACD4FD24D40CE,
+                                       9C6D2FD441D79104734762A5, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               B73863F5D180C23D3EC40C38 = {isa = XCConfigurationList; buildConfigurations = (
+                                       EE7498599191DDC73ECB55B0,
+                                       2E06386CE7CCA5FF76819BFF, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               714944DB86A4D402E7FA269E = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       65B2C4ED19229E0EDC8EF993,
+                                       006DF460F8DF66EFFA80D968, ); runOnlyForDeploymentPostprocessing = 0; };
+               C2977559BF9148DB70CA10AE = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       987CBD5330E76B404F0D966C,
+                                       9F618C008A503063D10076C4,
+                                       BB9A9692D99DD0DDB1047B60,
+                                       6C2200C52B65E1BE80544E50,
+                                       A1F34D09F4E4338775917ED1,
+                                       2E28F61A64DEF942FE7B94C4,
+                                       EA487FA4116517A8DFEE85B0,
+                                       0977FEC02DAF29438583198A,
+                                       0FA2A3321630EBE83E439D99,
+                                       9EFD2AA2FFF3C125FDAA4279,
+                                       C5E7BAD864E02CF37F7BD707,
+                                       CBC8F7E5225C73CEDFB3B72E,
+                                       CADEA83EAAC94E0011C07908,
+                                       3717B9F9A0F7C9CB95F1BE7F,
+                                       61B523C52EBA17F738FFE31A,
+                                       C6348C6B1D0312580E97EA19, ); runOnlyForDeploymentPostprocessing = 0; };
+               865E89B94B41EB14C202CBB0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       80EE2C27B466BAFD83881D3F,
+                                       C4D6C466C41173D6970553D2,
+                                       BED88ADEA4DC91AA8C810FA8,
+                                       3C30D7C28C86F4054257DCD5,
+                                       67DF295E93E54432043126DF,
+                                       CA694B2A73FCF12D7F9E7E49,
+                                       80B9F7ED2009922C693B7DD4,
+                                       77745BF98931B91341FE17F6,
+                                       B323E5E5FBD5663B21A8E623,
+                                       EC14DA30C090DDC62084DB4C,
+                                       8ECB0767EE340DD83869E37D, ); runOnlyForDeploymentPostprocessing = 0; };
+               4311FBCBD02948A0ED96C7DD = {isa = PBXNativeTarget; buildConfigurationList = B73863F5D180C23D3EC40C38; buildPhases = (
+                                       714944DB86A4D402E7FA269E,
+                                       C2977559BF9148DB70CA10AE,
+                                       865E89B94B41EB14C202CBB0, ); buildRules = ( ); dependencies = (  ); name = "NetworkGraphicsDemo - App"; productName = NetworkGraphicsDemo; productReference = E4162459ED4C829EF7B19691; productType = "com.apple.product-type.application"; };
+               A5398ADB6F5B128C00EB935C = {isa = PBXProject; buildConfigurationList = 02715337C584F3C721251428; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = D2EB65517396C974F0415A7F; projectDirPath = ""; projectRoot = ""; targets = (4311FBCBD02948A0ED96C7DD); };
        };
        rootObject = A5398ADB6F5B128C00EB935C;
 }
index 005ce49097f327b468c3cd60fead1d4580bf894a..deec8db8696c9bd74f188007ad86fed5df49b210 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{2F8ABED0-7428-13A5-07CD-EF1F3B43B926}</ProjectGuid>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,6 +25,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v120</PlatformToolset>\r
+    <PlatformToolset>v120</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
@@ -31,6 +34,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v120</PlatformToolset>\r
+    <PlatformToolset>v120</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">JUCE Network Graphics Demo</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <None Include="..\..\Source\juce_icon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
     <None Include=".\icon.ico"/>\r
index 438ae13e1f69bd2545672792b27a58514a3ac1e6..fdeb11f1489bfd52d901bba2cecb8364f4f70fa8 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index 8b3cbb1c2db82c6d31c188bfe61195cb9d453aef..2eaf232c5b40f4fb94811c9732fdd5ab2421c549 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{2F8ABED0-7428-13A5-07CD-EF1F3B43B926}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">JUCE Network Graphics Demo</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <None Include="..\..\Source\juce_icon.png"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
   </ItemGroup>\r
index 256331babde6b8a85e6aa9e4e40d3584685ed6ce..70136663bb91dd80890323fd5f32c5f86959bdc2 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index 20747ce3028643f89310220e06897e7460fb6f54..590ad9014c9f30af9df909eef14120fe489ea594 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               F468E8C7B02DFD4D53911277 = {
-                       isa = PBXBuildFile;
-                       fileRef = E4162459ED4C829EF7B19691;
-               };
-               80EE2C27B466BAFD83881D3F = {
-                       isa = PBXBuildFile;
-                       fileRef = 2E13A899F4E3C99054A3656F;
-               };
-               C4D6C466C41173D6970553D2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 9E8129263CD42C6029FC2CAD;
-               };
-               3CC6DC6E223415B506D0CB75 = {
-                       isa = PBXBuildFile;
-                       fileRef = 080961C54C58ECF2346B4C23;
-               };
-               67DF295E93E54432043126DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 6799B056504F9F017998B9E2;
-               };
-               770AB74B1D3A0108F764DD47 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4D1DB6D77B6F3DE7A569780B;
-               };
-               366A216FDEBD7BDDC1BA12D9 = {
-                       isa = PBXBuildFile;
-                       fileRef = DA40ED39AF4B56000E5A2743;
-               };
-               1F7A8BD2B43B3D191132301D = {
-                       isa = PBXBuildFile;
-                       fileRef = E51ABCA80B75F33848F28184;
-               };
-               CA694B2A73FCF12D7F9E7E49 = {
-                       isa = PBXBuildFile;
-                       fileRef = 448838BE6E937D450A3C84CE;
-               };
-               5A64B64E5B45AEA1A0EECC4B = {
-                       isa = PBXBuildFile;
-                       fileRef = 9193D2A3C463BEAA07FD424D;
-               };
-               F918FB5901F09EA77DB32022 = {
-                       isa = PBXBuildFile;
-                       fileRef = F7D557738137CA1A370BAA27;
-               };
-               1006E2E5DFA26D7DD20BC438 = {
-                       isa = PBXBuildFile;
-                       fileRef = 855850D3F44F120C46DE82EC;
-               };
-               A6AA70BD9364BB974CDEB337 = {
-                       isa = PBXBuildFile;
-                       fileRef = C821C5805007FFDC2636BBE6;
-               };
-               EC14DA30C090DDC62084DB4C = {
-                       isa = PBXBuildFile;
-                       fileRef = 935CA85EF98714D3A17AE737;
-               };
-               F714F0C84F5945BF3539239E = {
-                       isa = PBXBuildFile;
-                       fileRef = 379F77D23BFAE3795282CEB3;
-               };
-               1282A62308CD1AC3F88A5D03 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5273768FBB55D0DD57A5E70C;
-               };
-               006DF460F8DF66EFFA80D968 = {
-                       isa = PBXBuildFile;
-                       fileRef = 70F1CAF3C4C561DD81E6AFC1;
-               };
-               987CBD5330E76B404F0D966C = {
-                       isa = PBXBuildFile;
-                       fileRef = 77C0AC21C1028911123844FC;
-               };
-               9F618C008A503063D10076C4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 74711D7544168CCAC4969A07;
-               };
-               BB9A9692D99DD0DDB1047B60 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6D1F9E505D20C09647124F0A;
-               };
-               6C2200C52B65E1BE80544E50 = {
-                       isa = PBXBuildFile;
-                       fileRef = AF330F41D1A4865108690E3C;
-               };
-               A1F34D09F4E4338775917ED1 = {
-                       isa = PBXBuildFile;
-                       fileRef = C6E2284D86D93F1D9D5C7666;
-               };
-               2E28F61A64DEF942FE7B94C4 = {
-                       isa = PBXBuildFile;
-                       fileRef = AED58461CE961C62A0E0A552;
-               };
-               EA487FA4116517A8DFEE85B0 = {
-                       isa = PBXBuildFile;
-                       fileRef = FCEBB157FB526741DB6791D1;
-               };
-               0977FEC02DAF29438583198A = {
-                       isa = PBXBuildFile;
-                       fileRef = 01E0EEF68A11C1CAF180E173;
-               };
-               0FA2A3321630EBE83E439D99 = {
-                       isa = PBXBuildFile;
-                       fileRef = AFF729977947528F3E4AAA96;
-               };
-               9EFD2AA2FFF3C125FDAA4279 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7525879E73E8AF32FFA0CDDE;
-               };
-               C5E7BAD864E02CF37F7BD707 = {
-                       isa = PBXBuildFile;
-                       fileRef = 33AA348465F512DBA8778DAF;
-               };
-               CBC8F7E5225C73CEDFB3B72E = {
-                       isa = PBXBuildFile;
-                       fileRef = A7FF2B353C8568B5A7A80117;
-               };
-               CADEA83EAAC94E0011C07908 = {
-                       isa = PBXBuildFile;
-                       fileRef = 84B287BB2AD252B7D69AC47E;
-               };
-               3717B9F9A0F7C9CB95F1BE7F = {
-                       isa = PBXBuildFile;
-                       fileRef = 7BE6330821794919A88ED8ED;
-               };
-               61B523C52EBA17F738FFE31A = {
-                       isa = PBXBuildFile;
-                       fileRef = 660F1970CF687A7AE8371C6D;
-               };
-               C6348C6B1D0312580E97EA19 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3BF06B70407FFDBE9534F942;
-               };
-               01E0EEF68A11C1CAF180E173 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0555BAE6156EAF15CA77A2D8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               080961C54C58ECF2346B4C23 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               0ADF0DECFCB1DB4D3A847EB5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = "juce_icon.png";
-                       path = "../../Source/juce_icon.png";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               18BFEBD944DDE4809C89F27A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1FD6DBAC73414DD4C152E34E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               25DEDA8C9F94A6C8DFC8E53E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = SharedCanvas.h;
-                       path = ../../Source/SharedCanvas.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2E13A899F4E3C99054A3656F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               33AA348465F512DBA8778DAF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               379F77D23BFAE3795282CEB3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = UIKit.framework;
-                       path = System/Library/Frameworks/UIKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               3BF06B70407FFDBE9534F942 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_osc.cpp";
-                       path = "../../JuceLibraryCode/include_juce_osc.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               448838BE6E937D450A3C84CE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               4D1DB6D77B6F3DE7A569780B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudioKit.framework;
-                       path = System/Library/Frameworks/CoreAudioKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               4FF648D72D6F1A78956CDA1B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = Demos.h;
-                       path = ../../Source/Demos.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5273768FBB55D0DD57A5E70C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = folder.assetcatalog;
-                       name = Images.xcassets;
-                       path = NetworkGraphicsDemo/Images.xcassets;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               55CB060922ABCBC105FE38D2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_osc";
-                       path = "../../../../modules/juce_osc";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               660F1970CF687A7AE8371C6D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6799B056504F9F017998B9E2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               68EBC0BF5F01E05FDCB3EEAF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6D1F9E505D20C09647124F0A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               70F1CAF3C4C561DD81E6AFC1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               74711D7544168CCAC4969A07 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = BinaryData.cpp;
-                       path = ../../JuceLibraryCode/BinaryData.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7525879E73E8AF32FFA0CDDE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               77C0AC21C1028911123844FC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7BE6330821794919A88ED8ED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               84B287BB2AD252B7D69AC47E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               855850D3F44F120C46DE82EC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = MobileCoreServices.framework;
-                       path = System/Library/Frameworks/MobileCoreServices.framework;
-                       sourceTree = SDKROOT;
-               };
-               89583CD42AD218E9753DF11C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8E2F72AFA0CDA64F0C07F105 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = SlaveComponent.h;
-                       path = ../../Source/SlaveComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8EACAADD3A23DED3E252C92F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9193D2A3C463BEAA07FD424D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreText.framework;
-                       path = System/Library/Frameworks/CoreText.framework;
-                       sourceTree = SDKROOT;
-               };
-               92800676AF753D1A60108F11 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = BinaryData.h;
-                       path = ../../JuceLibraryCode/BinaryData.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               935CA85EF98714D3A17AE737 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               9982F39121710EFFD5FEEAEF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = MasterComponent.h;
-                       path = ../../Source/MasterComponent.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9C67BD1915C7FD5747C2BA8F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9C689AFBF364CB167C422D29 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E8129263CD42C6029FC2CAD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               A505E1DABB2ED630EFBA96DB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A7FF2B353C8568B5A7A80117 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AED58461CE961C62A0E0A552 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AF330F41D1A4865108690E3C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AFF729977947528F3E4AAA96 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B5433B00F012AD87AADBFCD6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B76F10A7778664E164A01934 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BA2E40409255F1B078406221 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C6E2284D86D93F1D9D5C7666 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C821C5805007FFDC2636BBE6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGLES.framework;
-                       path = System/Library/Frameworks/OpenGLES.framework;
-                       sourceTree = SDKROOT;
-               };
-               D12A0DFFE18728E84D9AB739 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DA40ED39AF4B56000E5A2743 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreGraphics.framework;
-                       path = System/Library/Frameworks/CoreGraphics.framework;
-                       sourceTree = SDKROOT;
-               };
-               E4162459ED4C829EF7B19691 = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = "JUCE Network Graphics Demo.app";
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               E4EA870A22A0C6649E55DD30 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E51ABCA80B75F33848F28184 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreImage.framework;
-                       path = System/Library/Frameworks/CoreImage.framework;
-                       sourceTree = SDKROOT;
-               };
-               F7D557738137CA1A370BAA27 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Foundation.framework;
-                       path = System/Library/Frameworks/Foundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               F98A4DAA0502EE9252EBE06F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FA0A789443FD480003E40435 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FCEBB157FB526741DB6791D1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5A58AF0A052C539F0E342A88 = {
-                       isa = PBXGroup;
-                       children = (
-                               4FF648D72D6F1A78956CDA1B,
-                               77C0AC21C1028911123844FC,
-                               9982F39121710EFFD5FEEAEF,
-                               8E2F72AFA0CDA64F0C07F105,
-                               25DEDA8C9F94A6C8DFC8E53E,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               856518502A948813C90E6761 = {
-                       isa = PBXGroup;
-                       children = (
-                               5A58AF0A052C539F0E342A88,
-                               0ADF0DECFCB1DB4D3A847EB5,
-                       );
-                       name = NetworkGraphicsDemo;
-                       sourceTree = "<group>";
-               };
-               EF0AACA84F1CEE7F45F56339 = {
-                       isa = PBXGroup;
-                       children = (
-                               B76F10A7778664E164A01934,
-                               89583CD42AD218E9753DF11C,
-                               9C67BD1915C7FD5747C2BA8F,
-                               A505E1DABB2ED630EFBA96DB,
-                               E4EA870A22A0C6649E55DD30,
-                               8EACAADD3A23DED3E252C92F,
-                               B5433B00F012AD87AADBFCD6,
-                               BA2E40409255F1B078406221,
-                               F98A4DAA0502EE9252EBE06F,
-                               18BFEBD944DDE4809C89F27A,
-                               FA0A789443FD480003E40435,
-                               9C689AFBF364CB167C422D29,
-                               68EBC0BF5F01E05FDCB3EEAF,
-                               55CB060922ABCBC105FE38D2,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               C20D4DECE1291BF6AF8711DC = {
-                       isa = PBXGroup;
-                       children = (
-                               0555BAE6156EAF15CA77A2D8,
-                               74711D7544168CCAC4969A07,
-                               92800676AF753D1A60108F11,
-                               6D1F9E505D20C09647124F0A,
-                               AF330F41D1A4865108690E3C,
-                               C6E2284D86D93F1D9D5C7666,
-                               AED58461CE961C62A0E0A552,
-                               FCEBB157FB526741DB6791D1,
-                               01E0EEF68A11C1CAF180E173,
-                               AFF729977947528F3E4AAA96,
-                               7525879E73E8AF32FFA0CDDE,
-                               33AA348465F512DBA8778DAF,
-                               A7FF2B353C8568B5A7A80117,
-                               84B287BB2AD252B7D69AC47E,
-                               7BE6330821794919A88ED8ED,
-                               660F1970CF687A7AE8371C6D,
-                               3BF06B70407FFDBE9534F942,
-                               D12A0DFFE18728E84D9AB739,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               4AA57E2B5FD5374D348EEF7F = {
-                       isa = PBXGroup;
-                       children = (
-                               1FD6DBAC73414DD4C152E34E,
-                               5273768FBB55D0DD57A5E70C,
-                               70F1CAF3C4C561DD81E6AFC1,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               71F5560BE0EE3A17A9CE44F6 = {
-                       isa = PBXGroup;
-                       children = (
-                               2E13A899F4E3C99054A3656F,
-                               9E8129263CD42C6029FC2CAD,
-                               080961C54C58ECF2346B4C23,
-                               6799B056504F9F017998B9E2,
-                               4D1DB6D77B6F3DE7A569780B,
-                               DA40ED39AF4B56000E5A2743,
-                               E51ABCA80B75F33848F28184,
-                               448838BE6E937D450A3C84CE,
-                               9193D2A3C463BEAA07FD424D,
-                               F7D557738137CA1A370BAA27,
-                               855850D3F44F120C46DE82EC,
-                               C821C5805007FFDC2636BBE6,
-                               935CA85EF98714D3A17AE737,
-                               379F77D23BFAE3795282CEB3,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               8B59A884C62D960EE9DFEF47 = {
-                       isa = PBXGroup;
-                       children = (
-                               E4162459ED4C829EF7B19691,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               D2EB65517396C974F0415A7F = {
-                       isa = PBXGroup;
-                       children = (
-                               856518502A948813C90E6761,
-                               EF0AACA84F1CEE7F45F56339,
-                               C20D4DECE1291BF6AF8711DC,
-                               4AA57E2B5FD5374D348EEF7F,
-                               71F5560BE0EE3A17A9CE44F6,
-                               8B59A884C62D960EE9DFEF47,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               EE7498599191DDC73ECB55B0 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               F468E8C7B02DFD4D53911277 = {isa = PBXBuildFile; fileRef = E4162459ED4C829EF7B19691; };
+               80EE2C27B466BAFD83881D3F = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; };
+               C4D6C466C41173D6970553D2 = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; };
+               3CC6DC6E223415B506D0CB75 = {isa = PBXBuildFile; fileRef = 080961C54C58ECF2346B4C23; };
+               67DF295E93E54432043126DF = {isa = PBXBuildFile; fileRef = 6799B056504F9F017998B9E2; };
+               770AB74B1D3A0108F764DD47 = {isa = PBXBuildFile; fileRef = 4D1DB6D77B6F3DE7A569780B; };
+               366A216FDEBD7BDDC1BA12D9 = {isa = PBXBuildFile; fileRef = DA40ED39AF4B56000E5A2743; };
+               1F7A8BD2B43B3D191132301D = {isa = PBXBuildFile; fileRef = E51ABCA80B75F33848F28184; };
+               CA694B2A73FCF12D7F9E7E49 = {isa = PBXBuildFile; fileRef = 448838BE6E937D450A3C84CE; };
+               5A64B64E5B45AEA1A0EECC4B = {isa = PBXBuildFile; fileRef = 9193D2A3C463BEAA07FD424D; };
+               F918FB5901F09EA77DB32022 = {isa = PBXBuildFile; fileRef = F7D557738137CA1A370BAA27; };
+               1006E2E5DFA26D7DD20BC438 = {isa = PBXBuildFile; fileRef = 855850D3F44F120C46DE82EC; };
+               A6AA70BD9364BB974CDEB337 = {isa = PBXBuildFile; fileRef = C821C5805007FFDC2636BBE6; };
+               EC14DA30C090DDC62084DB4C = {isa = PBXBuildFile; fileRef = 935CA85EF98714D3A17AE737; };
+               F714F0C84F5945BF3539239E = {isa = PBXBuildFile; fileRef = 379F77D23BFAE3795282CEB3; };
+               1282A62308CD1AC3F88A5D03 = {isa = PBXBuildFile; fileRef = 5273768FBB55D0DD57A5E70C; };
+               006DF460F8DF66EFFA80D968 = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; };
+               987CBD5330E76B404F0D966C = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; };
+               9F618C008A503063D10076C4 = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; };
+               BB9A9692D99DD0DDB1047B60 = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; };
+               6C2200C52B65E1BE80544E50 = {isa = PBXBuildFile; fileRef = AF330F41D1A4865108690E3C; };
+               A1F34D09F4E4338775917ED1 = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; };
+               2E28F61A64DEF942FE7B94C4 = {isa = PBXBuildFile; fileRef = AED58461CE961C62A0E0A552; };
+               EA487FA4116517A8DFEE85B0 = {isa = PBXBuildFile; fileRef = FCEBB157FB526741DB6791D1; };
+               0977FEC02DAF29438583198A = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; };
+               0FA2A3321630EBE83E439D99 = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; };
+               9EFD2AA2FFF3C125FDAA4279 = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; };
+               C5E7BAD864E02CF37F7BD707 = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; };
+               CBC8F7E5225C73CEDFB3B72E = {isa = PBXBuildFile; fileRef = A7FF2B353C8568B5A7A80117; };
+               CADEA83EAAC94E0011C07908 = {isa = PBXBuildFile; fileRef = 84B287BB2AD252B7D69AC47E; };
+               3717B9F9A0F7C9CB95F1BE7F = {isa = PBXBuildFile; fileRef = 7BE6330821794919A88ED8ED; };
+               61B523C52EBA17F738FFE31A = {isa = PBXBuildFile; fileRef = 660F1970CF687A7AE8371C6D; };
+               C6348C6B1D0312580E97EA19 = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; };
+               01E0EEF68A11C1CAF180E173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               0555BAE6156EAF15CA77A2D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               080961C54C58ECF2346B4C23 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               0ADF0DECFCB1DB4D3A847EB5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "juce_icon.png"; path = "../../Source/juce_icon.png"; sourceTree = "SOURCE_ROOT"; };
+               18BFEBD944DDE4809C89F27A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               1FD6DBAC73414DD4C152E34E = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               25DEDA8C9F94A6C8DFC8E53E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = "SOURCE_ROOT"; };
+               2E13A899F4E3C99054A3656F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               33AA348465F512DBA8778DAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               379F77D23BFAE3795282CEB3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+               3BF06B70407FFDBE9534F942 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+               448838BE6E937D450A3C84CE = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               4D1DB6D77B6F3DE7A569780B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+               4FF648D72D6F1A78956CDA1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = "SOURCE_ROOT"; };
+               5273768FBB55D0DD57A5E70C = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = NetworkGraphicsDemo/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+               55CB060922ABCBC105FE38D2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+               660F1970CF687A7AE8371C6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               6799B056504F9F017998B9E2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               68EBC0BF5F01E05FDCB3EEAF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               6D1F9E505D20C09647124F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               70F1CAF3C4C561DD81E6AFC1 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               74711D7544168CCAC4969A07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+               7525879E73E8AF32FFA0CDDE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               77C0AC21C1028911123844FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               7BE6330821794919A88ED8ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               84B287BB2AD252B7D69AC47E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               855850D3F44F120C46DE82EC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+               89583CD42AD218E9753DF11C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               8E2F72AFA0CDA64F0C07F105 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SlaveComponent.h; path = ../../Source/SlaveComponent.h; sourceTree = "SOURCE_ROOT"; };
+               8EACAADD3A23DED3E252C92F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               9193D2A3C463BEAA07FD424D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+               92800676AF753D1A60108F11 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+               935CA85EF98714D3A17AE737 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               9982F39121710EFFD5FEEAEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MasterComponent.h; path = ../../Source/MasterComponent.h; sourceTree = "SOURCE_ROOT"; };
+               9C67BD1915C7FD5747C2BA8F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               9C689AFBF364CB167C422D29 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               9E8129263CD42C6029FC2CAD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               A505E1DABB2ED630EFBA96DB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               A7FF2B353C8568B5A7A80117 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               AED58461CE961C62A0E0A552 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               AF330F41D1A4865108690E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               AFF729977947528F3E4AAA96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               B5433B00F012AD87AADBFCD6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               B76F10A7778664E164A01934 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               BA2E40409255F1B078406221 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               C6E2284D86D93F1D9D5C7666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               C821C5805007FFDC2636BBE6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+               D12A0DFFE18728E84D9AB739 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               DA40ED39AF4B56000E5A2743 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+               E4162459ED4C829EF7B19691 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "JUCE Network Graphics Demo.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               E4EA870A22A0C6649E55DD30 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               E51ABCA80B75F33848F28184 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+               F7D557738137CA1A370BAA27 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+               F98A4DAA0502EE9252EBE06F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               FA0A789443FD480003E40435 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               FCEBB157FB526741DB6791D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               5A58AF0A052C539F0E342A88 = {isa = PBXGroup; children = (
+                                       4FF648D72D6F1A78956CDA1B,
+                                       77C0AC21C1028911123844FC,
+                                       9982F39121710EFFD5FEEAEF,
+                                       8E2F72AFA0CDA64F0C07F105,
+                                       25DEDA8C9F94A6C8DFC8E53E, ); name = Source; sourceTree = "<group>"; };
+               856518502A948813C90E6761 = {isa = PBXGroup; children = (
+                                       5A58AF0A052C539F0E342A88,
+                                       0ADF0DECFCB1DB4D3A847EB5, ); name = NetworkGraphicsDemo; sourceTree = "<group>"; };
+               EF0AACA84F1CEE7F45F56339 = {isa = PBXGroup; children = (
+                                       B76F10A7778664E164A01934,
+                                       89583CD42AD218E9753DF11C,
+                                       9C67BD1915C7FD5747C2BA8F,
+                                       A505E1DABB2ED630EFBA96DB,
+                                       E4EA870A22A0C6649E55DD30,
+                                       8EACAADD3A23DED3E252C92F,
+                                       B5433B00F012AD87AADBFCD6,
+                                       BA2E40409255F1B078406221,
+                                       F98A4DAA0502EE9252EBE06F,
+                                       18BFEBD944DDE4809C89F27A,
+                                       FA0A789443FD480003E40435,
+                                       9C689AFBF364CB167C422D29,
+                                       68EBC0BF5F01E05FDCB3EEAF,
+                                       55CB060922ABCBC105FE38D2, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               C20D4DECE1291BF6AF8711DC = {isa = PBXGroup; children = (
+                                       0555BAE6156EAF15CA77A2D8,
+                                       74711D7544168CCAC4969A07,
+                                       92800676AF753D1A60108F11,
+                                       6D1F9E505D20C09647124F0A,
+                                       AF330F41D1A4865108690E3C,
+                                       C6E2284D86D93F1D9D5C7666,
+                                       AED58461CE961C62A0E0A552,
+                                       FCEBB157FB526741DB6791D1,
+                                       01E0EEF68A11C1CAF180E173,
+                                       AFF729977947528F3E4AAA96,
+                                       7525879E73E8AF32FFA0CDDE,
+                                       33AA348465F512DBA8778DAF,
+                                       A7FF2B353C8568B5A7A80117,
+                                       84B287BB2AD252B7D69AC47E,
+                                       7BE6330821794919A88ED8ED,
+                                       660F1970CF687A7AE8371C6D,
+                                       3BF06B70407FFDBE9534F942,
+                                       D12A0DFFE18728E84D9AB739, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               4AA57E2B5FD5374D348EEF7F = {isa = PBXGroup; children = (
+                                       1FD6DBAC73414DD4C152E34E,
+                                       5273768FBB55D0DD57A5E70C,
+                                       70F1CAF3C4C561DD81E6AFC1, ); name = Resources; sourceTree = "<group>"; };
+               71F5560BE0EE3A17A9CE44F6 = {isa = PBXGroup; children = (
+                                       2E13A899F4E3C99054A3656F,
+                                       9E8129263CD42C6029FC2CAD,
+                                       080961C54C58ECF2346B4C23,
+                                       6799B056504F9F017998B9E2,
+                                       4D1DB6D77B6F3DE7A569780B,
+                                       DA40ED39AF4B56000E5A2743,
+                                       E51ABCA80B75F33848F28184,
+                                       448838BE6E937D450A3C84CE,
+                                       9193D2A3C463BEAA07FD424D,
+                                       F7D557738137CA1A370BAA27,
+                                       855850D3F44F120C46DE82EC,
+                                       C821C5805007FFDC2636BBE6,
+                                       935CA85EF98714D3A17AE737,
+                                       379F77D23BFAE3795282CEB3, ); name = Frameworks; sourceTree = "<group>"; };
+               8B59A884C62D960EE9DFEF47 = {isa = PBXGroup; children = (
+                                       E4162459ED4C829EF7B19691, ); name = Products; sourceTree = "<group>"; };
+               D2EB65517396C974F0415A7F = {isa = PBXGroup; children = (
+                                       856518502A948813C90E6761,
+                                       EF0AACA84F1CEE7F45F56339,
+                                       C20D4DECE1291BF6AF8711DC,
+                                       4AA57E2B5FD5374D348EEF7F,
+                                       71F5560BE0EE3A17A9CE44F6,
+                                       8B59A884C62D960EE9DFEF47, ); name = Source; sourceTree = "<group>"; };
+               EE7498599191DDC73ECB55B0 = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
-                               PRODUCT_NAME = "JUCE Network Graphics Demo";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               2E06386CE7CCA5FF76819BFF = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               2E06386CE7CCA5FF76819BFF = {isa = XCBuildConfiguration; buildSettings = {
                                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
-                               PRODUCT_NAME = "JUCE Network Graphics Demo";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               3BF0365A560ACD4FD24D40CE = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               USE_HEADERMAP = NO; }; name = Release; };
+               3BF0365A560ACD4FD24D40CE = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               9C6D2FD441D79104734762A5 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               9C6D2FD441D79104734762A5 = {isa = XCBuildConfiguration; buildSettings = {
                                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                SDKROOT = iphoneos;
                                TARGETED_DEVICE_FAMILY = "1,2";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               80BE97CC38B01FABC0E73204 = {
-                       isa = PBXTargetDependency;
-                       target = 4311FBCBD02948A0ED96C7DD;
-               };
-               02715337C584F3C721251428 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               3BF0365A560ACD4FD24D40CE,
-                               9C6D2FD441D79104734762A5,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               B73863F5D180C23D3EC40C38 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               EE7498599191DDC73ECB55B0,
-                               2E06386CE7CCA5FF76819BFF,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               714944DB86A4D402E7FA269E = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               1282A62308CD1AC3F88A5D03,
-                               006DF460F8DF66EFFA80D968,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               C2977559BF9148DB70CA10AE = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               987CBD5330E76B404F0D966C,
-                               9F618C008A503063D10076C4,
-                               BB9A9692D99DD0DDB1047B60,
-                               6C2200C52B65E1BE80544E50,
-                               A1F34D09F4E4338775917ED1,
-                               2E28F61A64DEF942FE7B94C4,
-                               EA487FA4116517A8DFEE85B0,
-                               0977FEC02DAF29438583198A,
-                               0FA2A3321630EBE83E439D99,
-                               9EFD2AA2FFF3C125FDAA4279,
-                               C5E7BAD864E02CF37F7BD707,
-                               CBC8F7E5225C73CEDFB3B72E,
-                               CADEA83EAAC94E0011C07908,
-                               3717B9F9A0F7C9CB95F1BE7F,
-                               61B523C52EBA17F738FFE31A,
-                               C6348C6B1D0312580E97EA19,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               865E89B94B41EB14C202CBB0 = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               80EE2C27B466BAFD83881D3F,
-                               C4D6C466C41173D6970553D2,
-                               3CC6DC6E223415B506D0CB75,
-                               67DF295E93E54432043126DF,
-                               770AB74B1D3A0108F764DD47,
-                               366A216FDEBD7BDDC1BA12D9,
-                               1F7A8BD2B43B3D191132301D,
-                               CA694B2A73FCF12D7F9E7E49,
-                               5A64B64E5B45AEA1A0EECC4B,
-                               F918FB5901F09EA77DB32022,
-                               1006E2E5DFA26D7DD20BC438,
-                               A6AA70BD9364BB974CDEB337,
-                               EC14DA30C090DDC62084DB4C,
-                               F714F0C84F5945BF3539239E,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               4311FBCBD02948A0ED96C7DD = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = B73863F5D180C23D3EC40C38;
-                       buildPhases = (
-                               714944DB86A4D402E7FA269E,
-                               C2977559BF9148DB70CA10AE,
-                               865E89B94B41EB14C202CBB0,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "NetworkGraphicsDemo - App";
-                       productName = NetworkGraphicsDemo;
-                       productReference = E4162459ED4C829EF7B19691;
-                       productType = "com.apple.product-type.application";
-               };
-               A5398ADB6F5B128C00EB935C = {
-                       isa = PBXProject;
-                       buildConfigurationList = 02715337C584F3C721251428;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = D2EB65517396C974F0415A7F;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (4311FBCBD02948A0ED96C7DD);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               80BE97CC38B01FABC0E73204 = {isa = PBXTargetDependency; target = 4311FBCBD02948A0ED96C7DD; };
+               02715337C584F3C721251428 = {isa = XCConfigurationList; buildConfigurations = (
+                                       3BF0365A560ACD4FD24D40CE,
+                                       9C6D2FD441D79104734762A5, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               B73863F5D180C23D3EC40C38 = {isa = XCConfigurationList; buildConfigurations = (
+                                       EE7498599191DDC73ECB55B0,
+                                       2E06386CE7CCA5FF76819BFF, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               714944DB86A4D402E7FA269E = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       1282A62308CD1AC3F88A5D03,
+                                       006DF460F8DF66EFFA80D968, ); runOnlyForDeploymentPostprocessing = 0; };
+               C2977559BF9148DB70CA10AE = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       987CBD5330E76B404F0D966C,
+                                       9F618C008A503063D10076C4,
+                                       BB9A9692D99DD0DDB1047B60,
+                                       6C2200C52B65E1BE80544E50,
+                                       A1F34D09F4E4338775917ED1,
+                                       2E28F61A64DEF942FE7B94C4,
+                                       EA487FA4116517A8DFEE85B0,
+                                       0977FEC02DAF29438583198A,
+                                       0FA2A3321630EBE83E439D99,
+                                       9EFD2AA2FFF3C125FDAA4279,
+                                       C5E7BAD864E02CF37F7BD707,
+                                       CBC8F7E5225C73CEDFB3B72E,
+                                       CADEA83EAAC94E0011C07908,
+                                       3717B9F9A0F7C9CB95F1BE7F,
+                                       61B523C52EBA17F738FFE31A,
+                                       C6348C6B1D0312580E97EA19, ); runOnlyForDeploymentPostprocessing = 0; };
+               865E89B94B41EB14C202CBB0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       80EE2C27B466BAFD83881D3F,
+                                       C4D6C466C41173D6970553D2,
+                                       3CC6DC6E223415B506D0CB75,
+                                       67DF295E93E54432043126DF,
+                                       770AB74B1D3A0108F764DD47,
+                                       366A216FDEBD7BDDC1BA12D9,
+                                       1F7A8BD2B43B3D191132301D,
+                                       CA694B2A73FCF12D7F9E7E49,
+                                       5A64B64E5B45AEA1A0EECC4B,
+                                       F918FB5901F09EA77DB32022,
+                                       1006E2E5DFA26D7DD20BC438,
+                                       A6AA70BD9364BB974CDEB337,
+                                       EC14DA30C090DDC62084DB4C,
+                                       F714F0C84F5945BF3539239E, ); runOnlyForDeploymentPostprocessing = 0; };
+               4311FBCBD02948A0ED96C7DD = {isa = PBXNativeTarget; buildConfigurationList = B73863F5D180C23D3EC40C38; buildPhases = (
+                                       714944DB86A4D402E7FA269E,
+                                       C2977559BF9148DB70CA10AE,
+                                       865E89B94B41EB14C202CBB0, ); buildRules = ( ); dependencies = (  ); name = "NetworkGraphicsDemo - App"; productName = NetworkGraphicsDemo; productReference = E4162459ED4C829EF7B19691; productType = "com.apple.product-type.application"; };
+               A5398ADB6F5B128C00EB935C = {isa = PBXProject; buildConfigurationList = 02715337C584F3C721251428; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = D2EB65517396C974F0415A7F; projectDirPath = ""; projectRoot = ""; targets = (4311FBCBD02948A0ED96C7DD); };
        };
        rootObject = A5398ADB6F5B128C00EB935C;
 }
index ac4e6435cd910475367bee620c2cdd333bfbe40d..4efb82c60ae497beb1cd78a86c713b3b6c1cbe4c 100644 (file)
 //==============================================================================\r
 // juce_audio_devices flags:\r
 \r
-#ifndef    JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 #ifndef    JUCE_ASIO\r
  //#define JUCE_ASIO 0\r
 #endif\r
  //#define JUCE_USE_ANDROID_OPENSLES 0\r
 #endif\r
 \r
+#ifndef    JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 #ifndef    JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
  //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
 #endif\r
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
  //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_events flags:\r
 \r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
  //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0\r
 #endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index 40913a3d38ac0dd2d306e1594d8db150e1f409eb..b2aadd3b0e4a240aad147a77a5c0ead89259c58c 100644 (file)
@@ -660,8 +660,7 @@ const char* juce_icon_png = (const char*) temp_binary_data_0;
 const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)\r
 {\r
     unsigned int hash = 0;\r
-\r
-    if (resourceNameUTF8 != nullptr)\r
+    if (resourceNameUTF8 != 0)\r
         while (*resourceNameUTF8 != 0)\r
             hash = 31 * hash + (unsigned int) *resourceNameUTF8++;\r
 \r
index b72437d24d6e0ffc439102f846cc411130d5cda8..96ce9a8e12598ef599e8fa516aa5f88e39d4d989 100644 (file)
@@ -41,7 +41,6 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "NetworkGraphicsDemo";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
     const char* const  versionString  = "1.0.0";\r
     const int          versionNumber  = 0x10000;\r
 }\r
index f36f7308e4e9c76799930ab852073567960788a1..8eeee6b78de175b099ad344a4fabcc5685361848 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="gWI5Ir" name="NetworkGraphicsDemo" projectType="guiapp" bundleIdentifier="com.juce.NetworkGraphicsDemo"\r
-              jucerVersion="5.4.1" displaySplashScreen="0" reportAppUsage="0"\r
+              jucerVersion="5.3.1" displaySplashScreen="0" reportAppUsage="0"\r
               companyName="ROLI Ltd." companyCopyright="ROLI Ltd.">\r
   <MAINGROUP id="OT9rJ2" name="NetworkGraphicsDemo">\r
     <GROUP id="{48D54E6E-37F4-B20A-E038-C63E4EDFD4D9}" name="Source">\r
                    androidCpp11="1" targetFolder="Builds/Android" androidSDKPath=""\r
                    androidNDKPath="" bigIcon="Ww6bQw" gradleToolchainVersion="3.6">\r
       <CONFIGURATIONS>\r
-        <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
+        <CONFIGURATION name="Debug" androidArchitectures="armeabi armeabi-v7a x86" isDebug="1"\r
                        optimisation="6" targetName="JUCE Network Graphics Demo" defines="JUCE_DEBUG=0"/>\r
         <CONFIGURATION name="Release" androidArchitectures="" isDebug="0" targetName="JUCE Network Graphics Demo"/>\r
       </CONFIGURATIONS>\r
index 14485880cc69c3fadfce399f5194273256c0c32f..f42ec3d078aac2c69ec1225ab5d96bb68056930b 100644 (file)
@@ -5,7 +5,7 @@
 This example is an app that we threw together to run as a demo of JUCE on our\r
 booth at CES 2016.\r
 \r
-It allows a collection of heterogeneous devices on a local network to collectively\r
+It allows a collection of heterogenous devices on a local network to collectively\r
 draw parts of a large animated vector graphic image that is being generated and\r
 broadcast by one of the machines (the 'master').\r
 \r
index 505e50f1d2b3b27b9721d5873ebc336d38e14cd6..24517755e7a00b30f64d66d5c04ad1c13fbfec1c 100644 (file)
@@ -84,7 +84,8 @@ struct BackgroundLogo  : public AnimatedContent
             </svg>\r
             )blahblah";\r
 \r
-        logo.reset (Drawable::createFromSVG (*parseXML (logoData)));\r
+        std::unique_ptr<XmlElement> svg (XmlDocument::parse (logoData));\r
+        logo.reset (Drawable::createFromSVG (*svg));\r
     }\r
 \r
     String getName() const override      { return "Background Image"; }\r
index 40c0597b3b7058914147af08f461a738dd7c6365..3a352b6ff6b15dd3bf00acc9f92547fdd3f35e79 100644 (file)
 \r
 namespace\r
 {\r
+    String getIPAddress()\r
+    {\r
+        Array<IPAddress> addresses;\r
+        IPAddress::findAllAddresses (addresses);\r
+        return addresses[1].toString();\r
+    }\r
+\r
     String getBroadcastIPAddress()\r
     {\r
-        return IPAddress::getLocalAddress().toString().upToLastOccurrenceOf (".", false, false) + ".255";\r
+        return getIPAddress().upToLastOccurrenceOf (".", false, false) + ".255";\r
     }\r
 \r
     static const int masterPortNumber = 9001;  // the UDP port the master sends on / the clients receive.\r
index be00993b25248c2a46340b40dbefa114f657dbc9..f3729534031efd8a1ed17cbef848eb06d0a5e156 100644 (file)
@@ -126,8 +126,8 @@ private:
     //==============================================================================\r
     String getMachineInfoToDisplay() const\r
     {\r
-        auto display = Desktop::getInstance().getDisplays().findDisplayForPoint (getScreenBounds().getCentre());\r
-        return getOSName() + "   " + String (display.dpi) + "   "  + String (display.scale);\r
+        //auto display = Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre());\r
+        return getOSName();//     + "   " + String (display.dpi) + "   "  + String (display.scale);\r
     }\r
 \r
     static String getOSName()\r
@@ -181,7 +181,7 @@ private:
         if (auto client = canvas.findClient (clientName))\r
         {\r
             auto screenBounds = getScreenBounds();\r
-            auto display = Desktop::getInstance().getDisplays().findDisplayForPoint (screenBounds.getCentre());\r
+            auto display = Desktop::getInstance().getDisplays().getDisplayContaining (screenBounds.getCentre());\r
             return ((screenBounds - display.userArea.getCentre()).toFloat() / (client->scaleFactor * display.dpi / display.scale)) + client->centre;\r
         }\r
 \r
@@ -192,7 +192,7 @@ private:
     {\r
         if (auto client = canvas.findClient (clientName))\r
         {\r
-            auto display = Desktop::getInstance().getDisplays().findDisplayForPoint (getScreenBounds().getCentre());\r
+            auto display = Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre());\r
             return (display.userArea.toFloat() / (client->scaleFactor * display.dpi / display.scale)).withCentre (client->centre);\r
         }\r
 \r
@@ -201,7 +201,7 @@ private:
 \r
     void timerCallback() override\r
     {\r
-        send (newClientOSCAddress, clientName + ":" + IPAddress::getLocalAddress().toString()\r
+        send (newClientOSCAddress, clientName + ":" + getIPAddress()\r
                                               + ":" + getScreenAreaInGlobalSpace().toString());\r
     }\r
 \r
index e6ccf207c3bab91339332cee30bc2c3be6ffd399..18739e54cf502d4812cb0b92d53586f7b13835bc 100644 (file)
@@ -35,13 +35,13 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := Projucer\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++11 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -56,13 +56,13 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_APP := Projucer\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++11 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -114,6 +114,7 @@ OBJECTS_APP := \
   $(JUCE_OBJDIR)/jucer_FileHelpers_54f12f83.o \\r
   $(JUCE_OBJDIR)/jucer_MiscUtilities_31fc8dd8.o \\r
   $(JUCE_OBJDIR)/jucer_PIPGenerator_fd3402c7.o \\r
+  $(JUCE_OBJDIR)/jucer_DependencyPathPropertyComponent_5d68c773.o \\r
   $(JUCE_OBJDIR)/jucer_Icons_d02d18f1.o \\r
   $(JUCE_OBJDIR)/jucer_JucerTreeViewBase_9b9f2ff0.o \\r
   $(JUCE_OBJDIR)/jucer_ProjucerLookAndFeel_3b20291d.o \\r
@@ -130,13 +131,11 @@ OBJECTS_APP := \
   $(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \\r
   $(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
        @echo Linking "Projucer - App"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -373,6 +372,11 @@ $(JUCE_OBJDIR)/jucer_PIPGenerator_fd3402c7.o: ../../Source/Utility/PIPs/jucer_PI
        @echo "Compiling jucer_PIPGenerator.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
 \r
+$(JUCE_OBJDIR)/jucer_DependencyPathPropertyComponent_5d68c773.o: ../../Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp\r
+       -$(V_AT)mkdir -p $(JUCE_OBJDIR)\r
+       @echo "Compiling jucer_DependencyPathPropertyComponent.cpp"\r
+       $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
+\r
 $(JUCE_OBJDIR)/jucer_Icons_d02d18f1.o: ../../Source/Utility/UI/jucer_Icons.cpp\r
        -$(V_AT)mkdir -p $(JUCE_OBJDIR)\r
        @echo "Compiling jucer_Icons.cpp"\r
@@ -448,6 +452,10 @@ $(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o: ../../JuceLibraryCode/include_
        @echo "Compiling include_juce_gui_extra.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
 clean:\r
        @echo Cleaning Projucer\r
        $(V_AT)$(CLEANCMD)\r
index 549d2dd3348797b0594162c44541bc6da01d9fcf..34a5755ca13e19457e3eed88b8837e982a045a1b 100644 (file)
@@ -33,9 +33,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>5.4.1</string>\r
+    <string>5.3.2</string>\r
     <key>CFBundleVersion</key>\r
-    <string>5.4.1</string>\r
+    <string>5.3.2</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>ROLI Ltd.</string>\r
     <key>NSHighResolutionCapable</key>\r
index 1ba4455cfedd016eac880630345977db88c0fb82..27a8ec6277123e59e1c70e41077cc10ccf577c30 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               A6A9D7624D002544ECB81D82 = {
-                       isa = PBXBuildFile;
-                       fileRef = 09DE066936CF037E9709ADB1;
-               };
-               A578EAD4BB55680E8097BE0F = {
-                       isa = PBXBuildFile;
-                       fileRef = 80D62B907248523E6943298B;
-               };
-               C1B9334AE849F93FB3C56B34 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5A75806B34E4EA6598A6024A;
-               };
-               8B4A593B3869815BBAC3EF93 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7B3F7ECF6DBF8C8EE5C2CB86;
-               };
-               A14C2C2725DA3CA7995D2815 = {
-                       isa = PBXBuildFile;
-                       fileRef = 210CD22F25F2C22F9CEEB025;
-               };
-               1E76E36772355E2A43CF4961 = {
-                       isa = PBXBuildFile;
-                       fileRef = D00F311BFC3C2625C457CB9B;
-               };
-               241F29FCBB7A17BB44A0B10C = {
-                       isa = PBXBuildFile;
-                       fileRef = D1F9B0E9F5D54FE48BEB46EA;
-               };
-               9359F9401D59B4517F75C39C = {
-                       isa = PBXBuildFile;
-                       fileRef = 728FE25157E9874D50BBECB2;
-               };
-               091A57B4B9CE623E75E9A756 = {
-                       isa = PBXBuildFile;
-                       fileRef = E983E6DDE3318B872EBE347F;
-               };
-               FAB47E69F7D9DCE1F906AA07 = {
-                       isa = PBXBuildFile;
-                       fileRef = 8F7BE18698ADCEF51CDE4A5C;
-               };
-               0E884E47A637D6C65154699A = {
-                       isa = PBXBuildFile;
-                       fileRef = 842427CFE565F3FCE5B99174;
-               };
-               49C22786B54C5DC94E4654B8 = {
-                       isa = PBXBuildFile;
-                       fileRef = E96597BBC6A98255B51B94DC;
-               };
-               CDEF9FF2D119476D707305DF = {
-                       isa = PBXBuildFile;
-                       fileRef = 431D30038CBF67F80E8B3A13;
-               };
-               96EC6315E1B3F1A109F84BAF = {
-                       isa = PBXBuildFile;
-                       fileRef = 9F01BA9942D038EA8B5289A8;
-               };
-               11D42F7EC6E6539D79A7F4B1 = {
-                       isa = PBXBuildFile;
-                       fileRef = E5D6C36496F5BC84D7213BE8;
-               };
-               B980464FA2761CCD64B1FAD6 = {
-                       isa = PBXBuildFile;
-                       fileRef = CF6C8BD0DA3D8CD4E99EBADA;
-               };
-               2610F357881240ACBF612F48 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6678E9B3EEACAD47F438B264;
-               };
-               1321E6C1C6170B6C898AD09D = {
-                       isa = PBXBuildFile;
-                       fileRef = 951128CA33CCDEF570436B1C;
-               };
-               6DD9DA1677A6CF789CDAB478 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0D4D508C638BC74943B9976D;
-               };
-               954A036F5DDB375DB23FFB3E = {
-                       isa = PBXBuildFile;
-                       fileRef = 0400CB0E056A1D840304D2DE;
-               };
-               95B44E6C74B1DED31DBE37EB = {
-                       isa = PBXBuildFile;
-                       fileRef = 8C52A3DDA62A746AA7A68535;
-               };
-               AA9D0B8E23F3D87A23DE9F8A = {
-                       isa = PBXBuildFile;
-                       fileRef = 9069981E414A631B036CC9AC;
-               };
-               98F9BB4612E82EE59689E15C = {
-                       isa = PBXBuildFile;
-                       fileRef = B6496F16ACE80CACC5721570;
-               };
-               09C4EDDF7F8B6E75EA3CE3A9 = {
-                       isa = PBXBuildFile;
-                       fileRef = BC3B310D42C489E8B8D93327;
-               };
-               71713DE4716DCEDB45A206E2 = {
-                       isa = PBXBuildFile;
-                       fileRef = F9111E150CFF155329D44853;
-               };
-               940CE4E081E9E685243C07AA = {
-                       isa = PBXBuildFile;
-                       fileRef = 332AF94C3275FEA8B878D603;
-               };
-               49EEEA5B74D38F3C5A8794F1 = {
-                       isa = PBXBuildFile;
-                       fileRef = 8F731F1F98BAB42F1C3B96AA;
-               };
-               6FD9428439B572B558EF64EA = {
-                       isa = PBXBuildFile;
-                       fileRef = BF301C2E545AEB4AC112C176;
-               };
-               6EAAAAB0C2B2DA259B26D63C = {
-                       isa = PBXBuildFile;
-                       fileRef = 1DCA18E935A35D29D2D9B6A0;
-               };
-               4C0F95265A230E5A8717A0A9 = {
-                       isa = PBXBuildFile;
-                       fileRef = D6390A40B3279E0E626C78D3;
-               };
-               FFA8B18CDF2D2AA500698A96 = {
-                       isa = PBXBuildFile;
-                       fileRef = 512D80BE12634967A085A1DC;
-               };
-               EE26A1C2DAAB609362F407EA = {
-                       isa = PBXBuildFile;
-                       fileRef = 988F5C1E40DED02D8B064253;
-               };
-               4FAAB649E846BA2764C02ACE = {
-                       isa = PBXBuildFile;
-                       fileRef = 72ED72174F9DBD0ABD8AFCED;
-               };
-               7D750EF5FCE1E1A461D435BE = {
-                       isa = PBXBuildFile;
-                       fileRef = 4AE72953E3B3DF06D3B9BA86;
-               };
-               537ABF1DB09DDBD1542A2B0C = {
-                       isa = PBXBuildFile;
-                       fileRef = EF25A29A2194FC107B40F65F;
-               };
-               290F2CD930097091B8DB122E = {
-                       isa = PBXBuildFile;
-                       fileRef = 00E6B87A43453B51850550E1;
-               };
-               4B2F2DAA45060D3F250D0AE4 = {
-                       isa = PBXBuildFile;
-                       fileRef = 6F02C3B7FEA3B50692A70DE5;
-               };
-               BDD30804C9424526A1122A28 = {
-                       isa = PBXBuildFile;
-                       fileRef = 351AF80A004D766E314AB76D;
-               };
-               37D582DA2227E004BFA237EC = {
-                       isa = PBXBuildFile;
-                       fileRef = 6E70C1FA80F02D4C310F63AA;
-               };
-               9B8ED9D50406E5D75DEE57F5 = {
-                       isa = PBXBuildFile;
-                       fileRef = FFE01768CF1C8DBDAA894F76;
-               };
-               89116B0BD882B51C63A84425 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0EE17BE4154CF1B2EE683894;
-               };
-               63D97E01F2C4C91037CB65BD = {
-                       isa = PBXBuildFile;
-                       fileRef = 24EB4C2412821B8019D6F754;
-               };
-               45A53AF13B0D663050632E8C = {
-                       isa = PBXBuildFile;
-                       fileRef = 9EF583A6201DBC813C2F63C4;
-               };
-               C2A85091A28C907A4E1E1687 = {
-                       isa = PBXBuildFile;
-                       fileRef = 133F1E428260C5ADDF496DF9;
-               };
-               83431B7234A78ECFB3C15F63 = {
-                       isa = PBXBuildFile;
-                       fileRef = 78D0DBC4798FF040FDB90F6D;
-               };
-               209FCCC2155A1FCB7E11E20D = {
-                       isa = PBXBuildFile;
-                       fileRef = 269A454F1FF081DA67FFD578;
-               };
-               C93569F47B4AC1A8E37992ED = {
-                       isa = PBXBuildFile;
-                       fileRef = 9D7689451732AF8333402B3A;
-               };
-               1B988E139004D8E2850EB656 = {
-                       isa = PBXBuildFile;
-                       fileRef = C187718F7B9EBA88584B43F3;
-               };
-               6FD0752A5CADCF60D79FDBB7 = {
-                       isa = PBXBuildFile;
-                       fileRef = 51CBE59779A36D1B80B26974;
-               };
-               D25EBE02B55DB244BE0D5635 = {
-                       isa = PBXBuildFile;
-                       fileRef = DE3E6B2614229FAD56D50770;
-               };
-               85E7FCB0516EFF853FA7B380 = {
-                       isa = PBXBuildFile;
-                       fileRef = D2FE76E4CF003856278343CC;
-               };
-               CC6C4D351BA9B473E5F95791 = {
-                       isa = PBXBuildFile;
-                       fileRef = ADA538034910F52FDD2DC88D;
-               };
-               05A08E366EBF8D650974E695 = {
-                       isa = PBXBuildFile;
-                       fileRef = 516D6D7C564DD5DF5C15CB06;
-               };
-               3FCA61C401007B243E2E9035 = {
-                       isa = PBXBuildFile;
-                       fileRef = F797071D88542C813CF7222A;
-               };
-               30B921C38DCEE787B294B746 = {
-                       isa = PBXBuildFile;
-                       fileRef = BAC43B20E14A340CCF14119C;
-               };
-               244567D3AE2E417A8CB2B95E = {
-                       isa = PBXBuildFile;
-                       fileRef = C3BB9F92B02B06D04A73794C;
-               };
-               26D6AEA321E80ABCC3CCCCD1 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4FF81FC167C924C47BD8C1C9;
-               };
-               4E6DC4778D583C48C3CCD4DC = {
-                       isa = PBXBuildFile;
-                       fileRef = E13A54A6D3A1895EACE53E51;
-               };
-               EE722B47BC36CC8A87E0FB76 = {
-                       isa = PBXBuildFile;
-                       fileRef = BE618CE21C794BDEE319E328;
-               };
-               2DF375B40A64BB3778F7ABD1 = {
-                       isa = PBXBuildFile;
-                       fileRef = F5DD97B45B8EA60C1ED0DD80;
-               };
-               8BE478303CDF061B72F219E2 = {
-                       isa = PBXBuildFile;
-                       fileRef = F2E4998FB2C7221587A79F8B;
-               };
-               BF913199032B4CE970E82AA3 = {
-                       isa = PBXBuildFile;
-                       fileRef = B403AF75EAF361ED74EE476E;
-               };
-               25EF9B3FECB4C9F0F522DCAA = {
-                       isa = PBXBuildFile;
-                       fileRef = 486E8D02DAD2A0BF54A901C0;
-               };
-               638C7247B6DBA67EFE46E124 = {
-                       isa = PBXBuildFile;
-                       fileRef = 191330B20DAC08B890656EA0;
-               };
-               D0E26EB54B0087C8BE3D541E = {
-                       isa = PBXBuildFile;
-                       fileRef = 846B2A670C5A19DE0039E11A;
-               };
-               468548FB21D264DC12321327 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4D5F0CA8D1273144681A1D48;
-               };
-               6ECB2F11D2F593FACCCF99DB = {
-                       isa = PBXBuildFile;
-                       fileRef = 0F8C000E5FF4A2DAC1FEF8EB;
-               };
-               95F56FB44C669F93AE77E465 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0CECD562059DFD7FBFB37E3C;
-               };
-               518DD443B6F17A5AFD707263 = {
-                       isa = PBXBuildFile;
-                       fileRef = A69024A225F2AC31F17B1314;
-               };
-               B7EBA1A83575F48CD08140B9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4B083E951ECB62217C46CB01;
-               };
-               3C5267E06A897B0DC0F7EA50 = {
-                       isa = PBXBuildFile;
-                       fileRef = 472F9A90F685220D730EBF6C;
-               };
-               202DC8CF15ACBE096CC327EA = {
-                       isa = PBXBuildFile;
-                       fileRef = 805A3A5FBA3B9E28363DD77B;
-               };
-               5DD883699B85E4C492CAD065 = {
-                       isa = PBXBuildFile;
-                       fileRef = DB9C8E35DF815B803CB4A9CF;
-               };
-               D5C9125F65493CA481F18E53 = {
-                       isa = PBXBuildFile;
-                       fileRef = D766BB9D8C32B5560F0493F3;
-               };
-               02E8F35A8E0D4A0DF6F38D60 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1DE5BBC777FB64798D823002;
-               };
-               234B6BA2952CBC7C61EF70EF = {
-                       isa = PBXBuildFile;
-                       fileRef = 5867DC4E39DF8539B54C0D59;
-               };
-               254A7C08594A152C2C646334 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1B9B5A37F079FE3B3CF8FAB6;
-               };
-               F15F0512666FF8CDC0D08905 = {
-                       isa = PBXBuildFile;
-                       fileRef = 0462692BAA9CD1BE6DFBCC33;
-               };
-               B18248959DDC44EF4E85320A = {
-                       isa = PBXBuildFile;
-                       fileRef = AECE3914F5119A3D586A5635;
-               };
-               00515BA4EC5A7D4DC078ED37 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ValueSourceHelpers.h";
-                       path = "../../Source/Utility/Helpers/jucer_ValueSourceHelpers.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               00841B7EDDE9C19890F03267 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_JucerTreeViewBase.h";
-                       path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               00E6B87A43453B51850550E1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ComponentOverlayComponent.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               016A6C52B0B93DE29197FF64 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_AnimatedComponentTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               01A37DF94E98D991FEF43628 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ButtonHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ButtonHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               023B92AC0340305762412E90 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_OpenGLComponentTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0400CB0E056A1D840304D2DE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_CommandLine.cpp";
-                       path = "../../Source/Application/jucer_CommandLine.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               044478BB994878E35D30154A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_XcodeProjectParser.h";
-                       path = "../../Source/ProjectSaving/jucer_XcodeProjectParser.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0462692BAA9CD1BE6DFBCC33 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0543E83BF7D7D9234C396E82 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentUndoableAction.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               055636565C2F512E40114582 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ViewportHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ViewportHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               05D67B5A8D64947C067C0945 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_GUIApp.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_GUIApp.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0640E34282A97BF73CC8F1EB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentListComponent.h";
-                       path = "../../Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               079802C6AEE7646010766FE8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_AudioPluginFilterTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               087CB3A961CD3C7434D660A4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewProjectWizard.h";
-                       path = "../../Source/Wizards/jucer_NewProjectWizard.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               09DE066936CF037E9709ADB1 = {
-                       isa = PBXFileReference;
-                       explicitFileType = wrapper.application;
-                       includeInIndex = 0;
-                       path = Projucer.app;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               0AE75B0ACD368A4C0FBC2CD0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TabbedComponentHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0B24F292A357ABFD9BCC6D7F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = gradlew;
-                       path = ../../Source/BinaryData/gradle/gradlew;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0CECD562059DFD7FBFB37E3C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_SlidingPanelComponent.cpp";
-                       path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0D4D508C638BC74943B9976D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_AutoUpdater.cpp";
-                       path = "../../Source/Application/jucer_AutoUpdater.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0EE17BE4154CF1B2EE683894 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ResourceEditorPanel.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0F01067432AC314EAC213C1C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_Blank.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_Blank.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               0F8C000E5FF4A2DAC1FEF8EB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ProjucerLookAndFeel.cpp";
-                       path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               11DC04468BC6023671017EBF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewFileWizard.h";
-                       path = "../../Source/Wizards/jucer_NewFileWizard.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               11DEED05110D3D1D02FCFFB6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentTypeHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               124232706D1C8A3CA49E70CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PIPCreatorWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_PIPCreatorWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               129F2DE0FEF154F8F8C7A74E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.jar;
-                       name = "gradle-wrapper.jar";
-                       path = "../../Source/BinaryData/gradle/gradle-wrapper.jar";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               133F1E428260C5ADDF496DF9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ComponentLayout.cpp";
-                       path = "../../Source/ComponentEditor/jucer_ComponentLayout.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               159DE1FEE2099398983CDDF0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ErrorList.h";
-                       path = "../../Source/LiveBuildEngine/jucer_ErrorList.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               16751E04B0F3737BDF52CEB4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_HeaderComponent.h";
-                       path = "../../Source/Project/UI/jucer_HeaderComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               169DD91232C070C4D6470B31 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_IconButton.h";
-                       path = "../../Source/Utility/UI/jucer_IconButton.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               182CB1F96890620A202C6524 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_SourceCodeRange.h";
-                       path = "../../Source/LiveBuildEngine/jucer_SourceCodeRange.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               191330B20DAC08B890656EA0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PIPGenerator.cpp";
-                       path = "../../Source/Utility/PIPs/jucer_PIPGenerator.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               194457D806A26E793584AC0C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "huckleberry_icon.svg";
-                       path = "../../Source/BinaryData/Icons/huckleberry_icon.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1B0F18E1D96F727C062B05FA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ProjectContentComponent.cpp";
-                       path = "../../Source/Project/UI/jucer_ProjectContentComponent.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1B5BCD4899A9E295786EB642 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_OpenDocumentManager.h";
-                       path = "../../Source/CodeEditor/jucer_OpenDocumentManager.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1B9B5A37F079FE3B3CF8FAB6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1C80C7672975C1FF9AAC4A4F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectTab.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_ProjectTab.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1DCA18E935A35D29D2D9B6A0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ComponentDocument.cpp";
-                       path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1DE5BBC777FB64798D823002 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               20075A86A4D0E8A5B973D9DB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExport_Xcode.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExport_Xcode.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               203FA6AD7EDDF1F9C338CC2A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_AudioComponentTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2072D6BAE744B53B6FBBDDD8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_AudioPlugin.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_AudioPlugin.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               210CD22F25F2C22F9CEEB025 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               21F4833C5B5C17B159B956F3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               23A8DE16C0CDB8EED18B008B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CommandIDs.h";
-                       path = "../../Source/Application/jucer_CommandIDs.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               23D79A22569BEDF63B57DD36 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CodeHelpers.h";
-                       path = "../../Source/Utility/Helpers/jucer_CodeHelpers.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               245C81599FB53865A74FC65B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ActivityList.h";
-                       path = "../../Source/LiveBuildEngine/jucer_ActivityList.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               24EB4C2412821B8019D6F754 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_TestComponent.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_TestComponent.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               25BE1265FE6C6EA3473A3A0A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ResourceFile.h";
-                       path = "../../Source/ProjectSaving/jucer_ResourceFile.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               269A454F1FF081DA67FFD578 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_JucerDocument.cpp";
-                       path = "../../Source/ComponentEditor/jucer_JucerDocument.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               28D0199327887FFABF9C3F20 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_UserSettingsPopup.h";
-                       path = "../../Source/Utility/UI/jucer_UserSettingsPopup.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2BD9B4556479A8A41740BCAE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2CD34A70B4032C0426F7AA10 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_MainWindow.h";
-                       path = "../../Source/Application/jucer_MainWindow.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2DF5A61F3C497537634773DF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ActivityListComponent.h";
-                       path = "../../Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2EEB1C074162F363C6599282 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CommandLine.h";
-                       path = "../../Source/Application/jucer_CommandLine.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2F373F97E30AC1A0BFC1FC61 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FilePropertyComponent.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               308084CBEE9F7D405D72A5E1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CompileEngineClient.h";
-                       path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               32C4B61AD995877956B7FA66 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_InlineComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_InlineComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               32ECBC08D903418CA0825870 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ContentViewComponents.h";
-                       path = "../../Source/Project/UI/jucer_ContentViewComponents.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               332AF94C3275FEA8B878D603 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_SourceCodeEditor.cpp";
-                       path = "../../Source/CodeEditor/jucer_SourceCodeEditor.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               33B258726F29360D64FD1451 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_JucerComponentHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_JucerComponentHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               351AF80A004D766E314AB76D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_JucerDocumentEditor.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               355379844A5E6A097038C280 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementRectangle.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               35CAE8930F2885F9322D22D5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ItemPreviewComponent.h";
-                       path = "../../Source/CodeEditor/jucer_ItemPreviewComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               35CFCC15CBA46F4513940A2A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TextButtonHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_TextButtonHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               364D1A9B113320407A7E57B9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               36E5FBF64A89D5F2A266A5A7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementUndoableAction.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               39597BD78897CB711AFA945A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_EditingPanelBase.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3BBFA655E129C2D817EA47C9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ErrorListComponent.h";
-                       path = "../../Source/LiveBuildEngine/UI/jucer_ErrorListComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3C95FA2AA91EBA19ADDD5C29 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_Animated.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_Animated.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D36F0CEB84B27BD02FC461A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LabelPropertyComponent.h";
-                       path = "../../Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D6FD9C0065BF16568EC0AB7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_SlidingPanelComponent.h";
-                       path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3DC2ED15A9DFAAEF3D2ACDDF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PIPMain.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_PIPMain.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3EA27F52A254912218F4DE94 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectBuildInfo.h";
-                       path = "../../Source/LiveBuildEngine/jucer_ProjectBuildInfo.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3F7C5B53347A487C7FBD2223 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_OpenGLComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3F8EC008960DBEB2A5D3C3F4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_Headers.h";
-                       path = "../../Source/Application/jucer_Headers.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3F9D4C7F6E5779D4E4AE655D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentLayout.h";
-                       path = "../../Source/ComponentEditor/jucer_ComponentLayout.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4073A12E196BDDADE211E19F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.txt;
-                       name = "projucer_EULA.txt";
-                       path = "../../Source/BinaryData/projucer_EULA.txt";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               409C636B96A9AC1D732B96F8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComboBoxHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ComboBoxHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               41105E536155E394E54BDD35 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.xml;
-                       name = "colourscheme_dark.xml";
-                       path = "../../Source/BinaryData/colourscheme_dark.xml";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               42F4AA3EF0883D506987CA99 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "export_codeBlocks.svg";
-                       path = "../../Source/BinaryData/Icons/export_codeBlocks.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               431D30038CBF67F80E8B3A13 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGL.framework;
-                       path = System/Library/Frameworks/OpenGL.framework;
-                       sourceTree = SDKROOT;
-               };
-               432EC251A122071809471804 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "juce-logo-with-text.svg";
-                       path = "../../Source/BinaryData/Icons/juce-logo-with-text.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               471C7B0A8B92320AF0C80839 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_StaticLibrary.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_StaticLibrary.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               472F9A90F685220D730EBF6C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = BinaryData.cpp;
-                       path = ../../JuceLibraryCode/BinaryData.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4818A05DE44ADA03D85E1083 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjucerAnalytics.h";
-                       path = "../../Source/Application/jucer_ProjucerAnalytics.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               486E8D02DAD2A0BF54A901C0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_MiscUtilities.cpp";
-                       path = "../../Source/Utility/Helpers/jucer_MiscUtilities.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4974E7808F9B57E9A627F878 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FileTreeItems.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_FileTreeItems.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4A4EBDAD8D098F72CE053235 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_AudioPlugin.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_AudioPlugin.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4AE469CD40BDAD634135785E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElement.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4AE72953E3B3DF06D3B9BA86 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintElementPath.cpp";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4B083E951ECB62217C46CB01 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_NewProjectWizardClasses.cpp";
-                       path = "../../Source/Wizards/jucer_NewProjectWizardClasses.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4D5F0CA8D1273144681A1D48 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_JucerTreeViewBase.cpp";
-                       path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4D698BF12BCD6B0896BCDF17 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AutoUpdater.h";
-                       path = "../../Source/Application/jucer_AutoUpdater.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4E671236FDBD5AD4699740C6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_JucerCommandIDs.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_JucerCommandIDs.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4ECF029E3A69BF42FED1503D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PIPAudioProcessorTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4F687965FBE86EAFDB3ACFEC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = BinaryData.h;
-                       path = ../../JuceLibraryCode/BinaryData.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4FF81FC167C924C47BD8C1C9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ProjectSaver.cpp";
-                       path = "../../Source/ProjectSaving/jucer_ProjectSaver.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               50498FF6EA3901CBD58223B3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ObjectTypes.h";
-                       path = "../../Source/ComponentEditor/jucer_ObjectTypes.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               512D80BE12634967A085A1DC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintElement.cpp";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               514F2FAFDBF535AC03FA2E6C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "background_logo.svg";
-                       path = "../../Source/BinaryData/Icons/background_logo.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               516D6D7C564DD5DF5C15CB06 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_HeaderComponent.cpp";
-                       path = "../../Source/Project/UI/jucer_HeaderComponent.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               51BC758EF5D33197CF543E67 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_DocumentEditorComponent.h";
-                       path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               51CBE59779A36D1B80B26974 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_LicenseController.cpp";
-                       path = "../../Source/Licenses/jucer_LicenseController.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5432B7B9B2CF2EAEC8B66D5C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_UtilityFunctions.h";
-                       path = "../../Source/ComponentEditor/jucer_UtilityFunctions.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5524B5C9FC6AEAA670B92AA9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentLayoutEditor.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               55DEDCEB35AA1FB54C74B375 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_MessageIDs.h";
-                       path = "../../Source/LiveBuildEngine/jucer_MessageIDs.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               56177921580A4855917E0205 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AudioPluginEditorTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               56749E4C72A8F51ACA8F2330 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "export_clion.svg";
-                       path = "../../Source/BinaryData/Icons/export_clion.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               576A92E1E0D8F453EC0FEB34 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.bat;
-                       name = gradlew.bat;
-                       path = ../../Source/BinaryData/gradle/gradlew.bat;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5783563E39E48ADFC68EB84A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentTextProperty.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               58139D8D454051C59E77609B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = ../../Source/BinaryData/RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5867DC4E39DF8539B54C0D59 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               58DE91CE6B05AFBACADDB251 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_analytics";
-                       path = "../../../../modules/juce_analytics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               58F1FF52E887887A93E84FC2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PresetIDs.h";
-                       path = "../../Source/Utility/Helpers/jucer_PresetIDs.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               59203884BC48D3B7F8DEABA8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ContentCompTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               59520B8137E6A2E483074399 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExport_Make.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExport_Make.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               59B08C7B13B8EA5137ACA77A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.txt;
-                       name = nothingtoseehere.txt;
-                       path = ../../Source/BinaryData/nothingtoseehere.txt;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               59F8A47C0020D62C8836A1E7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PropertyComponentsWithEnablement.h";
-                       path = "../../Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5A75806B34E4EA6598A6024A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               5B3532C5F103DAC87B4A5675 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_GUI.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_GUI.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5BF0374EB908F0476BD8ED42 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AudioComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5E4EB84A7983AB31366A3490 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ModuleTreeItems.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5F6584B675E30761521A9F42 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.xml;
-                       name = "colourscheme_light.xml";
-                       path = "../../Source/BinaryData/colourscheme_light.xml";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               62922B3C0620368D1799A653 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_OpenGL.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_OpenGL.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               630DC5EAA31D3EE60B2D989F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_GenericComponentHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_GenericComponentHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6574A50A8997799705B23465 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_AudioPluginEditorTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               65FAD7F6DF65A72B741C2913 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintRoutinePanel.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6678E9B3EEACAD47F438B264 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               66B49F08C5EC3E4974825FF8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintRoutine.h";
-                       path = "../../Source/ComponentEditor/jucer_PaintRoutine.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               68C1949F56295D5871C1F223 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LiveBuildTab.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_LiveBuildTab.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               68F41A216E7454E7442AB1F4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TreeItemTypes.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_TreeItemTypes.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               69555CEFC6ED613AA3949298 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               69B478C992FA0B8C885946A6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "export_linux.svg";
-                       path = "../../Source/BinaryData/Icons/export_linux.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6AC88EFC247C225CC5C11A43 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_BinaryResources.h";
-                       path = "../../Source/ComponentEditor/jucer_BinaryResources.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6E6140969908E7619F858740 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CommonHeaders.h";
-                       path = "../../Source/Application/jucer_CommonHeaders.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6E70C1FA80F02D4C310F63AA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintRoutineEditor.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6F02C3B7FEA3B50692A70DE5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_EditingPanelBase.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               6FD8DBC0FF42C87D8BEE2452 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TranslationHelpers.h";
-                       path = "../../Source/Utility/Helpers/jucer_TranslationHelpers.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7031E8CB6D4D84BD980A0BD0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementImage.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               705DE88C5C4CC6C871E951B1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_GroupComponentHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_GroupComponentHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               714267352CE5C4357ADBC231 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_StartPageComponent.h";
-                       path = "../../Source/Wizards/jucer_StartPageComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               719B56C8587863D7AE9B69C6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_RelativePositionedRectangle.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7211101FFA28400ADBB1D47A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_Module.h";
-                       path = "../../Source/Project/jucer_Module.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               728FE25157E9874D50BBECB2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               72ED72174F9DBD0ABD8AFCED = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintElementImage.cpp";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               73DE14CEAD25D3445457013E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_SliderHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_SliderHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               75BE2887C6F324B818D80A21 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_SnapGridPainter.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_SnapGridPainter.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               763A63E75AC802F17D11FE8B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.cs;
-                       name = "jucer_UnityPluginGUIScript.cs";
-                       path = "../../Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7687A1374C60A025BDBE98DE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PointComponent.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PointComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               77EA01E7D04BF889930BFF54 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementRoundedRectangle.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               78D0DBC4798FF040FDB90F6D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_GeneratedCode.cpp";
-                       path = "../../Source/ComponentEditor/jucer_GeneratedCode.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               790F6302B9A0620F23F8A6C1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LicenseThread.h";
-                       path = "../../Source/Licenses/jucer_LicenseThread.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7AB7640968FAAC73072FBD10 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7B3F7ECF6DBF8C8EE5C2CB86 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioUnit.framework;
-                       path = System/Library/Frameworks/AudioUnit.framework;
-                       sourceTree = SDKROOT;
-               };
-               7CA44FF0BA319517C6E39651 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_Application.cpp";
-                       path = "../../Source/Application/jucer_Application.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7E2013F425E231C6D865DDD0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentChoiceProperty.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7F0A5319912991615FC57945 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ColourPropertyComponent.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               805A3A5FBA3B9E28363DD77B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_analytics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_analytics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               807049CA2D5B6DE18EA078F2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "export_android.svg";
-                       path = "../../Source/BinaryData/Icons/export_android.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               80D62B907248523E6943298B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               8336A43CE1C3C26D7C7B53D8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_NewComponentTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               842427CFE565F3FCE5B99174 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = DiscRecording.framework;
-                       path = System/Library/Frameworks/DiscRecording.framework;
-                       sourceTree = SDKROOT;
-               };
-               846B2A670C5A19DE0039E11A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_Icons.cpp";
-                       path = "../../Source/Utility/UI/jucer_Icons.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               85A5E3E71BED93B9A3E07681 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PositionPropertyBase.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               861E52D9AFECADF079BB1F2C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ExporterTreeItems.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               868B459E02F0877EBE3D56F1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TextEditorHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_TextEditorHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8702F43110E4CCA5E5F827F5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8A82061A978B03745485C3AC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LiveBuildCodeEditor.h";
-                       path = "../../Source/CodeEditor/jucer_LiveBuildCodeEditor.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8A825FDDC00DD253F44D2C3A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_AudioApp.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_AudioApp.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8BD8E9DA627D6EF9BA10FB9E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewProjectWizardComponent.h";
-                       path = "../../Source/Wizards/jucer_NewProjectWizardComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8C281F2F8EA3AD614ADF7955 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.html;
-                       name = offlinepage.html;
-                       path = ../../Source/BinaryData/offlinepage.html;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8C52A3DDA62A746AA7A68535 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_Main.cpp";
-                       path = "../../Source/Application/jucer_Main.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8D178CAEE6D89DE33233313F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ElementSiblingComponent.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8D9A9A373E4621F7CBFCCCEF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ContentCompTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8DBB36126CD144A8364F1F19 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExporter.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExporter.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8DFE6D8AFB8057790041300B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ToggleButtonHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8F30A53C7FE4BC65171FB3E2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_JucerDocument.h";
-                       path = "../../Source/ComponentEditor/jucer_JucerDocument.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8F4D281E98808204E2846A7D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "export_xcode.svg";
-                       path = "../../Source/BinaryData/Icons/export_xcode.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8F67F3C0492EAFEBDBBC12DB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_NewCppFileTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8F685EFEFD6EE399058DE842 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_DownloadCompileEngineThread.h";
-                       path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8F731F1F98BAB42F1C3B96AA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ComponentTypeHandler.cpp";
-                       path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8F7BE18698ADCEF51CDE4A5C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               8FEF6F5EA676B824C021EB6F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_AnimatedApp.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_AnimatedApp.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8FF26BF72A522FBEAAFDDF54 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_AudioApp.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_AudioApp.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9069981E414A631B036CC9AC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_MainWindow.cpp";
-                       path = "../../Source/Application/jucer_MainWindow.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               92926A4D3CC4BB2A9D35EB0B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_UTF8WindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_UTF8WindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               92A66A8BD87F98EB6B4FB6D0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectContentComponent.h";
-                       path = "../../Source/Project/UI/jucer_ProjectContentComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               951128CA33CCDEF570436B1C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.icns;
-                       name = Icon.icns;
-                       path = Icon.icns;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               95EAB6EC9B724538B93910D4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TabComponents.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_TabComponents.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               97A847B59EE04483E8850E4B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_MainTemplate_SimpleWindow.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               983CFBA01CA8811F30FA7F4C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_MiscUtilities.h";
-                       path = "../../Source/Utility/Helpers/jucer_MiscUtilities.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               988F5C1E40DED02D8B064253 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintElementGroup.cpp";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               98E6D61BFF7D85F0E00F0FBF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LicenseWebview.h";
-                       path = "../../Source/Licenses/jucer_LicenseWebview.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9914F905BFCFBE5F76619670 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ColouredElement.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               996E472B82A75531875A5E38 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = LICENSE;
-                       path = ../../Source/BinaryData/gradle/LICENSE;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9992E6950C64322A11E39ADF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_DLL.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_DLL.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9A3B8BBDA8E144A3DF6B9349 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AnimatedComponentSimpleTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9B6FD3FEDB6D91AD0A80EF97 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ImageResourceProperty.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9BDF2D6255C1CB2CFF376186 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentOverlayComponent.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9D7689451732AF8333402B3A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ObjectTypes.cpp";
-                       path = "../../Source/ComponentEditor/jucer_ObjectTypes.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E0BA495286388EBF929D578 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ContentCompSimpleTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E2B1506AC3FDB7863766D59 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewInlineComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9E62EC342665C27BA01AFC1A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentNameProperty.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ComponentNameProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EB33734D0DBD0370AB1247B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ColourPropertyComponent.h";
-                       path = "../../Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EE3141E20C9CE3EA182FA04 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectSaver.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectSaver.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9EF583A6201DBC813C2F63C4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_BinaryResources.cpp";
-                       path = "../../Source/ComponentEditor/jucer_BinaryResources.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9F01BA9942D038EA8B5289A8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QTKit.framework;
-                       path = System/Library/Frameworks/QTKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               9F2D3E5FC10F7C3270908E97 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ButtonDocument.h";
-                       path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               9F959ECF8CD9B7314AE604A9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LabelHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_LabelHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A081306A9E95CA114B81910F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CompileEngineSettings.h";
-                       path = "../../Source/LiveBuildEngine/jucer_CompileEngineSettings.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A085174413736ACC8D7D42A2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_openGL.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_openGL.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A0BBBFBA13A1308B3CD725D5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentLayoutPanel.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A160AEF56553A658E6EA6A8E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_MainTemplate_Window.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A22F64D1E4BD4B8FA366DAAD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TreeViewHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_TreeViewHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A44A774EFC020D3D046A9249 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectWizard_Console.h";
-                       path = "../../Source/Wizards/jucer_ProjectWizard_Console.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A49503B646A7BD2BEEFC5CBD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_HyperlinkButtonHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A509BC22854D50E4C786EB32 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FileGroupInformationComponent.h";
-                       path = "../../Source/Project/UI/jucer_FileGroupInformationComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A66F17E7472E5C19AFE98E46 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_MainConsoleAppTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A69024A225F2AC31F17B1314 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_NewFileWizard.cpp";
-                       path = "../../Source/Wizards/jucer_NewFileWizard.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A6C4AE13FB409DE414094CFA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_RelativePath.h";
-                       path = "../../Source/Utility/Helpers/jucer_RelativePath.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A978DFE87D9BB5EFE5B3DAAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CompileEngineDLL.h";
-                       path = "../../Source/LiveBuildEngine/jucer_CompileEngineDLL.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A9954DC7F876A7006743ACB6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_DiagnosticMessage.h";
-                       path = "../../Source/LiveBuildEngine/jucer_DiagnosticMessage.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AA1C44E89D792DDC4867B2C8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               ADA538034910F52FDD2DC88D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_DownloadCompileEngineThread.cpp";
-                       path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               ADD6A3CF5D7DE55E57E8E38B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CppHelpers.h";
-                       path = "../../Source/LiveBuildEngine/jucer_CppHelpers.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AECE3914F5119A3D586A5635 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AEFE3BA0C31EC78A5767A10E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_DLL.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_DLL.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B1C2F8ED14BF914CD1882708 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_Openfile.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_Openfile.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B24E3F34C3C4EE54A60C35CC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LiveCodeBuilderDLL.h";
-                       path = "../../Source/LiveBuildEngine/jucer_LiveCodeBuilderDLL.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B2CB95B3F44C3CC5735051A3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_JustificationProperty.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_JustificationProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B3528C08B84CBC950252EA69 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ModulesInformationComponent.h";
-                       path = "../../Source/Project/UI/jucer_ModulesInformationComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B403AF75EAF361ED74EE476E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_FileHelpers.cpp";
-                       path = "../../Source/Utility/Helpers/jucer_FileHelpers.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B6496F16ACE80CACC5721570 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ProjucerAnalytics.cpp";
-                       path = "../../Source/Application/jucer_ProjucerAnalytics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B6F2905330EA5C560D527209 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B8385E9A644BD3CD94876448 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectType.h";
-                       path = "../../Source/Project/jucer_ProjectType.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B83C9BD89F31EA9E5E12A3C6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = image.png;
-                       name = "juce_icon.png";
-                       path = "../../Source/BinaryData/Icons/juce_icon.png";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B83DAADA1A871F21582FFB23 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ApplicationUsageDataWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B97D60D2531CFD0D8555BA5C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementText.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementText.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B9B130F596953116393138DC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_SourceCodeEditor.h";
-                       path = "../../Source/CodeEditor/jucer_SourceCodeEditor.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BA159A3B7D129771F5C15EA3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BA186B51EE4884CD8E3F2741 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_CompileEngineServer.h";
-                       path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BAC43B20E14A340CCF14119C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_Project.cpp";
-                       path = "../../Source/Project/jucer_Project.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BB187CD608EB6368B29EC335 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_LicenseController.h";
-                       path = "../../Source/Licenses/jucer_LicenseController.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BC3B310D42C489E8B8D93327 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_DocumentEditorComponent.cpp";
-                       path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BC623CC67AC58297BF6B4C70 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TestComponent.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_TestComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BCB6C87E3992930674E54D16 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementGroup.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BDF6AFC5F88581AE395F1DC9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ResourceEditorPanel.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BE618CE21C794BDEE319E328 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_AppearanceSettings.cpp";
-                       path = "../../Source/Settings/jucer_AppearanceSettings.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BF301C2E545AEB4AC112C176 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ButtonDocument.cpp";
-                       path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BF3CEF080FA013E2778DCE90 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_Project.h";
-                       path = "../../Source/Project/jucer_Project.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C09BBB58CA45B66D693E8C31 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TemplateThumbnailsComponent.h";
-                       path = "../../Source/Wizards/jucer_TemplateThumbnailsComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C187718F7B9EBA88584B43F3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintRoutine.cpp";
-                       path = "../../Source/ComponentEditor/jucer_PaintRoutine.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C2990A8D054BC230E7C637C3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewProjectWizardClasses.h";
-                       path = "../../Source/Wizards/jucer_NewProjectWizardClasses.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C3BB9F92B02B06D04A73794C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ProjectExporter.cpp";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExporter.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C3E04CD5A93A45154894E624 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_Colours.h";
-                       path = "../../Source/Utility/Helpers/jucer_Colours.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C402C21DFAC1F8BF121144F1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FillType.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_FillType.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C59E624F099CC785F27429EB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_Icons.h";
-                       path = "../../Source/Utility/UI/jucer_Icons.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C607639897ED2538CBB860D0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_OpenGLComponentSimpleTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C7245390C6C44E89F7526CFC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C736264708F3F68BA745BA29 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FloatingToolWindow.h";
-                       path = "../../Source/Application/Windows/jucer_FloatingToolWindow.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C76271530EB4458B6146D463 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PIPGenerator.h";
-                       path = "../../Source/Utility/PIPs/jucer_PIPGenerator.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CC1C5F8E5DE34223FEC59673 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AudioPluginFilterTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CCD62DB0A19A985A4B9D7F32 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExport_Android.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExport_Android.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CCEA34A55813C7C4E58254F5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_BuildTabStatusComponent.h";
-                       path = "../../Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               CF6C8BD0DA3D8CD4E99EBADA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = WebKit.framework;
-                       path = System/Library/Frameworks/WebKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               D00F311BFC3C2625C457CB9B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Carbon.framework;
-                       path = System/Library/Frameworks/Carbon.framework;
-                       sourceTree = SDKROOT;
-               };
-               D045BD5943BD38F2720FF5F0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FontPropertyComponent.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D05BD91B6105827B010E1C20 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D1739728A79A2062418B8EF0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_StaticLibrary.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_StaticLibrary.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D1F9B0E9F5D54FE48BEB46EA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               D251114072E67CA86D9913D6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ClassDatabase.h";
-                       path = "../../Source/LiveBuildEngine/jucer_ClassDatabase.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D2FE76E4CF003856278343CC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_CompileEngineServer.cpp";
-                       path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D4EB334E5186D1584EC63CA4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AudioComponentSimpleTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D5795F8CAC5876714DAB355F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AnimatedComponentTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D5EF5961B1F0E3FAED32E30A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExport_CLion.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExport_CLion.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D6390A40B3279E0E626C78D3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ColouredElement.cpp";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D766BB9D8C32B5560F0493F3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D91E7F8FEF9290195D56782C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_EditorColourSchemeWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D93E2F2468003DD333371F06 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_StrokeType.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_StrokeType.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DA345D5B9DABD049F90DC96F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_GeneratedCode.h";
-                       path = "../../Source/ComponentEditor/jucer_GeneratedCode.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DA4D0CC5149F7C0FBDAF34A2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementPath.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DB9C8E35DF815B803CB4A9CF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DDC382008FFD9F9E0B2B0EDD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_SVGPathDataWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_SVGPathDataWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DE3E6B2614229FAD56D50770 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_CompileEngineClient.cpp";
-                       path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DE4A987B2D5529990A6AA9D4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AboutWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_AboutWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DFBEB8E086832AEB0FBEADF0 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_StoredSettings.h";
-                       path = "../../Source/Settings/jucer_StoredSettings.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E111A336FE13C033EAA0A1D1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_NewCppFileTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E13A54A6D3A1895EACE53E51 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ResourceFile.cpp";
-                       path = "../../Source/ProjectSaving/jucer_ResourceFile.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E1535CDF4258E7D4AB70B5E5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ClientServerMessages.h";
-                       path = "../../Source/LiveBuildEngine/jucer_ClientServerMessages.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E1577F8617C75B91D7399812 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ImageButtonHandler.h";
-                       path = "../../Source/ComponentEditor/Components/jucer_ImageButtonHandler.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E186BC01A1B1529937A46485 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FileHelpers.h";
-                       path = "../../Source/Utility/Helpers/jucer_FileHelpers.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E266DE67FF319D56F63193A6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = text.plist.xml;
-                       name = "Info-App.plist";
-                       path = "Info-App.plist";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E2B668E2A65AEE8F07B406C8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_AppearanceSettings.h";
-                       path = "../../Source/Settings/jucer_AppearanceSettings.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E367FC2BDAF5EBA48D767FBB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_FilePathPropertyComponent.h";
-                       path = "../../Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E3BADF21095BC23DE2CB454F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectTreeItemBase.h";
-                       path = "../../Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E468FDB5504C5D9315B2D04F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentDocument.h";
-                       path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E5D6C36496F5BC84D7213BE8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               E67999BF57B139E00207A374 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PIPTemplate.h";
-                       path = "../../Source/BinaryData/Templates/jucer_PIPTemplate.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               E96597BBC6A98255B51B94DC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               E983E6DDE3318B872EBE347F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudioKit.framework;
-                       path = System/Library/Frameworks/CoreAudioKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               EAC1731150A7F79D59BAA0B6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "export_visualStudio.svg";
-                       path = "../../Source/BinaryData/Icons/export_visualStudio.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EB2E723DC3DB150A8A644D08 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_GlobalPathsWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_GlobalPathsWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               ED5EAC91D8A0A1911BE9F482 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_ConsoleApp.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_ConsoleApp.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               ED69863B3D591FB3F0CA50E4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintRoutineEditor.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EE690110171E1648FF2118B8 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_Application.h";
-                       path = "../../Source/Application/jucer_Application.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EF25A29A2194FC107B40F65F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ComponentLayoutEditor.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EFF38AE74E7267CCC47E8AD1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_JucerDocumentEditor.h";
-                       path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F073B54B36D845915CD6D2C1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_PaintElementEllipse.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F159C1B99ACF1D91E12D978E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_MainTemplate_NoWindow.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F2E4998FB2C7221587A79F8B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_CodeHelpers.cpp";
-                       path = "../../Source/Utility/Helpers/jucer_CodeHelpers.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F3CC8F26ECCDA6DCD8A284D2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_GradientPointComponent.h";
-                       path = "../../Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F4FD9BD16ED2700F45A68C4F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentBooleanProperty.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F5DD97B45B8EA60C1ED0DD80 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_StoredSettings.cpp";
-                       path = "../../Source/Settings/jucer_StoredSettings.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F797071D88542C813CF7222A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_Module.cpp";
-                       path = "../../Source/Project/jucer_Module.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F7C74E934C954F6F1A3BE4F9 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_TranslationToolWindowComponent.h";
-                       path = "../../Source/Application/Windows/jucer_TranslationToolWindowComponent.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F8A38C0C7C45F2DB6A5FB812 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.svg;
-                       name = "wizard_Highlight.svg";
-                       path = "../../Source/BinaryData/Icons/wizard_Highlight.svg";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F9111E150CFF155329D44853 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_OpenDocumentManager.cpp";
-                       path = "../../Source/CodeEditor/jucer_OpenDocumentManager.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FA790C59A304579F660F112F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExport_CodeBlocks.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FB80347407261BF6CCEFDE91 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_ComponentTemplate.cpp";
-                       path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FCEBE24EA79A13713D7CBF26 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ComponentColourProperty.h";
-                       path = "../../Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FE20FE5805A02A4843048200 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjucerLookAndFeel.h";
-                       path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FF68231DE2B395461009116C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = "jucer_ProjectExport_MSVC.h";
-                       path = "../../Source/ProjectSaving/jucer_ProjectExport_MSVC.h";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               FFE01768CF1C8DBDAA894F76 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "jucer_PaintRoutinePanel.cpp";
-                       path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EB1D55A76652399EB81CC1F0 = {
-                       isa = PBXGroup;
-                       children = (
-                               DE4A987B2D5529990A6AA9D4,
-                               B83DAADA1A871F21582FFB23,
-                               D91E7F8FEF9290195D56782C,
-                               C736264708F3F68BA745BA29,
-                               EB2E723DC3DB150A8A644D08,
-                               124232706D1C8A3CA49E70CD,
-                               DDC382008FFD9F9E0B2B0EDD,
-                               F7C74E934C954F6F1A3BE4F9,
-                               92926A4D3CC4BB2A9D35EB0B,
-                       );
-                       name = Windows;
-                       sourceTree = "<group>";
-               };
-               BC67FD952A6F210A11A1ECB8 = {
-                       isa = PBXGroup;
-                       children = (
-                               EB1D55A76652399EB81CC1F0,
-                               7CA44FF0BA319517C6E39651,
-                               EE690110171E1648FF2118B8,
-                               0D4D508C638BC74943B9976D,
-                               4D698BF12BCD6B0896BCDF17,
-                               23A8DE16C0CDB8EED18B008B,
-                               0400CB0E056A1D840304D2DE,
-                               2EEB1C074162F363C6599282,
-                               6E6140969908E7619F858740,
-                               3F8EC008960DBEB2A5D3C3F4,
-                               8C52A3DDA62A746AA7A68535,
-                               9069981E414A631B036CC9AC,
-                               2CD34A70B4032C0426F7AA10,
-                               B6496F16ACE80CACC5721570,
-                               4818A05DE44ADA03D85E1083,
-                       );
-                       name = Application;
-                       sourceTree = "<group>";
-               };
-               8CF70DA9AB4725126B9F55BE = {
-                       isa = PBXGroup;
-                       children = (
-                               129F2DE0FEF154F8F8C7A74E,
-                               0B24F292A357ABFD9BCC6D7F,
-                               576A92E1E0D8F453EC0FEB34,
-                               996E472B82A75531875A5E38,
-                       );
-                       name = gradle;
-                       sourceTree = "<group>";
-               };
-               F0F189518721D46C0F94FD56 = {
-                       isa = PBXGroup;
-                       children = (
-                               514F2FAFDBF535AC03FA2E6C,
-                               807049CA2D5B6DE18EA078F2,
-                               56749E4C72A8F51ACA8F2330,
-                               42F4AA3EF0883D506987CA99,
-                               69B478C992FA0B8C885946A6,
-                               EAC1731150A7F79D59BAA0B6,
-                               8F4D281E98808204E2846A7D,
-                               194457D806A26E793584AC0C,
-                               432EC251A122071809471804,
-                               B83C9BD89F31EA9E5E12A3C6,
-                               8FEF6F5EA676B824C021EB6F,
-                               8FF26BF72A522FBEAAFDDF54,
-                               2072D6BAE744B53B6FBBDDD8,
-                               ED5EAC91D8A0A1911BE9F482,
-                               AEFE3BA0C31EC78A5767A10E,
-                               5B3532C5F103DAC87B4A5675,
-                               F8A38C0C7C45F2DB6A5FB812,
-                               B1C2F8ED14BF914CD1882708,
-                               62922B3C0620368D1799A653,
-                               D1739728A79A2062418B8EF0,
-                       );
-                       name = Icons;
-                       sourceTree = "<group>";
-               };
-               E59ABA0D11CBAAD77179E9C6 = {
-                       isa = PBXGroup;
-                       children = (
-                               9A3B8BBDA8E144A3DF6B9349,
-                               016A6C52B0B93DE29197FF64,
-                               D5795F8CAC5876714DAB355F,
-                               D4EB334E5186D1584EC63CA4,
-                               203FA6AD7EDDF1F9C338CC2A,
-                               5BF0374EB908F0476BD8ED42,
-                               6574A50A8997799705B23465,
-                               56177921580A4855917E0205,
-                               079802C6AEE7646010766FE8,
-                               CC1C5F8E5DE34223FEC59673,
-                               FB80347407261BF6CCEFDE91,
-                               2BD9B4556479A8A41740BCAE,
-                               9E0BA495286388EBF929D578,
-                               8D9A9A373E4621F7CBFCCCEF,
-                               59203884BC48D3B7F8DEABA8,
-                               32C4B61AD995877956B7FA66,
-                               A66F17E7472E5C19AFE98E46,
-                               F159C1B99ACF1D91E12D978E,
-                               97A847B59EE04483E8850E4B,
-                               A160AEF56553A658E6EA6A8E,
-                               8336A43CE1C3C26D7C7B53D8,
-                               C7245390C6C44E89F7526CFC,
-                               8F67F3C0492EAFEBDBBC12DB,
-                               E111A336FE13C033EAA0A1D1,
-                               9E2B1506AC3FDB7863766D59,
-                               C607639897ED2538CBB860D0,
-                               023B92AC0340305762412E90,
-                               3F7C5B53347A487C7FBD2223,
-                               4ECF029E3A69BF42FED1503D,
-                               3DC2ED15A9DFAAEF3D2ACDDF,
-                               E67999BF57B139E00207A374,
-                               763A63E75AC802F17D11FE8B,
-                       );
-                       name = Templates;
-                       sourceTree = "<group>";
-               };
-               A9399733CAA07BDAB958242C = {
-                       isa = PBXGroup;
-                       children = (
-                               8CF70DA9AB4725126B9F55BE,
-                               F0F189518721D46C0F94FD56,
-                               E59ABA0D11CBAAD77179E9C6,
-                               41105E536155E394E54BDD35,
-                               5F6584B675E30761521A9F42,
-                               59B08C7B13B8EA5137ACA77A,
-                               8C281F2F8EA3AD614ADF7955,
-                               4073A12E196BDDADE211E19F,
-                               58139D8D454051C59E77609B,
-                       );
-                       name = BinaryData;
-                       sourceTree = "<group>";
-               };
-               F1B44F007A02A0FAE4DC8D79 = {
-                       isa = PBXGroup;
-                       children = (
-                               BC3B310D42C489E8B8D93327,
-                               51BC758EF5D33197CF543E67,
-                               35CAE8930F2885F9322D22D5,
-                               8A82061A978B03745485C3AC,
-                               F9111E150CFF155329D44853,
-                               1B5BCD4899A9E295786EB642,
-                               332AF94C3275FEA8B878D603,
-                               B9B130F596953116393138DC,
-                       );
-                       name = CodeEditor;
-                       sourceTree = "<group>";
-               };
-               2A1D5A24E950E00CDF969502 = {
-                       isa = PBXGroup;
-                       children = (
-                               01A37DF94E98D991FEF43628,
-                               409C636B96A9AC1D732B96F8,
-                               9E62EC342665C27BA01AFC1A,
-                               8F731F1F98BAB42F1C3B96AA,
-                               11DEED05110D3D1D02FCFFB6,
-                               0543E83BF7D7D9234C396E82,
-                               630DC5EAA31D3EE60B2D989F,
-                               705DE88C5C4CC6C871E951B1,
-                               A49503B646A7BD2BEEFC5CBD,
-                               E1577F8617C75B91D7399812,
-                               33B258726F29360D64FD1451,
-                               9F959ECF8CD9B7314AE604A9,
-                               73DE14CEAD25D3445457013E,
-                               0AE75B0ACD368A4C0FBC2CD0,
-                               35CFCC15CBA46F4513940A2A,
-                               868B459E02F0877EBE3D56F1,
-                               8DFE6D8AFB8057790041300B,
-                               A22F64D1E4BD4B8FA366DAAD,
-                               055636565C2F512E40114582,
-                       );
-                       name = Components;
-                       sourceTree = "<group>";
-               };
-               18139A4BCB7C14043C72B9E1 = {
-                       isa = PBXGroup;
-                       children = (
-                               BF301C2E545AEB4AC112C176,
-                               9F2D3E5FC10F7C3270908E97,
-                               1DCA18E935A35D29D2D9B6A0,
-                               E468FDB5504C5D9315B2D04F,
-                       );
-                       name = Documents;
-                       sourceTree = "<group>";
-               };
-               497FD8DD8175790E4885736B = {
-                       isa = PBXGroup;
-                       children = (
-                               D6390A40B3279E0E626C78D3,
-                               9914F905BFCFBE5F76619670,
-                               8D178CAEE6D89DE33233313F,
-                               C402C21DFAC1F8BF121144F1,
-                               F3CC8F26ECCDA6DCD8A284D2,
-                               9B6FD3FEDB6D91AD0A80EF97,
-                               512D80BE12634967A085A1DC,
-                               4AE469CD40BDAD634135785E,
-                               F073B54B36D845915CD6D2C1,
-                               988F5C1E40DED02D8B064253,
-                               BCB6C87E3992930674E54D16,
-                               72ED72174F9DBD0ABD8AFCED,
-                               7031E8CB6D4D84BD980A0BD0,
-                               4AE72953E3B3DF06D3B9BA86,
-                               DA4D0CC5149F7C0FBDAF34A2,
-                               355379844A5E6A097038C280,
-                               77EA01E7D04BF889930BFF54,
-                               B97D60D2531CFD0D8555BA5C,
-                               36E5FBF64A89D5F2A266A5A7,
-                               7687A1374C60A025BDBE98DE,
-                               D93E2F2468003DD333371F06,
-                       );
-                       name = PaintElements;
-                       sourceTree = "<group>";
-               };
-               172E2F5D29A894D0BA9231A9 = {
-                       isa = PBXGroup;
-                       children = (
-                               7F0A5319912991615FC57945,
-                               F4FD9BD16ED2700F45A68C4F,
-                               7E2013F425E231C6D865DDD0,
-                               FCEBE24EA79A13713D7CBF26,
-                               5783563E39E48ADFC68EB84A,
-                               2F373F97E30AC1A0BFC1FC61,
-                               D045BD5943BD38F2720FF5F0,
-                               B2CB95B3F44C3CC5735051A3,
-                               85A5E3E71BED93B9A3E07681,
-                       );
-                       name = Properties;
-                       sourceTree = "<group>";
-               };
-               0565E54C3060E29ED38B65AB = {
-                       isa = PBXGroup;
-                       children = (
-                               EF25A29A2194FC107B40F65F,
-                               5524B5C9FC6AEAA670B92AA9,
-                               A0BBBFBA13A1308B3CD725D5,
-                               00E6B87A43453B51850550E1,
-                               9BDF2D6255C1CB2CFF376186,
-                               6F02C3B7FEA3B50692A70DE5,
-                               39597BD78897CB711AFA945A,
-                               4E671236FDBD5AD4699740C6,
-                               351AF80A004D766E314AB76D,
-                               EFF38AE74E7267CCC47E8AD1,
-                               6E70C1FA80F02D4C310F63AA,
-                               ED69863B3D591FB3F0CA50E4,
-                               FFE01768CF1C8DBDAA894F76,
-                               65FAD7F6DF65A72B741C2913,
-                               719B56C8587863D7AE9B69C6,
-                               0EE17BE4154CF1B2EE683894,
-                               BDF6AFC5F88581AE395F1DC9,
-                               75BE2887C6F324B818D80A21,
-                               24EB4C2412821B8019D6F754,
-                               BC623CC67AC58297BF6B4C70,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               F6BD840F9A06F2DA891E2CB8 = {
-                       isa = PBXGroup;
-                       children = (
-                               2A1D5A24E950E00CDF969502,
-                               18139A4BCB7C14043C72B9E1,
-                               497FD8DD8175790E4885736B,
-                               172E2F5D29A894D0BA9231A9,
-                               0565E54C3060E29ED38B65AB,
-                               9EF583A6201DBC813C2F63C4,
-                               6AC88EFC247C225CC5C11A43,
-                               133F1E428260C5ADDF496DF9,
-                               3F9D4C7F6E5779D4E4AE655D,
-                               78D0DBC4798FF040FDB90F6D,
-                               DA345D5B9DABD049F90DC96F,
-                               269A454F1FF081DA67FFD578,
-                               8F30A53C7FE4BC65171FB3E2,
-                               9D7689451732AF8333402B3A,
-                               50498FF6EA3901CBD58223B3,
-                               C187718F7B9EBA88584B43F3,
-                               66B49F08C5EC3E4974825FF8,
-                               5432B7B9B2CF2EAEC8B66D5C,
-                       );
-                       name = ComponentEditor;
-                       sourceTree = "<group>";
-               };
-               144B649D98AE8316058B8281 = {
-                       isa = PBXGroup;
-                       children = (
-                               51CBE59779A36D1B80B26974,
-                               BB187CD608EB6368B29EC335,
-                               790F6302B9A0620F23F8A6C1,
-                               98E6D61BFF7D85F0E00F0FBF,
-                       );
-                       name = Licenses;
-                       sourceTree = "<group>";
-               };
-               9014CA5F3B8D23E883D6975E = {
-                       isa = PBXGroup;
-                       children = (
-                               2DF5A61F3C497537634773DF,
-                               CCEA34A55813C7C4E58254F5,
-                               0640E34282A97BF73CC8F1EB,
-                               3BBFA655E129C2D817EA47C9,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               20B39D53B7DAAB53C7533532 = {
-                       isa = PBXGroup;
-                       children = (
-                               9014CA5F3B8D23E883D6975E,
-                               245C81599FB53865A74FC65B,
-                               D251114072E67CA86D9913D6,
-                               E1535CDF4258E7D4AB70B5E5,
-                               DE3E6B2614229FAD56D50770,
-                               308084CBEE9F7D405D72A5E1,
-                               A978DFE87D9BB5EFE5B3DAAC,
-                               D2FE76E4CF003856278343CC,
-                               BA186B51EE4884CD8E3F2741,
-                               A081306A9E95CA114B81910F,
-                               ADD6A3CF5D7DE55E57E8E38B,
-                               A9954DC7F876A7006743ACB6,
-                               ADA538034910F52FDD2DC88D,
-                               8F685EFEFD6EE399058DE842,
-                               159DE1FEE2099398983CDDF0,
-                               B24E3F34C3C4EE54A60C35CC,
-                               55DEDCEB35AA1FB54C74B375,
-                               3EA27F52A254912218F4DE94,
-                               182CB1F96890620A202C6524,
-                       );
-                       name = LiveBuildEngine;
-                       sourceTree = "<group>";
-               };
-               236D186F5A6536C59D6E751C = {
-                       isa = PBXGroup;
-                       children = (
-                               861E52D9AFECADF079BB1F2C,
-                               4974E7808F9B57E9A627F878,
-                               68C1949F56295D5871C1F223,
-                               5E4EB84A7983AB31366A3490,
-                               1C80C7672975C1FF9AAC4A4F,
-                               E3BADF21095BC23DE2CB454F,
-                               95EAB6EC9B724538B93910D4,
-                               68F41A216E7454E7442AB1F4,
-                       );
-                       name = Sidebar;
-                       sourceTree = "<group>";
-               };
-               EBC037ECAAC8156B8B19DC69 = {
-                       isa = PBXGroup;
-                       children = (
-                               236D186F5A6536C59D6E751C,
-                               32ECBC08D903418CA0825870,
-                               A509BC22854D50E4C786EB32,
-                               516D6D7C564DD5DF5C15CB06,
-                               16751E04B0F3737BDF52CEB4,
-                               B3528C08B84CBC950252EA69,
-                               1B0F18E1D96F727C062B05FA,
-                               92A66A8BD87F98EB6B4FB6D0,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               89E9055A179B4C2019B4E1AE = {
-                       isa = PBXGroup;
-                       children = (
-                               EBC037ECAAC8156B8B19DC69,
-                               F797071D88542C813CF7222A,
-                               7211101FFA28400ADBB1D47A,
-                               BAC43B20E14A340CCF14119C,
-                               BF3CEF080FA013E2778DCE90,
-                               B8385E9A644BD3CD94876448,
-                       );
-                       name = Project;
-                       sourceTree = "<group>";
-               };
-               4DCC5D64BBE8DE85360A3D57 = {
-                       isa = PBXGroup;
-                       children = (
-                               CCD62DB0A19A985A4B9D7F32,
-                               D5EF5961B1F0E3FAED32E30A,
-                               FA790C59A304579F660F112F,
-                               59520B8137E6A2E483074399,
-                               FF68231DE2B395461009116C,
-                               20075A86A4D0E8A5B973D9DB,
-                               C3BB9F92B02B06D04A73794C,
-                               8DBB36126CD144A8364F1F19,
-                               4FF81FC167C924C47BD8C1C9,
-                               9EE3141E20C9CE3EA182FA04,
-                               E13A54A6D3A1895EACE53E51,
-                               25BE1265FE6C6EA3473A3A0A,
-                               044478BB994878E35D30154A,
-                       );
-                       name = ProjectSaving;
-                       sourceTree = "<group>";
-               };
-               EC535A977A1A114BC5DAE7B3 = {
-                       isa = PBXGroup;
-                       children = (
-                               BE618CE21C794BDEE319E328,
-                               E2B668E2A65AEE8F07B406C8,
-                               F5DD97B45B8EA60C1ED0DD80,
-                               DFBEB8E086832AEB0FBEADF0,
-                       );
-                       name = Settings;
-                       sourceTree = "<group>";
-               };
-               AA2CBF47682AE479C1A387BE = {
-                       isa = PBXGroup;
-                       children = (
-                               F2E4998FB2C7221587A79F8B,
-                               23D79A22569BEDF63B57DD36,
-                               C3E04CD5A93A45154894E624,
-                               B403AF75EAF361ED74EE476E,
-                               E186BC01A1B1529937A46485,
-                               486E8D02DAD2A0BF54A901C0,
-                               983CFBA01CA8811F30FA7F4C,
-                               58F1FF52E887887A93E84FC2,
-                               A6C4AE13FB409DE414094CFA,
-                               6FD8DBC0FF42C87D8BEE2452,
-                               00515BA4EC5A7D4DC078ED37,
-                       );
-                       name = Helpers;
-                       sourceTree = "<group>";
-               };
-               B4972C4048154E5E783D3934 = {
-                       isa = PBXGroup;
-                       children = (
-                               191330B20DAC08B890656EA0,
-                               C76271530EB4458B6146D463,
-                       );
-                       name = PIPs;
-                       sourceTree = "<group>";
-               };
-               15F56361B9CF3E0BE705E64D = {
-                       isa = PBXGroup;
-                       children = (
-                               9EB33734D0DBD0370AB1247B,
-                               E367FC2BDAF5EBA48D767FBB,
-                               3D36F0CEB84B27BD02FC461A,
-                               59F8A47C0020D62C8836A1E7,
-                       );
-                       name = PropertyComponents;
-                       sourceTree = "<group>";
-               };
-               DD068F16F341D15E150CE6F1 = {
-                       isa = PBXGroup;
-                       children = (
-                               15F56361B9CF3E0BE705E64D,
-                               169DD91232C070C4D6470B31,
-                               846B2A670C5A19DE0039E11A,
-                               C59E624F099CC785F27429EB,
-                               4D5F0CA8D1273144681A1D48,
-                               00841B7EDDE9C19890F03267,
-                               0F8C000E5FF4A2DAC1FEF8EB,
-                               FE20FE5805A02A4843048200,
-                               0CECD562059DFD7FBFB37E3C,
-                               3D6FD9C0065BF16568EC0AB7,
-                               28D0199327887FFABF9C3F20,
-                       );
-                       name = UI;
-                       sourceTree = "<group>";
-               };
-               2B1F885AA027E1A76A1C32E3 = {
-                       isa = PBXGroup;
-                       children = (
-                               AA2CBF47682AE479C1A387BE,
-                               B4972C4048154E5E783D3934,
-                               DD068F16F341D15E150CE6F1,
-                       );
-                       name = Utility;
-                       sourceTree = "<group>";
-               };
-               73BAA89A783BBDD79AA27964 = {
-                       isa = PBXGroup;
-                       children = (
-                               A69024A225F2AC31F17B1314,
-                               11DC04468BC6023671017EBF,
-                               087CB3A961CD3C7434D660A4,
-                               4B083E951ECB62217C46CB01,
-                               C2990A8D054BC230E7C637C3,
-                               8BD8E9DA627D6EF9BA10FB9E,
-                               3C95FA2AA91EBA19ADDD5C29,
-                               8A825FDDC00DD253F44D2C3A,
-                               4A4EBDAD8D098F72CE053235,
-                               0F01067432AC314EAC213C1C,
-                               A44A774EFC020D3D046A9249,
-                               9992E6950C64322A11E39ADF,
-                               05D67B5A8D64947C067C0945,
-                               A085174413736ACC8D7D42A2,
-                               471C7B0A8B92320AF0C80839,
-                               714267352CE5C4357ADBC231,
-                               C09BBB58CA45B66D693E8C31,
-                       );
-                       name = Wizards;
-                       sourceTree = "<group>";
-               };
-               D3109994DA6AD871BE85C4E2 = {
-                       isa = PBXGroup;
-                       children = (
-                               BC67FD952A6F210A11A1ECB8,
-                               A9399733CAA07BDAB958242C,
-                               F1B44F007A02A0FAE4DC8D79,
-                               F6BD840F9A06F2DA891E2CB8,
-                               144B649D98AE8316058B8281,
-                               20B39D53B7DAAB53C7533532,
-                               89E9055A179B4C2019B4E1AE,
-                               4DCC5D64BBE8DE85360A3D57,
-                               EC535A977A1A114BC5DAE7B3,
-                               2B1F885AA027E1A76A1C32E3,
-                               73BAA89A783BBDD79AA27964,
-                       );
-                       name = Projucer;
-                       sourceTree = "<group>";
-               };
-               8A24D1B6925535A868974986 = {
-                       isa = PBXGroup;
-                       children = (
-                               58DE91CE6B05AFBACADDB251,
-                               BA159A3B7D129771F5C15EA3,
-                               AA1C44E89D792DDC4867B2C8,
-                               69555CEFC6ED613AA3949298,
-                               21F4833C5B5C17B159B956F3,
-                               B6F2905330EA5C560D527209,
-                               7AB7640968FAAC73072FBD10,
-                               D05BD91B6105827B010E1C20,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               2C6746F66EF4444F53B3221F = {
-                       isa = PBXGroup;
-                       children = (
-                               8702F43110E4CCA5E5F827F5,
-                               472F9A90F685220D730EBF6C,
-                               4F687965FBE86EAFDB3ACFEC,
-                               805A3A5FBA3B9E28363DD77B,
-                               DB9C8E35DF815B803CB4A9CF,
-                               D766BB9D8C32B5560F0493F3,
-                               1DE5BBC777FB64798D823002,
-                               5867DC4E39DF8539B54C0D59,
-                               1B9B5A37F079FE3B3CF8FAB6,
-                               0462692BAA9CD1BE6DFBCC33,
-                               AECE3914F5119A3D586A5635,
-                               364D1A9B113320407A7E57B9,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               8180B5894A78501084B8F133 = {
-                       isa = PBXGroup;
-                       children = (
-                               E266DE67FF319D56F63193A6,
-                               6678E9B3EEACAD47F438B264,
-                               951128CA33CCDEF570436B1C,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               0FFEF043CA89142B18C79ABE = {
-                       isa = PBXGroup;
-                       children = (
-                               80D62B907248523E6943298B,
-                               5A75806B34E4EA6598A6024A,
-                               7B3F7ECF6DBF8C8EE5C2CB86,
-                               210CD22F25F2C22F9CEEB025,
-                               D00F311BFC3C2625C457CB9B,
-                               D1F9B0E9F5D54FE48BEB46EA,
-                               728FE25157E9874D50BBECB2,
-                               E983E6DDE3318B872EBE347F,
-                               8F7BE18698ADCEF51CDE4A5C,
-                               842427CFE565F3FCE5B99174,
-                               E96597BBC6A98255B51B94DC,
-                               431D30038CBF67F80E8B3A13,
-                               9F01BA9942D038EA8B5289A8,
-                               E5D6C36496F5BC84D7213BE8,
-                               CF6C8BD0DA3D8CD4E99EBADA,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               92ABB8016546F41128399E9D = {
-                       isa = PBXGroup;
-                       children = (
-                               09DE066936CF037E9709ADB1,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               3CC531922CC2D398E283A845 = {
-                       isa = PBXGroup;
-                       children = (
-                               D3109994DA6AD871BE85C4E2,
-                               8A24D1B6925535A868974986,
-                               2C6746F66EF4444F53B3221F,
-                               8180B5894A78501084B8F133,
-                               0FFEF043CA89142B18C79ABE,
-                               92ABB8016546F41128399E9D,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               0CC6C439D038EDA0D7F10DF0 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               A6A9D7624D002544ECB81D82 = {isa = PBXBuildFile; fileRef = 09DE066936CF037E9709ADB1; };
+               A578EAD4BB55680E8097BE0F = {isa = PBXBuildFile; fileRef = 80D62B907248523E6943298B; };
+               C1B9334AE849F93FB3C56B34 = {isa = PBXBuildFile; fileRef = 5A75806B34E4EA6598A6024A; };
+               8B4A593B3869815BBAC3EF93 = {isa = PBXBuildFile; fileRef = 7B3F7ECF6DBF8C8EE5C2CB86; };
+               A14C2C2725DA3CA7995D2815 = {isa = PBXBuildFile; fileRef = 210CD22F25F2C22F9CEEB025; };
+               1E76E36772355E2A43CF4961 = {isa = PBXBuildFile; fileRef = D00F311BFC3C2625C457CB9B; };
+               241F29FCBB7A17BB44A0B10C = {isa = PBXBuildFile; fileRef = D1F9B0E9F5D54FE48BEB46EA; };
+               9359F9401D59B4517F75C39C = {isa = PBXBuildFile; fileRef = 728FE25157E9874D50BBECB2; };
+               091A57B4B9CE623E75E9A756 = {isa = PBXBuildFile; fileRef = E983E6DDE3318B872EBE347F; };
+               FAB47E69F7D9DCE1F906AA07 = {isa = PBXBuildFile; fileRef = 8F7BE18698ADCEF51CDE4A5C; };
+               0E884E47A637D6C65154699A = {isa = PBXBuildFile; fileRef = 842427CFE565F3FCE5B99174; };
+               49C22786B54C5DC94E4654B8 = {isa = PBXBuildFile; fileRef = E96597BBC6A98255B51B94DC; };
+               CDEF9FF2D119476D707305DF = {isa = PBXBuildFile; fileRef = 431D30038CBF67F80E8B3A13; };
+               96EC6315E1B3F1A109F84BAF = {isa = PBXBuildFile; fileRef = 9F01BA9942D038EA8B5289A8; };
+               11D42F7EC6E6539D79A7F4B1 = {isa = PBXBuildFile; fileRef = E5D6C36496F5BC84D7213BE8; };
+               B980464FA2761CCD64B1FAD6 = {isa = PBXBuildFile; fileRef = CF6C8BD0DA3D8CD4E99EBADA; };
+               2610F357881240ACBF612F48 = {isa = PBXBuildFile; fileRef = 6678E9B3EEACAD47F438B264; };
+               1321E6C1C6170B6C898AD09D = {isa = PBXBuildFile; fileRef = 951128CA33CCDEF570436B1C; };
+               6DD9DA1677A6CF789CDAB478 = {isa = PBXBuildFile; fileRef = 0D4D508C638BC74943B9976D; };
+               954A036F5DDB375DB23FFB3E = {isa = PBXBuildFile; fileRef = 0400CB0E056A1D840304D2DE; };
+               95B44E6C74B1DED31DBE37EB = {isa = PBXBuildFile; fileRef = 8C52A3DDA62A746AA7A68535; };
+               AA9D0B8E23F3D87A23DE9F8A = {isa = PBXBuildFile; fileRef = 9069981E414A631B036CC9AC; };
+               98F9BB4612E82EE59689E15C = {isa = PBXBuildFile; fileRef = B6496F16ACE80CACC5721570; };
+               09C4EDDF7F8B6E75EA3CE3A9 = {isa = PBXBuildFile; fileRef = BC3B310D42C489E8B8D93327; };
+               71713DE4716DCEDB45A206E2 = {isa = PBXBuildFile; fileRef = F9111E150CFF155329D44853; };
+               940CE4E081E9E685243C07AA = {isa = PBXBuildFile; fileRef = 332AF94C3275FEA8B878D603; };
+               49EEEA5B74D38F3C5A8794F1 = {isa = PBXBuildFile; fileRef = 8F731F1F98BAB42F1C3B96AA; };
+               6FD9428439B572B558EF64EA = {isa = PBXBuildFile; fileRef = BF301C2E545AEB4AC112C176; };
+               6EAAAAB0C2B2DA259B26D63C = {isa = PBXBuildFile; fileRef = 1DCA18E935A35D29D2D9B6A0; };
+               4C0F95265A230E5A8717A0A9 = {isa = PBXBuildFile; fileRef = D6390A40B3279E0E626C78D3; };
+               FFA8B18CDF2D2AA500698A96 = {isa = PBXBuildFile; fileRef = 512D80BE12634967A085A1DC; };
+               EE26A1C2DAAB609362F407EA = {isa = PBXBuildFile; fileRef = 988F5C1E40DED02D8B064253; };
+               4FAAB649E846BA2764C02ACE = {isa = PBXBuildFile; fileRef = 72ED72174F9DBD0ABD8AFCED; };
+               7D750EF5FCE1E1A461D435BE = {isa = PBXBuildFile; fileRef = 4AE72953E3B3DF06D3B9BA86; };
+               537ABF1DB09DDBD1542A2B0C = {isa = PBXBuildFile; fileRef = EF25A29A2194FC107B40F65F; };
+               290F2CD930097091B8DB122E = {isa = PBXBuildFile; fileRef = 00E6B87A43453B51850550E1; };
+               4B2F2DAA45060D3F250D0AE4 = {isa = PBXBuildFile; fileRef = 6F02C3B7FEA3B50692A70DE5; };
+               BDD30804C9424526A1122A28 = {isa = PBXBuildFile; fileRef = 351AF80A004D766E314AB76D; };
+               37D582DA2227E004BFA237EC = {isa = PBXBuildFile; fileRef = 6E70C1FA80F02D4C310F63AA; };
+               9B8ED9D50406E5D75DEE57F5 = {isa = PBXBuildFile; fileRef = FFE01768CF1C8DBDAA894F76; };
+               89116B0BD882B51C63A84425 = {isa = PBXBuildFile; fileRef = 0EE17BE4154CF1B2EE683894; };
+               63D97E01F2C4C91037CB65BD = {isa = PBXBuildFile; fileRef = 24EB4C2412821B8019D6F754; };
+               45A53AF13B0D663050632E8C = {isa = PBXBuildFile; fileRef = 9EF583A6201DBC813C2F63C4; };
+               C2A85091A28C907A4E1E1687 = {isa = PBXBuildFile; fileRef = 133F1E428260C5ADDF496DF9; };
+               83431B7234A78ECFB3C15F63 = {isa = PBXBuildFile; fileRef = 78D0DBC4798FF040FDB90F6D; };
+               209FCCC2155A1FCB7E11E20D = {isa = PBXBuildFile; fileRef = 269A454F1FF081DA67FFD578; };
+               C93569F47B4AC1A8E37992ED = {isa = PBXBuildFile; fileRef = 9D7689451732AF8333402B3A; };
+               1B988E139004D8E2850EB656 = {isa = PBXBuildFile; fileRef = C187718F7B9EBA88584B43F3; };
+               6FD0752A5CADCF60D79FDBB7 = {isa = PBXBuildFile; fileRef = 51CBE59779A36D1B80B26974; };
+               D25EBE02B55DB244BE0D5635 = {isa = PBXBuildFile; fileRef = DE3E6B2614229FAD56D50770; };
+               85E7FCB0516EFF853FA7B380 = {isa = PBXBuildFile; fileRef = D2FE76E4CF003856278343CC; };
+               CC6C4D351BA9B473E5F95791 = {isa = PBXBuildFile; fileRef = ADA538034910F52FDD2DC88D; };
+               05A08E366EBF8D650974E695 = {isa = PBXBuildFile; fileRef = 516D6D7C564DD5DF5C15CB06; };
+               3FCA61C401007B243E2E9035 = {isa = PBXBuildFile; fileRef = F797071D88542C813CF7222A; };
+               30B921C38DCEE787B294B746 = {isa = PBXBuildFile; fileRef = BAC43B20E14A340CCF14119C; };
+               244567D3AE2E417A8CB2B95E = {isa = PBXBuildFile; fileRef = C3BB9F92B02B06D04A73794C; };
+               26D6AEA321E80ABCC3CCCCD1 = {isa = PBXBuildFile; fileRef = 4FF81FC167C924C47BD8C1C9; };
+               4E6DC4778D583C48C3CCD4DC = {isa = PBXBuildFile; fileRef = E13A54A6D3A1895EACE53E51; };
+               EE722B47BC36CC8A87E0FB76 = {isa = PBXBuildFile; fileRef = BE618CE21C794BDEE319E328; };
+               2DF375B40A64BB3778F7ABD1 = {isa = PBXBuildFile; fileRef = F5DD97B45B8EA60C1ED0DD80; };
+               8BE478303CDF061B72F219E2 = {isa = PBXBuildFile; fileRef = F2E4998FB2C7221587A79F8B; };
+               BF913199032B4CE970E82AA3 = {isa = PBXBuildFile; fileRef = B403AF75EAF361ED74EE476E; };
+               25EF9B3FECB4C9F0F522DCAA = {isa = PBXBuildFile; fileRef = 486E8D02DAD2A0BF54A901C0; };
+               638C7247B6DBA67EFE46E124 = {isa = PBXBuildFile; fileRef = 191330B20DAC08B890656EA0; };
+               2BEC1197D981951D8A897F01 = {isa = PBXBuildFile; fileRef = D859E9EA11A71BD6E85DC649; };
+               D0E26EB54B0087C8BE3D541E = {isa = PBXBuildFile; fileRef = 846B2A670C5A19DE0039E11A; };
+               468548FB21D264DC12321327 = {isa = PBXBuildFile; fileRef = 4D5F0CA8D1273144681A1D48; };
+               6ECB2F11D2F593FACCCF99DB = {isa = PBXBuildFile; fileRef = 0F8C000E5FF4A2DAC1FEF8EB; };
+               95F56FB44C669F93AE77E465 = {isa = PBXBuildFile; fileRef = 0CECD562059DFD7FBFB37E3C; };
+               518DD443B6F17A5AFD707263 = {isa = PBXBuildFile; fileRef = A69024A225F2AC31F17B1314; };
+               B7EBA1A83575F48CD08140B9 = {isa = PBXBuildFile; fileRef = 4B083E951ECB62217C46CB01; };
+               3C5267E06A897B0DC0F7EA50 = {isa = PBXBuildFile; fileRef = 472F9A90F685220D730EBF6C; };
+               202DC8CF15ACBE096CC327EA = {isa = PBXBuildFile; fileRef = 805A3A5FBA3B9E28363DD77B; };
+               5DD883699B85E4C492CAD065 = {isa = PBXBuildFile; fileRef = DB9C8E35DF815B803CB4A9CF; };
+               D5C9125F65493CA481F18E53 = {isa = PBXBuildFile; fileRef = D766BB9D8C32B5560F0493F3; };
+               02E8F35A8E0D4A0DF6F38D60 = {isa = PBXBuildFile; fileRef = 1DE5BBC777FB64798D823002; };
+               234B6BA2952CBC7C61EF70EF = {isa = PBXBuildFile; fileRef = 5867DC4E39DF8539B54C0D59; };
+               254A7C08594A152C2C646334 = {isa = PBXBuildFile; fileRef = 1B9B5A37F079FE3B3CF8FAB6; };
+               F15F0512666FF8CDC0D08905 = {isa = PBXBuildFile; fileRef = 0462692BAA9CD1BE6DFBCC33; };
+               B18248959DDC44EF4E85320A = {isa = PBXBuildFile; fileRef = AECE3914F5119A3D586A5635; };
+               00515BA4EC5A7D4DC078ED37 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ValueSourceHelpers.h"; path = "../../Source/Utility/Helpers/jucer_ValueSourceHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+               00841B7EDDE9C19890F03267 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerTreeViewBase.h"; path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.h"; sourceTree = "SOURCE_ROOT"; };
+               00E6B87A43453B51850550E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentOverlayComponent.cpp"; path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               016A6C52B0B93DE29197FF64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AnimatedComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               01A37DF94E98D991FEF43628 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               023B92AC0340305762412E90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_OpenGLComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               0400CB0E056A1D840304D2DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CommandLine.cpp"; path = "../../Source/Application/jucer_CommandLine.cpp"; sourceTree = "SOURCE_ROOT"; };
+               0462692BAA9CD1BE6DFBCC33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               0543E83BF7D7D9234C396E82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentUndoableAction.h"; path = "../../Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h"; sourceTree = "SOURCE_ROOT"; };
+               055636565C2F512E40114582 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ViewportHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ViewportHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               05D67B5A8D64947C067C0945 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_GUIApp.h"; path = "../../Source/Wizards/jucer_ProjectWizard_GUIApp.h"; sourceTree = "SOURCE_ROOT"; };
+               0640E34282A97BF73CC8F1EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentListComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               079802C6AEE7646010766FE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioPluginFilterTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               087CB3A961CD3C7434D660A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizard.h"; path = "../../Source/Wizards/jucer_NewProjectWizard.h"; sourceTree = "SOURCE_ROOT"; };
+               09DE066936CF037E9709ADB1 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Projucer.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               0AE75B0ACD368A4C0FBC2CD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TabbedComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               0B24F292A357ABFD9BCC6D7F = {isa = PBXFileReference; lastKnownFileType = file; name = gradlew; path = ../../Source/BinaryData/gradle/gradlew; sourceTree = "SOURCE_ROOT"; };
+               0CECD562059DFD7FBFB37E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_SlidingPanelComponent.cpp"; path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               0D4D508C638BC74943B9976D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AutoUpdater.cpp"; path = "../../Source/Application/jucer_AutoUpdater.cpp"; sourceTree = "SOURCE_ROOT"; };
+               0EE17BE4154CF1B2EE683894 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceEditorPanel.cpp"; path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
+               0F01067432AC314EAC213C1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_Blank.h"; path = "../../Source/Wizards/jucer_ProjectWizard_Blank.h"; sourceTree = "SOURCE_ROOT"; };
+               0F8C000E5FF4A2DAC1FEF8EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjucerLookAndFeel.cpp"; path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; };
+               11DC04468BC6023671017EBF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewFileWizard.h"; path = "../../Source/Wizards/jucer_NewFileWizard.h"; sourceTree = "SOURCE_ROOT"; };
+               11DEED05110D3D1D02FCFFB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTypeHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               124232706D1C8A3CA49E70CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPCreatorWindowComponent.h"; path = "../../Source/Application/Windows/jucer_PIPCreatorWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               129F2DE0FEF154F8F8C7A74E = {isa = PBXFileReference; lastKnownFileType = file.jar; name = "gradle-wrapper.jar"; path = "../../Source/BinaryData/gradle/gradle-wrapper.jar"; sourceTree = "SOURCE_ROOT"; };
+               133F1E428260C5ADDF496DF9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentLayout.cpp"; path = "../../Source/ComponentEditor/jucer_ComponentLayout.cpp"; sourceTree = "SOURCE_ROOT"; };
+               159DE1FEE2099398983CDDF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ErrorList.h"; path = "../../Source/LiveBuildEngine/jucer_ErrorList.h"; sourceTree = "SOURCE_ROOT"; };
+               16751E04B0F3737BDF52CEB4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_HeaderComponent.h"; path = "../../Source/Project/UI/jucer_HeaderComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               169DD91232C070C4D6470B31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_IconButton.h"; path = "../../Source/Utility/UI/jucer_IconButton.h"; sourceTree = "SOURCE_ROOT"; };
+               182CB1F96890620A202C6524 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SourceCodeRange.h"; path = "../../Source/LiveBuildEngine/jucer_SourceCodeRange.h"; sourceTree = "SOURCE_ROOT"; };
+               191330B20DAC08B890656EA0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PIPGenerator.cpp"; path = "../../Source/Utility/PIPs/jucer_PIPGenerator.cpp"; sourceTree = "SOURCE_ROOT"; };
+               194457D806A26E793584AC0C = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "huckleberry_icon.svg"; path = "../../Source/BinaryData/Icons/huckleberry_icon.svg"; sourceTree = "SOURCE_ROOT"; };
+               1B0F18E1D96F727C062B05FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectContentComponent.cpp"; path = "../../Source/Project/UI/jucer_ProjectContentComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               1B5BCD4899A9E295786EB642 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_OpenDocumentManager.h"; path = "../../Source/CodeEditor/jucer_OpenDocumentManager.h"; sourceTree = "SOURCE_ROOT"; };
+               1B9B5A37F079FE3B3CF8FAB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               1C80C7672975C1FF9AAC4A4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTab.h"; path = "../../Source/Project/UI/Sidebar/jucer_ProjectTab.h"; sourceTree = "SOURCE_ROOT"; };
+               1DCA18E935A35D29D2D9B6A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentDocument.cpp"; path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+               1DE5BBC777FB64798D823002 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               20075A86A4D0E8A5B973D9DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_Xcode.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_Xcode.h"; sourceTree = "SOURCE_ROOT"; };
+               203FA6AD7EDDF1F9C338CC2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               2072D6BAE744B53B6FBBDDD8 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AudioPlugin.svg"; path = "../../Source/BinaryData/Icons/wizard_AudioPlugin.svg"; sourceTree = "SOURCE_ROOT"; };
+               210CD22F25F2C22F9CEEB025 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               21F4833C5B5C17B159B956F3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               23A8DE16C0CDB8EED18B008B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommandIDs.h"; path = "../../Source/Application/jucer_CommandIDs.h"; sourceTree = "SOURCE_ROOT"; };
+               23D79A22569BEDF63B57DD36 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CodeHelpers.h"; path = "../../Source/Utility/Helpers/jucer_CodeHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+               245C81599FB53865A74FC65B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ActivityList.h"; path = "../../Source/LiveBuildEngine/jucer_ActivityList.h"; sourceTree = "SOURCE_ROOT"; };
+               24EB4C2412821B8019D6F754 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_TestComponent.cpp"; path = "../../Source/ComponentEditor/UI/jucer_TestComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               25BE1265FE6C6EA3473A3A0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceFile.h"; path = "../../Source/ProjectSaving/jucer_ResourceFile.h"; sourceTree = "SOURCE_ROOT"; };
+               269A454F1FF081DA67FFD578 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerDocument.cpp"; path = "../../Source/ComponentEditor/jucer_JucerDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+               28D0199327887FFABF9C3F20 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UserSettingsPopup.h"; path = "../../Source/Utility/UI/jucer_UserSettingsPopup.h"; sourceTree = "SOURCE_ROOT"; };
+               2BD9B4556479A8A41740BCAE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               2CD34A70B4032C0426F7AA10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_MainWindow.h"; path = "../../Source/Application/jucer_MainWindow.h"; sourceTree = "SOURCE_ROOT"; };
+               2DF5A61F3C497537634773DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ActivityListComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               2EEB1C074162F363C6599282 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommandLine.h"; path = "../../Source/Application/jucer_CommandLine.h"; sourceTree = "SOURCE_ROOT"; };
+               2F373F97E30AC1A0BFC1FC61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePropertyComponent.h"; path = "../../Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               308084CBEE9F7D405D72A5E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineClient.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.h"; sourceTree = "SOURCE_ROOT"; };
+               32C4B61AD995877956B7FA66 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_InlineComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_InlineComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               32ECBC08D903418CA0825870 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentViewComponents.h"; path = "../../Source/Project/UI/jucer_ContentViewComponents.h"; sourceTree = "SOURCE_ROOT"; };
+               332AF94C3275FEA8B878D603 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_SourceCodeEditor.cpp"; path = "../../Source/CodeEditor/jucer_SourceCodeEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+               33B258726F29360D64FD1451 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_JucerComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               351AF80A004D766E314AB76D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerDocumentEditor.cpp"; path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+               355379844A5E6A097038C280 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementRectangle.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+               35CAE8930F2885F9322D22D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ItemPreviewComponent.h"; path = "../../Source/CodeEditor/jucer_ItemPreviewComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               35CFCC15CBA46F4513940A2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TextButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TextButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               364D1A9B113320407A7E57B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               36E5FBF64A89D5F2A266A5A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementUndoableAction.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h"; sourceTree = "SOURCE_ROOT"; };
+               39597BD78897CB711AFA945A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_EditingPanelBase.h"; path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.h"; sourceTree = "SOURCE_ROOT"; };
+               3BBFA655E129C2D817EA47C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ErrorListComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_ErrorListComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               3C95FA2AA91EBA19ADDD5C29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_Animated.h"; path = "../../Source/Wizards/jucer_ProjectWizard_Animated.h"; sourceTree = "SOURCE_ROOT"; };
+               3D6FD9C0065BF16568EC0AB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SlidingPanelComponent.h"; path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               3DC2ED15A9DFAAEF3D2ACDDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PIPMain.cpp"; path = "../../Source/BinaryData/Templates/jucer_PIPMain.cpp"; sourceTree = "SOURCE_ROOT"; };
+               3EA27F52A254912218F4DE94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectBuildInfo.h"; path = "../../Source/LiveBuildEngine/jucer_ProjectBuildInfo.h"; sourceTree = "SOURCE_ROOT"; };
+               3F7C5B53347A487C7FBD2223 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_OpenGLComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               3F8EC008960DBEB2A5D3C3F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Headers.h"; path = "../../Source/Application/jucer_Headers.h"; sourceTree = "SOURCE_ROOT"; };
+               3F9D4C7F6E5779D4E4AE655D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayout.h"; path = "../../Source/ComponentEditor/jucer_ComponentLayout.h"; sourceTree = "SOURCE_ROOT"; };
+               4073A12E196BDDADE211E19F = {isa = PBXFileReference; lastKnownFileType = text.txt; name = "projucer_EULA.txt"; path = "../../Source/BinaryData/projucer_EULA.txt"; sourceTree = "SOURCE_ROOT"; };
+               409C636B96A9AC1D732B96F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComboBoxHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ComboBoxHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               41105E536155E394E54BDD35 = {isa = PBXFileReference; lastKnownFileType = file.xml; name = "colourscheme_dark.xml"; path = "../../Source/BinaryData/colourscheme_dark.xml"; sourceTree = "SOURCE_ROOT"; };
+               42F4AA3EF0883D506987CA99 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_codeBlocks.svg"; path = "../../Source/BinaryData/Icons/export_codeBlocks.svg"; sourceTree = "SOURCE_ROOT"; };
+               431D30038CBF67F80E8B3A13 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+               432EC251A122071809471804 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "juce-logo-with-text.svg"; path = "../../Source/BinaryData/Icons/juce-logo-with-text.svg"; sourceTree = "SOURCE_ROOT"; };
+               471C7B0A8B92320AF0C80839 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_StaticLibrary.h"; path = "../../Source/Wizards/jucer_ProjectWizard_StaticLibrary.h"; sourceTree = "SOURCE_ROOT"; };
+               472F9A90F685220D730EBF6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+               4818A05DE44ADA03D85E1083 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjucerAnalytics.h"; path = "../../Source/Application/jucer_ProjucerAnalytics.h"; sourceTree = "SOURCE_ROOT"; };
+               486E8D02DAD2A0BF54A901C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MiscUtilities.cpp"; path = "../../Source/Utility/Helpers/jucer_MiscUtilities.cpp"; sourceTree = "SOURCE_ROOT"; };
+               4974E7808F9B57E9A627F878 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FileTreeItems.h"; path = "../../Source/Project/UI/Sidebar/jucer_FileTreeItems.h"; sourceTree = "SOURCE_ROOT"; };
+               4A4EBDAD8D098F72CE053235 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_AudioPlugin.h"; path = "../../Source/Wizards/jucer_ProjectWizard_AudioPlugin.h"; sourceTree = "SOURCE_ROOT"; };
+               4AE469CD40BDAD634135785E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElement.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.h"; sourceTree = "SOURCE_ROOT"; };
+               4AE72953E3B3DF06D3B9BA86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElementPath.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp"; sourceTree = "SOURCE_ROOT"; };
+               4B083E951ECB62217C46CB01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewProjectWizardClasses.cpp"; path = "../../Source/Wizards/jucer_NewProjectWizardClasses.cpp"; sourceTree = "SOURCE_ROOT"; };
+               4D5F0CA8D1273144681A1D48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerTreeViewBase.cpp"; path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.cpp"; sourceTree = "SOURCE_ROOT"; };
+               4D698BF12BCD6B0896BCDF17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AutoUpdater.h"; path = "../../Source/Application/jucer_AutoUpdater.h"; sourceTree = "SOURCE_ROOT"; };
+               4E671236FDBD5AD4699740C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerCommandIDs.h"; path = "../../Source/ComponentEditor/UI/jucer_JucerCommandIDs.h"; sourceTree = "SOURCE_ROOT"; };
+               4ECF029E3A69BF42FED1503D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPAudioProcessorTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               4F687965FBE86EAFDB3ACFEC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+               4FF81FC167C924C47BD8C1C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectSaver.cpp"; path = "../../Source/ProjectSaving/jucer_ProjectSaver.cpp"; sourceTree = "SOURCE_ROOT"; };
+               50498FF6EA3901CBD58223B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ObjectTypes.h"; path = "../../Source/ComponentEditor/jucer_ObjectTypes.h"; sourceTree = "SOURCE_ROOT"; };
+               512D80BE12634967A085A1DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElement.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp"; sourceTree = "SOURCE_ROOT"; };
+               514F2FAFDBF535AC03FA2E6C = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "background_logo.svg"; path = "../../Source/BinaryData/Icons/background_logo.svg"; sourceTree = "SOURCE_ROOT"; };
+               516D6D7C564DD5DF5C15CB06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_HeaderComponent.cpp"; path = "../../Source/Project/UI/jucer_HeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               51BC758EF5D33197CF543E67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DocumentEditorComponent.h"; path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               51CBE59779A36D1B80B26974 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_LicenseController.cpp"; path = "../../Source/Licenses/jucer_LicenseController.cpp"; sourceTree = "SOURCE_ROOT"; };
+               5432B7B9B2CF2EAEC8B66D5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UtilityFunctions.h"; path = "../../Source/ComponentEditor/jucer_UtilityFunctions.h"; sourceTree = "SOURCE_ROOT"; };
+               5524B5C9FC6AEAA670B92AA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayoutEditor.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h"; sourceTree = "SOURCE_ROOT"; };
+               55DEDCEB35AA1FB54C74B375 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_MessageIDs.h"; path = "../../Source/LiveBuildEngine/jucer_MessageIDs.h"; sourceTree = "SOURCE_ROOT"; };
+               56177921580A4855917E0205 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioPluginEditorTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               56749E4C72A8F51ACA8F2330 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_clion.svg"; path = "../../Source/BinaryData/Icons/export_clion.svg"; sourceTree = "SOURCE_ROOT"; };
+               576A92E1E0D8F453EC0FEB34 = {isa = PBXFileReference; lastKnownFileType = file.bat; name = gradlew.bat; path = ../../Source/BinaryData/gradle/gradlew.bat; sourceTree = "SOURCE_ROOT"; };
+               5783563E39E48ADFC68EB84A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTextProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               58139D8D454051C59E77609B = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = ../../Source/BinaryData/RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               5867DC4E39DF8539B54C0D59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               58DE91CE6B05AFBACADDB251 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+               58F1FF52E887887A93E84FC2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PresetIDs.h"; path = "../../Source/Utility/Helpers/jucer_PresetIDs.h"; sourceTree = "SOURCE_ROOT"; };
+               59203884BC48D3B7F8DEABA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentCompTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               59520B8137E6A2E483074399 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_Make.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_Make.h"; sourceTree = "SOURCE_ROOT"; };
+               59B08C7B13B8EA5137ACA77A = {isa = PBXFileReference; lastKnownFileType = text.txt; name = nothingtoseehere.txt; path = ../../Source/BinaryData/nothingtoseehere.txt; sourceTree = "SOURCE_ROOT"; };
+               59F8A47C0020D62C8836A1E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PropertyComponentsWithEnablement.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h"; sourceTree = "SOURCE_ROOT"; };
+               5A75806B34E4EA6598A6024A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               5B3532C5F103DAC87B4A5675 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_GUI.svg"; path = "../../Source/BinaryData/Icons/wizard_GUI.svg"; sourceTree = "SOURCE_ROOT"; };
+               5BF0374EB908F0476BD8ED42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               5E4EB84A7983AB31366A3490 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ModuleTreeItems.h"; path = "../../Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h"; sourceTree = "SOURCE_ROOT"; };
+               5F6584B675E30761521A9F42 = {isa = PBXFileReference; lastKnownFileType = file.xml; name = "colourscheme_light.xml"; path = "../../Source/BinaryData/colourscheme_light.xml"; sourceTree = "SOURCE_ROOT"; };
+               62922B3C0620368D1799A653 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_OpenGL.svg"; path = "../../Source/BinaryData/Icons/wizard_OpenGL.svg"; sourceTree = "SOURCE_ROOT"; };
+               630DC5EAA31D3EE60B2D989F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GenericComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_GenericComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               6574A50A8997799705B23465 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioPluginEditorTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               65FAD7F6DF65A72B741C2913 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutinePanel.h"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h"; sourceTree = "SOURCE_ROOT"; };
+               6678E9B3EEACAD47F438B264 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               66B49F08C5EC3E4974825FF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutine.h"; path = "../../Source/ComponentEditor/jucer_PaintRoutine.h"; sourceTree = "SOURCE_ROOT"; };
+               68C1949F56295D5871C1F223 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LiveBuildTab.h"; path = "../../Source/Project/UI/Sidebar/jucer_LiveBuildTab.h"; sourceTree = "SOURCE_ROOT"; };
+               68F41A216E7454E7442AB1F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeItemTypes.h"; path = "../../Source/Project/UI/Sidebar/jucer_TreeItemTypes.h"; sourceTree = "SOURCE_ROOT"; };
+               69555CEFC6ED613AA3949298 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               69B478C992FA0B8C885946A6 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_linux.svg"; path = "../../Source/BinaryData/Icons/export_linux.svg"; sourceTree = "SOURCE_ROOT"; };
+               6AC88EFC247C225CC5C11A43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_BinaryResources.h"; path = "../../Source/ComponentEditor/jucer_BinaryResources.h"; sourceTree = "SOURCE_ROOT"; };
+               6E6140969908E7619F858740 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommonHeaders.h"; path = "../../Source/Application/jucer_CommonHeaders.h"; sourceTree = "SOURCE_ROOT"; };
+               6E70C1FA80F02D4C310F63AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutineEditor.cpp"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+               6F02C3B7FEA3B50692A70DE5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_EditingPanelBase.cpp"; path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp"; sourceTree = "SOURCE_ROOT"; };
+               6FD8DBC0FF42C87D8BEE2452 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationHelpers.h"; path = "../../Source/Utility/Helpers/jucer_TranslationHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+               7031E8CB6D4D84BD980A0BD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementImage.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h"; sourceTree = "SOURCE_ROOT"; };
+               705DE88C5C4CC6C871E951B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_GroupComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               714267352CE5C4357ADBC231 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StartPageComponent.h"; path = "../../Source/Wizards/jucer_StartPageComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               719B56C8587863D7AE9B69C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_RelativePositionedRectangle.h"; path = "../../Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+               7211101FFA28400ADBB1D47A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Module.h"; path = "../../Source/Project/jucer_Module.h"; sourceTree = "SOURCE_ROOT"; };
+               728FE25157E9874D50BBECB2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               72ED72174F9DBD0ABD8AFCED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElementImage.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp"; sourceTree = "SOURCE_ROOT"; };
+               73DE14CEAD25D3445457013E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SliderHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_SliderHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               75BE2887C6F324B818D80A21 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SnapGridPainter.h"; path = "../../Source/ComponentEditor/UI/jucer_SnapGridPainter.h"; sourceTree = "SOURCE_ROOT"; };
+               7687A1374C60A025BDBE98DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PointComponent.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PointComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               77EA01E7D04BF889930BFF54 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementRoundedRectangle.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+               78D0DBC4798FF040FDB90F6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_GeneratedCode.cpp"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.cpp"; sourceTree = "SOURCE_ROOT"; };
+               790F6302B9A0620F23F8A6C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LicenseThread.h"; path = "../../Source/Licenses/jucer_LicenseThread.h"; sourceTree = "SOURCE_ROOT"; };
+               7AB7640968FAAC73072FBD10 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               7B3F7ECF6DBF8C8EE5C2CB86 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
+               7CA44FF0BA319517C6E39651 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Application.cpp"; path = "../../Source/Application/jucer_Application.cpp"; sourceTree = "SOURCE_ROOT"; };
+               7E2013F425E231C6D865DDD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentChoiceProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               7F0A5319912991615FC57945 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColourPropertyComponent.h"; path = "../../Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               805A3A5FBA3B9E28363DD77B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               807049CA2D5B6DE18EA078F2 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_android.svg"; path = "../../Source/BinaryData/Icons/export_android.svg"; sourceTree = "SOURCE_ROOT"; };
+               80D62B907248523E6943298B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               8336A43CE1C3C26D7C7B53D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               842427CFE565F3FCE5B99174 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+               846B2A670C5A19DE0039E11A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Icons.cpp"; path = "../../Source/Utility/UI/jucer_Icons.cpp"; sourceTree = "SOURCE_ROOT"; };
+               85A5E3E71BED93B9A3E07681 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PositionPropertyBase.h"; path = "../../Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h"; sourceTree = "SOURCE_ROOT"; };
+               861E52D9AFECADF079BB1F2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ExporterTreeItems.h"; path = "../../Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h"; sourceTree = "SOURCE_ROOT"; };
+               868B459E02F0877EBE3D56F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TextEditorHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TextEditorHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               8702F43110E4CCA5E5F827F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               8A82061A978B03745485C3AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LiveBuildCodeEditor.h"; path = "../../Source/CodeEditor/jucer_LiveBuildCodeEditor.h"; sourceTree = "SOURCE_ROOT"; };
+               8A825FDDC00DD253F44D2C3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_AudioApp.h"; path = "../../Source/Wizards/jucer_ProjectWizard_AudioApp.h"; sourceTree = "SOURCE_ROOT"; };
+               8BD8E9DA627D6EF9BA10FB9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizardComponent.h"; path = "../../Source/Wizards/jucer_NewProjectWizardComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               8C281F2F8EA3AD614ADF7955 = {isa = PBXFileReference; lastKnownFileType = text.html; name = offlinepage.html; path = ../../Source/BinaryData/offlinepage.html; sourceTree = "SOURCE_ROOT"; };
+               8C52A3DDA62A746AA7A68535 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Main.cpp"; path = "../../Source/Application/jucer_Main.cpp"; sourceTree = "SOURCE_ROOT"; };
+               8D178CAEE6D89DE33233313F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ElementSiblingComponent.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               8D9A9A373E4621F7CBFCCCEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ContentCompTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               8DBB36126CD144A8364F1F19 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExporter.h"; path = "../../Source/ProjectSaving/jucer_ProjectExporter.h"; sourceTree = "SOURCE_ROOT"; };
+               8DFE6D8AFB8057790041300B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ToggleButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               8F30A53C7FE4BC65171FB3E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerDocument.h"; path = "../../Source/ComponentEditor/jucer_JucerDocument.h"; sourceTree = "SOURCE_ROOT"; };
+               8F4D281E98808204E2846A7D = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_xcode.svg"; path = "../../Source/BinaryData/Icons/export_xcode.svg"; sourceTree = "SOURCE_ROOT"; };
+               8F67F3C0492EAFEBDBBC12DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewCppFileTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               8F685EFEFD6EE399058DE842 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DownloadCompileEngineThread.h"; path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.h"; sourceTree = "SOURCE_ROOT"; };
+               8F731F1F98BAB42F1C3B96AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentTypeHandler.cpp"; path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp"; sourceTree = "SOURCE_ROOT"; };
+               8F7BE18698ADCEF51CDE4A5C = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               8FEF6F5EA676B824C021EB6F = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AnimatedApp.svg"; path = "../../Source/BinaryData/Icons/wizard_AnimatedApp.svg"; sourceTree = "SOURCE_ROOT"; };
+               8FF26BF72A522FBEAAFDDF54 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AudioApp.svg"; path = "../../Source/BinaryData/Icons/wizard_AudioApp.svg"; sourceTree = "SOURCE_ROOT"; };
+               9069981E414A631B036CC9AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainWindow.cpp"; path = "../../Source/Application/jucer_MainWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+               92926A4D3CC4BB2A9D35EB0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UTF8WindowComponent.h"; path = "../../Source/Application/Windows/jucer_UTF8WindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               92A66A8BD87F98EB6B4FB6D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectContentComponent.h"; path = "../../Source/Project/UI/jucer_ProjectContentComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               951128CA33CCDEF570436B1C = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+               95EAB6EC9B724538B93910D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TabComponents.h"; path = "../../Source/Project/UI/Sidebar/jucer_TabComponents.h"; sourceTree = "SOURCE_ROOT"; };
+               97A847B59EE04483E8850E4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_SimpleWindow.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+               983CFBA01CA8811F30FA7F4C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_MiscUtilities.h"; path = "../../Source/Utility/Helpers/jucer_MiscUtilities.h"; sourceTree = "SOURCE_ROOT"; };
+               988F5C1E40DED02D8B064253 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElementGroup.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp"; sourceTree = "SOURCE_ROOT"; };
+               98E6D61BFF7D85F0E00F0FBF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LicenseWebview.h"; path = "../../Source/Licenses/jucer_LicenseWebview.h"; sourceTree = "SOURCE_ROOT"; };
+               9914F905BFCFBE5F76619670 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColouredElement.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.h"; sourceTree = "SOURCE_ROOT"; };
+               996E472B82A75531875A5E38 = {isa = PBXFileReference; lastKnownFileType = file; name = LICENSE; path = ../../Source/BinaryData/gradle/LICENSE; sourceTree = "SOURCE_ROOT"; };
+               9992E6950C64322A11E39ADF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_DLL.h"; path = "../../Source/Wizards/jucer_ProjectWizard_DLL.h"; sourceTree = "SOURCE_ROOT"; };
+               9A3B8BBDA8E144A3DF6B9349 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AnimatedComponentSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               9B6FD3FEDB6D91AD0A80EF97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ImageResourceProperty.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               9BDF2D6255C1CB2CFF376186 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentOverlayComponent.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               9D7689451732AF8333402B3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ObjectTypes.cpp"; path = "../../Source/ComponentEditor/jucer_ObjectTypes.cpp"; sourceTree = "SOURCE_ROOT"; };
+               9E0BA495286388EBF929D578 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentCompSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               9E2B1506AC3FDB7863766D59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewInlineComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               9E62EC342665C27BA01AFC1A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentNameProperty.h"; path = "../../Source/ComponentEditor/Components/jucer_ComponentNameProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               9EB33734D0DBD0370AB1247B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColourPropertyComponent.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               9EE3141E20C9CE3EA182FA04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectSaver.h"; path = "../../Source/ProjectSaving/jucer_ProjectSaver.h"; sourceTree = "SOURCE_ROOT"; };
+               9EF583A6201DBC813C2F63C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_BinaryResources.cpp"; path = "../../Source/ComponentEditor/jucer_BinaryResources.cpp"; sourceTree = "SOURCE_ROOT"; };
+               9F01BA9942D038EA8B5289A8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; };
+               9F2D3E5FC10F7C3270908E97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ButtonDocument.h"; path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.h"; sourceTree = "SOURCE_ROOT"; };
+               9F959ECF8CD9B7314AE604A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LabelHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_LabelHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               A081306A9E95CA114B81910F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineSettings.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineSettings.h"; sourceTree = "SOURCE_ROOT"; };
+               A085174413736ACC8D7D42A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_openGL.h"; path = "../../Source/Wizards/jucer_ProjectWizard_openGL.h"; sourceTree = "SOURCE_ROOT"; };
+               A0BBBFBA13A1308B3CD725D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayoutPanel.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h"; sourceTree = "SOURCE_ROOT"; };
+               A160AEF56553A658E6EA6A8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_Window.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp"; sourceTree = "SOURCE_ROOT"; };
+               A22F64D1E4BD4B8FA366DAAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TreeViewHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               A44A774EFC020D3D046A9249 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_Console.h"; path = "../../Source/Wizards/jucer_ProjectWizard_Console.h"; sourceTree = "SOURCE_ROOT"; };
+               A49503B646A7BD2BEEFC5CBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_HyperlinkButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               A509BC22854D50E4C786EB32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FileGroupInformationComponent.h"; path = "../../Source/Project/UI/jucer_FileGroupInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               A66F17E7472E5C19AFE98E46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainConsoleAppTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               A69024A225F2AC31F17B1314 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewFileWizard.cpp"; path = "../../Source/Wizards/jucer_NewFileWizard.cpp"; sourceTree = "SOURCE_ROOT"; };
+               A6C4AE13FB409DE414094CFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_RelativePath.h"; path = "../../Source/Utility/Helpers/jucer_RelativePath.h"; sourceTree = "SOURCE_ROOT"; };
+               A978DFE87D9BB5EFE5B3DAAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineDLL.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineDLL.h"; sourceTree = "SOURCE_ROOT"; };
+               A9954DC7F876A7006743ACB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DiagnosticMessage.h"; path = "../../Source/LiveBuildEngine/jucer_DiagnosticMessage.h"; sourceTree = "SOURCE_ROOT"; };
+               AA1C44E89D792DDC4867B2C8 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               ADA538034910F52FDD2DC88D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DownloadCompileEngineThread.cpp"; path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp"; sourceTree = "SOURCE_ROOT"; };
+               ADD6A3CF5D7DE55E57E8E38B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CppHelpers.h"; path = "../../Source/LiveBuildEngine/jucer_CppHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+               AECE3914F5119A3D586A5635 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               AEFE3BA0C31EC78A5767A10E = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_DLL.svg"; path = "../../Source/BinaryData/Icons/wizard_DLL.svg"; sourceTree = "SOURCE_ROOT"; };
+               B1C2F8ED14BF914CD1882708 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_Openfile.svg"; path = "../../Source/BinaryData/Icons/wizard_Openfile.svg"; sourceTree = "SOURCE_ROOT"; };
+               B24E3F34C3C4EE54A60C35CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LiveCodeBuilderDLL.h"; path = "../../Source/LiveBuildEngine/jucer_LiveCodeBuilderDLL.h"; sourceTree = "SOURCE_ROOT"; };
+               B2CB95B3F44C3CC5735051A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JustificationProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_JustificationProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               B3528C08B84CBC950252EA69 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ModulesInformationComponent.h"; path = "../../Source/Project/UI/jucer_ModulesInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               B403AF75EAF361ED74EE476E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_FileHelpers.cpp"; path = "../../Source/Utility/Helpers/jucer_FileHelpers.cpp"; sourceTree = "SOURCE_ROOT"; };
+               B6496F16ACE80CACC5721570 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjucerAnalytics.cpp"; path = "../../Source/Application/jucer_ProjucerAnalytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               B6F2905330EA5C560D527209 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               B8385E9A644BD3CD94876448 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectType.h"; path = "../../Source/Project/jucer_ProjectType.h"; sourceTree = "SOURCE_ROOT"; };
+               B83C9BD89F31EA9E5E12A3C6 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "juce_icon.png"; path = "../../Source/BinaryData/Icons/juce_icon.png"; sourceTree = "SOURCE_ROOT"; };
+               B83DAADA1A871F21582FFB23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ApplicationUsageDataWindowComponent.h"; path = "../../Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               B97D60D2531CFD0D8555BA5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementText.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementText.h"; sourceTree = "SOURCE_ROOT"; };
+               B9B130F596953116393138DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SourceCodeEditor.h"; path = "../../Source/CodeEditor/jucer_SourceCodeEditor.h"; sourceTree = "SOURCE_ROOT"; };
+               BA159A3B7D129771F5C15EA3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               BA186B51EE4884CD8E3F2741 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineServer.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.h"; sourceTree = "SOURCE_ROOT"; };
+               BAC43B20E14A340CCF14119C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Project.cpp"; path = "../../Source/Project/jucer_Project.cpp"; sourceTree = "SOURCE_ROOT"; };
+               BB187CD608EB6368B29EC335 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LicenseController.h"; path = "../../Source/Licenses/jucer_LicenseController.h"; sourceTree = "SOURCE_ROOT"; };
+               BC3B310D42C489E8B8D93327 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DocumentEditorComponent.cpp"; path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               BC623CC67AC58297BF6B4C70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TestComponent.h"; path = "../../Source/ComponentEditor/UI/jucer_TestComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               BCB6C87E3992930674E54D16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementGroup.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h"; sourceTree = "SOURCE_ROOT"; };
+               BDF6AFC5F88581AE395F1DC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceEditorPanel.h"; path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h"; sourceTree = "SOURCE_ROOT"; };
+               BE618CE21C794BDEE319E328 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AppearanceSettings.cpp"; path = "../../Source/Settings/jucer_AppearanceSettings.cpp"; sourceTree = "SOURCE_ROOT"; };
+               BF301C2E545AEB4AC112C176 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ButtonDocument.cpp"; path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+               BF3CEF080FA013E2778DCE90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Project.h"; path = "../../Source/Project/jucer_Project.h"; sourceTree = "SOURCE_ROOT"; };
+               C09BBB58CA45B66D693E8C31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TemplateThumbnailsComponent.h"; path = "../../Source/Wizards/jucer_TemplateThumbnailsComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               C187718F7B9EBA88584B43F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutine.cpp"; path = "../../Source/ComponentEditor/jucer_PaintRoutine.cpp"; sourceTree = "SOURCE_ROOT"; };
+               C2990A8D054BC230E7C637C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizardClasses.h"; path = "../../Source/Wizards/jucer_NewProjectWizardClasses.h"; sourceTree = "SOURCE_ROOT"; };
+               C3BB9F92B02B06D04A73794C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectExporter.cpp"; path = "../../Source/ProjectSaving/jucer_ProjectExporter.cpp"; sourceTree = "SOURCE_ROOT"; };
+               C3E04CD5A93A45154894E624 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Colours.h"; path = "../../Source/Utility/Helpers/jucer_Colours.h"; sourceTree = "SOURCE_ROOT"; };
+               C402C21DFAC1F8BF121144F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FillType.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_FillType.h"; sourceTree = "SOURCE_ROOT"; };
+               C59E624F099CC785F27429EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Icons.h"; path = "../../Source/Utility/UI/jucer_Icons.h"; sourceTree = "SOURCE_ROOT"; };
+               C607639897ED2538CBB860D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_OpenGLComponentSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               C7245390C6C44E89F7526CFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               C736264708F3F68BA745BA29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FloatingToolWindow.h"; path = "../../Source/Application/Windows/jucer_FloatingToolWindow.h"; sourceTree = "SOURCE_ROOT"; };
+               C76271530EB4458B6146D463 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPGenerator.h"; path = "../../Source/Utility/PIPs/jucer_PIPGenerator.h"; sourceTree = "SOURCE_ROOT"; };
+               CC1C5F8E5DE34223FEC59673 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioPluginFilterTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               CCD62DB0A19A985A4B9D7F32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_Android.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_Android.h"; sourceTree = "SOURCE_ROOT"; };
+               CCEA34A55813C7C4E58254F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_BuildTabStatusComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               CF6C8BD0DA3D8CD4E99EBADA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+               D00F311BFC3C2625C457CB9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+               D045BD5943BD38F2720FF5F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FontPropertyComponent.h"; path = "../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               D05BD91B6105827B010E1C20 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               D1739728A79A2062418B8EF0 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_StaticLibrary.svg"; path = "../../Source/BinaryData/Icons/wizard_StaticLibrary.svg"; sourceTree = "SOURCE_ROOT"; };
+               D1F9B0E9F5D54FE48BEB46EA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               D251114072E67CA86D9913D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ClassDatabase.h"; path = "../../Source/LiveBuildEngine/jucer_ClassDatabase.h"; sourceTree = "SOURCE_ROOT"; };
+               D2FE76E4CF003856278343CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CompileEngineServer.cpp"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.cpp"; sourceTree = "SOURCE_ROOT"; };
+               D4EB334E5186D1584EC63CA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioComponentSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               D5795F8CAC5876714DAB355F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AnimatedComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               D5EF5961B1F0E3FAED32E30A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_CLion.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_CLion.h"; sourceTree = "SOURCE_ROOT"; };
+               D6390A40B3279E0E626C78D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ColouredElement.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp"; sourceTree = "SOURCE_ROOT"; };
+               D766BB9D8C32B5560F0493F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               D859E9EA11A71BD6E85DC649 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DependencyPathPropertyComponent.cpp"; path = "../../Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+               D91E7F8FEF9290195D56782C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_EditorColourSchemeWindowComponent.h"; path = "../../Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               D93E2F2468003DD333371F06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StrokeType.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_StrokeType.h"; sourceTree = "SOURCE_ROOT"; };
+               DA345D5B9DABD049F90DC96F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GeneratedCode.h"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.h"; sourceTree = "SOURCE_ROOT"; };
+               DA4D0CC5149F7C0FBDAF34A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementPath.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h"; sourceTree = "SOURCE_ROOT"; };
+               DB9C8E35DF815B803CB4A9CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               DDC382008FFD9F9E0B2B0EDD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SVGPathDataWindowComponent.h"; path = "../../Source/Application/Windows/jucer_SVGPathDataWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               DE3E6B2614229FAD56D50770 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CompileEngineClient.cpp"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.cpp"; sourceTree = "SOURCE_ROOT"; };
+               DE4A987B2D5529990A6AA9D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AboutWindowComponent.h"; path = "../../Source/Application/Windows/jucer_AboutWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               DFBEB8E086832AEB0FBEADF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StoredSettings.h"; path = "../../Source/Settings/jucer_StoredSettings.h"; sourceTree = "SOURCE_ROOT"; };
+               E111A336FE13C033EAA0A1D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewCppFileTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               E13A54A6D3A1895EACE53E51 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceFile.cpp"; path = "../../Source/ProjectSaving/jucer_ResourceFile.cpp"; sourceTree = "SOURCE_ROOT"; };
+               E1535CDF4258E7D4AB70B5E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ClientServerMessages.h"; path = "../../Source/LiveBuildEngine/jucer_ClientServerMessages.h"; sourceTree = "SOURCE_ROOT"; };
+               E1577F8617C75B91D7399812 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ImageButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ImageButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+               E186BC01A1B1529937A46485 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FileHelpers.h"; path = "../../Source/Utility/Helpers/jucer_FileHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+               E266DE67FF319D56F63193A6 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+               E2B668E2A65AEE8F07B406C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AppearanceSettings.h"; path = "../../Source/Settings/jucer_AppearanceSettings.h"; sourceTree = "SOURCE_ROOT"; };
+               E367FC2BDAF5EBA48D767FBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePathPropertyComponent.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               E3BADF21095BC23DE2CB454F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTreeItemBase.h"; path = "../../Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h"; sourceTree = "SOURCE_ROOT"; };
+               E468FDB5504C5D9315B2D04F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentDocument.h"; path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.h"; sourceTree = "SOURCE_ROOT"; };
+               E5D6C36496F5BC84D7213BE8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               E67999BF57B139E00207A374 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_PIPTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+               E96597BBC6A98255B51B94DC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               E983E6DDE3318B872EBE347F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+               EAC1731150A7F79D59BAA0B6 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_visualStudio.svg"; path = "../../Source/BinaryData/Icons/export_visualStudio.svg"; sourceTree = "SOURCE_ROOT"; };
+               EB2E723DC3DB150A8A644D08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GlobalPathsWindowComponent.h"; path = "../../Source/Application/Windows/jucer_GlobalPathsWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               ED5EAC91D8A0A1911BE9F482 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_ConsoleApp.svg"; path = "../../Source/BinaryData/Icons/wizard_ConsoleApp.svg"; sourceTree = "SOURCE_ROOT"; };
+               ED69863B3D591FB3F0CA50E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutineEditor.h"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h"; sourceTree = "SOURCE_ROOT"; };
+               EE690110171E1648FF2118B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Application.h"; path = "../../Source/Application/jucer_Application.h"; sourceTree = "SOURCE_ROOT"; };
+               EF25A29A2194FC107B40F65F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentLayoutEditor.cpp"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+               EFF38AE74E7267CCC47E8AD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerDocumentEditor.h"; path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h"; sourceTree = "SOURCE_ROOT"; };
+               F073B54B36D845915CD6D2C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementEllipse.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h"; sourceTree = "SOURCE_ROOT"; };
+               F159C1B99ACF1D91E12D978E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_NoWindow.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+               F2E4998FB2C7221587A79F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CodeHelpers.cpp"; path = "../../Source/Utility/Helpers/jucer_CodeHelpers.cpp"; sourceTree = "SOURCE_ROOT"; };
+               F3CC8F26ECCDA6DCD8A284D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GradientPointComponent.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               F4FD9BD16ED2700F45A68C4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentBooleanProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               F5DD97B45B8EA60C1ED0DD80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_StoredSettings.cpp"; path = "../../Source/Settings/jucer_StoredSettings.cpp"; sourceTree = "SOURCE_ROOT"; };
+               F797071D88542C813CF7222A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Module.cpp"; path = "../../Source/Project/jucer_Module.cpp"; sourceTree = "SOURCE_ROOT"; };
+               F7C74E934C954F6F1A3BE4F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationToolWindowComponent.h"; path = "../../Source/Application/Windows/jucer_TranslationToolWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               F8A38C0C7C45F2DB6A5FB812 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_Highlight.svg"; path = "../../Source/BinaryData/Icons/wizard_Highlight.svg"; sourceTree = "SOURCE_ROOT"; };
+               F8F94093A0963D86BD27A95D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DependencyPathPropertyComponent.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+               F9111E150CFF155329D44853 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_OpenDocumentManager.cpp"; path = "../../Source/CodeEditor/jucer_OpenDocumentManager.cpp"; sourceTree = "SOURCE_ROOT"; };
+               FA790C59A304579F660F112F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_CodeBlocks.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h"; sourceTree = "SOURCE_ROOT"; };
+               FB80347407261BF6CCEFDE91 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+               FCEBE24EA79A13713D7CBF26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentColourProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h"; sourceTree = "SOURCE_ROOT"; };
+               FE20FE5805A02A4843048200 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjucerLookAndFeel.h"; path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.h"; sourceTree = "SOURCE_ROOT"; };
+               FF68231DE2B395461009116C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_MSVC.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_MSVC.h"; sourceTree = "SOURCE_ROOT"; };
+               FFE01768CF1C8DBDAA894F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutinePanel.cpp"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp"; sourceTree = "SOURCE_ROOT"; };
+               EB1D55A76652399EB81CC1F0 = {isa = PBXGroup; children = (
+                                       DE4A987B2D5529990A6AA9D4,
+                                       B83DAADA1A871F21582FFB23,
+                                       D91E7F8FEF9290195D56782C,
+                                       C736264708F3F68BA745BA29,
+                                       EB2E723DC3DB150A8A644D08,
+                                       124232706D1C8A3CA49E70CD,
+                                       DDC382008FFD9F9E0B2B0EDD,
+                                       F7C74E934C954F6F1A3BE4F9,
+                                       92926A4D3CC4BB2A9D35EB0B, ); name = Windows; sourceTree = "<group>"; };
+               BC67FD952A6F210A11A1ECB8 = {isa = PBXGroup; children = (
+                                       EB1D55A76652399EB81CC1F0,
+                                       7CA44FF0BA319517C6E39651,
+                                       EE690110171E1648FF2118B8,
+                                       0D4D508C638BC74943B9976D,
+                                       4D698BF12BCD6B0896BCDF17,
+                                       23A8DE16C0CDB8EED18B008B,
+                                       0400CB0E056A1D840304D2DE,
+                                       2EEB1C074162F363C6599282,
+                                       6E6140969908E7619F858740,
+                                       3F8EC008960DBEB2A5D3C3F4,
+                                       8C52A3DDA62A746AA7A68535,
+                                       9069981E414A631B036CC9AC,
+                                       2CD34A70B4032C0426F7AA10,
+                                       B6496F16ACE80CACC5721570,
+                                       4818A05DE44ADA03D85E1083, ); name = Application; sourceTree = "<group>"; };
+               8CF70DA9AB4725126B9F55BE = {isa = PBXGroup; children = (
+                                       129F2DE0FEF154F8F8C7A74E,
+                                       0B24F292A357ABFD9BCC6D7F,
+                                       576A92E1E0D8F453EC0FEB34,
+                                       996E472B82A75531875A5E38, ); name = gradle; sourceTree = "<group>"; };
+               F0F189518721D46C0F94FD56 = {isa = PBXGroup; children = (
+                                       514F2FAFDBF535AC03FA2E6C,
+                                       807049CA2D5B6DE18EA078F2,
+                                       56749E4C72A8F51ACA8F2330,
+                                       42F4AA3EF0883D506987CA99,
+                                       69B478C992FA0B8C885946A6,
+                                       EAC1731150A7F79D59BAA0B6,
+                                       8F4D281E98808204E2846A7D,
+                                       194457D806A26E793584AC0C,
+                                       432EC251A122071809471804,
+                                       B83C9BD89F31EA9E5E12A3C6,
+                                       8FEF6F5EA676B824C021EB6F,
+                                       8FF26BF72A522FBEAAFDDF54,
+                                       2072D6BAE744B53B6FBBDDD8,
+                                       ED5EAC91D8A0A1911BE9F482,
+                                       AEFE3BA0C31EC78A5767A10E,
+                                       5B3532C5F103DAC87B4A5675,
+                                       F8A38C0C7C45F2DB6A5FB812,
+                                       B1C2F8ED14BF914CD1882708,
+                                       62922B3C0620368D1799A653,
+                                       D1739728A79A2062418B8EF0, ); name = Icons; sourceTree = "<group>"; };
+               E59ABA0D11CBAAD77179E9C6 = {isa = PBXGroup; children = (
+                                       9A3B8BBDA8E144A3DF6B9349,
+                                       016A6C52B0B93DE29197FF64,
+                                       D5795F8CAC5876714DAB355F,
+                                       D4EB334E5186D1584EC63CA4,
+                                       203FA6AD7EDDF1F9C338CC2A,
+                                       5BF0374EB908F0476BD8ED42,
+                                       6574A50A8997799705B23465,
+                                       56177921580A4855917E0205,
+                                       079802C6AEE7646010766FE8,
+                                       CC1C5F8E5DE34223FEC59673,
+                                       FB80347407261BF6CCEFDE91,
+                                       2BD9B4556479A8A41740BCAE,
+                                       9E0BA495286388EBF929D578,
+                                       8D9A9A373E4621F7CBFCCCEF,
+                                       59203884BC48D3B7F8DEABA8,
+                                       32C4B61AD995877956B7FA66,
+                                       A66F17E7472E5C19AFE98E46,
+                                       F159C1B99ACF1D91E12D978E,
+                                       97A847B59EE04483E8850E4B,
+                                       A160AEF56553A658E6EA6A8E,
+                                       8336A43CE1C3C26D7C7B53D8,
+                                       C7245390C6C44E89F7526CFC,
+                                       8F67F3C0492EAFEBDBBC12DB,
+                                       E111A336FE13C033EAA0A1D1,
+                                       9E2B1506AC3FDB7863766D59,
+                                       C607639897ED2538CBB860D0,
+                                       023B92AC0340305762412E90,
+                                       3F7C5B53347A487C7FBD2223,
+                                       4ECF029E3A69BF42FED1503D,
+                                       3DC2ED15A9DFAAEF3D2ACDDF,
+                                       E67999BF57B139E00207A374, ); name = Templates; sourceTree = "<group>"; };
+               A9399733CAA07BDAB958242C = {isa = PBXGroup; children = (
+                                       8CF70DA9AB4725126B9F55BE,
+                                       F0F189518721D46C0F94FD56,
+                                       E59ABA0D11CBAAD77179E9C6,
+                                       41105E536155E394E54BDD35,
+                                       5F6584B675E30761521A9F42,
+                                       59B08C7B13B8EA5137ACA77A,
+                                       8C281F2F8EA3AD614ADF7955,
+                                       4073A12E196BDDADE211E19F,
+                                       58139D8D454051C59E77609B, ); name = BinaryData; sourceTree = "<group>"; };
+               F1B44F007A02A0FAE4DC8D79 = {isa = PBXGroup; children = (
+                                       BC3B310D42C489E8B8D93327,
+                                       51BC758EF5D33197CF543E67,
+                                       35CAE8930F2885F9322D22D5,
+                                       8A82061A978B03745485C3AC,
+                                       F9111E150CFF155329D44853,
+                                       1B5BCD4899A9E295786EB642,
+                                       332AF94C3275FEA8B878D603,
+                                       B9B130F596953116393138DC, ); name = CodeEditor; sourceTree = "<group>"; };
+               2A1D5A24E950E00CDF969502 = {isa = PBXGroup; children = (
+                                       01A37DF94E98D991FEF43628,
+                                       409C636B96A9AC1D732B96F8,
+                                       9E62EC342665C27BA01AFC1A,
+                                       8F731F1F98BAB42F1C3B96AA,
+                                       11DEED05110D3D1D02FCFFB6,
+                                       0543E83BF7D7D9234C396E82,
+                                       630DC5EAA31D3EE60B2D989F,
+                                       705DE88C5C4CC6C871E951B1,
+                                       A49503B646A7BD2BEEFC5CBD,
+                                       E1577F8617C75B91D7399812,
+                                       33B258726F29360D64FD1451,
+                                       9F959ECF8CD9B7314AE604A9,
+                                       73DE14CEAD25D3445457013E,
+                                       0AE75B0ACD368A4C0FBC2CD0,
+                                       35CFCC15CBA46F4513940A2A,
+                                       868B459E02F0877EBE3D56F1,
+                                       8DFE6D8AFB8057790041300B,
+                                       A22F64D1E4BD4B8FA366DAAD,
+                                       055636565C2F512E40114582, ); name = Components; sourceTree = "<group>"; };
+               18139A4BCB7C14043C72B9E1 = {isa = PBXGroup; children = (
+                                       BF301C2E545AEB4AC112C176,
+                                       9F2D3E5FC10F7C3270908E97,
+                                       1DCA18E935A35D29D2D9B6A0,
+                                       E468FDB5504C5D9315B2D04F, ); name = Documents; sourceTree = "<group>"; };
+               497FD8DD8175790E4885736B = {isa = PBXGroup; children = (
+                                       D6390A40B3279E0E626C78D3,
+                                       9914F905BFCFBE5F76619670,
+                                       8D178CAEE6D89DE33233313F,
+                                       C402C21DFAC1F8BF121144F1,
+                                       F3CC8F26ECCDA6DCD8A284D2,
+                                       9B6FD3FEDB6D91AD0A80EF97,
+                                       512D80BE12634967A085A1DC,
+                                       4AE469CD40BDAD634135785E,
+                                       F073B54B36D845915CD6D2C1,
+                                       988F5C1E40DED02D8B064253,
+                                       BCB6C87E3992930674E54D16,
+                                       72ED72174F9DBD0ABD8AFCED,
+                                       7031E8CB6D4D84BD980A0BD0,
+                                       4AE72953E3B3DF06D3B9BA86,
+                                       DA4D0CC5149F7C0FBDAF34A2,
+                                       355379844A5E6A097038C280,
+                                       77EA01E7D04BF889930BFF54,
+                                       B97D60D2531CFD0D8555BA5C,
+                                       36E5FBF64A89D5F2A266A5A7,
+                                       7687A1374C60A025BDBE98DE,
+                                       D93E2F2468003DD333371F06, ); name = PaintElements; sourceTree = "<group>"; };
+               172E2F5D29A894D0BA9231A9 = {isa = PBXGroup; children = (
+                                       7F0A5319912991615FC57945,
+                                       F4FD9BD16ED2700F45A68C4F,
+                                       7E2013F425E231C6D865DDD0,
+                                       FCEBE24EA79A13713D7CBF26,
+                                       5783563E39E48ADFC68EB84A,
+                                       2F373F97E30AC1A0BFC1FC61,
+                                       D045BD5943BD38F2720FF5F0,
+                                       B2CB95B3F44C3CC5735051A3,
+                                       85A5E3E71BED93B9A3E07681, ); name = Properties; sourceTree = "<group>"; };
+               0565E54C3060E29ED38B65AB = {isa = PBXGroup; children = (
+                                       EF25A29A2194FC107B40F65F,
+                                       5524B5C9FC6AEAA670B92AA9,
+                                       A0BBBFBA13A1308B3CD725D5,
+                                       00E6B87A43453B51850550E1,
+                                       9BDF2D6255C1CB2CFF376186,
+                                       6F02C3B7FEA3B50692A70DE5,
+                                       39597BD78897CB711AFA945A,
+                                       4E671236FDBD5AD4699740C6,
+                                       351AF80A004D766E314AB76D,
+                                       EFF38AE74E7267CCC47E8AD1,
+                                       6E70C1FA80F02D4C310F63AA,
+                                       ED69863B3D591FB3F0CA50E4,
+                                       FFE01768CF1C8DBDAA894F76,
+                                       65FAD7F6DF65A72B741C2913,
+                                       719B56C8587863D7AE9B69C6,
+                                       0EE17BE4154CF1B2EE683894,
+                                       BDF6AFC5F88581AE395F1DC9,
+                                       75BE2887C6F324B818D80A21,
+                                       24EB4C2412821B8019D6F754,
+                                       BC623CC67AC58297BF6B4C70, ); name = UI; sourceTree = "<group>"; };
+               F6BD840F9A06F2DA891E2CB8 = {isa = PBXGroup; children = (
+                                       2A1D5A24E950E00CDF969502,
+                                       18139A4BCB7C14043C72B9E1,
+                                       497FD8DD8175790E4885736B,
+                                       172E2F5D29A894D0BA9231A9,
+                                       0565E54C3060E29ED38B65AB,
+                                       9EF583A6201DBC813C2F63C4,
+                                       6AC88EFC247C225CC5C11A43,
+                                       133F1E428260C5ADDF496DF9,
+                                       3F9D4C7F6E5779D4E4AE655D,
+                                       78D0DBC4798FF040FDB90F6D,
+                                       DA345D5B9DABD049F90DC96F,
+                                       269A454F1FF081DA67FFD578,
+                                       8F30A53C7FE4BC65171FB3E2,
+                                       9D7689451732AF8333402B3A,
+                                       50498FF6EA3901CBD58223B3,
+                                       C187718F7B9EBA88584B43F3,
+                                       66B49F08C5EC3E4974825FF8,
+                                       5432B7B9B2CF2EAEC8B66D5C, ); name = ComponentEditor; sourceTree = "<group>"; };
+               144B649D98AE8316058B8281 = {isa = PBXGroup; children = (
+                                       51CBE59779A36D1B80B26974,
+                                       BB187CD608EB6368B29EC335,
+                                       790F6302B9A0620F23F8A6C1,
+                                       98E6D61BFF7D85F0E00F0FBF, ); name = Licenses; sourceTree = "<group>"; };
+               9014CA5F3B8D23E883D6975E = {isa = PBXGroup; children = (
+                                       2DF5A61F3C497537634773DF,
+                                       CCEA34A55813C7C4E58254F5,
+                                       0640E34282A97BF73CC8F1EB,
+                                       3BBFA655E129C2D817EA47C9, ); name = UI; sourceTree = "<group>"; };
+               20B39D53B7DAAB53C7533532 = {isa = PBXGroup; children = (
+                                       9014CA5F3B8D23E883D6975E,
+                                       245C81599FB53865A74FC65B,
+                                       D251114072E67CA86D9913D6,
+                                       E1535CDF4258E7D4AB70B5E5,
+                                       DE3E6B2614229FAD56D50770,
+                                       308084CBEE9F7D405D72A5E1,
+                                       A978DFE87D9BB5EFE5B3DAAC,
+                                       D2FE76E4CF003856278343CC,
+                                       BA186B51EE4884CD8E3F2741,
+                                       A081306A9E95CA114B81910F,
+                                       ADD6A3CF5D7DE55E57E8E38B,
+                                       A9954DC7F876A7006743ACB6,
+                                       ADA538034910F52FDD2DC88D,
+                                       8F685EFEFD6EE399058DE842,
+                                       159DE1FEE2099398983CDDF0,
+                                       B24E3F34C3C4EE54A60C35CC,
+                                       55DEDCEB35AA1FB54C74B375,
+                                       3EA27F52A254912218F4DE94,
+                                       182CB1F96890620A202C6524, ); name = LiveBuildEngine; sourceTree = "<group>"; };
+               236D186F5A6536C59D6E751C = {isa = PBXGroup; children = (
+                                       861E52D9AFECADF079BB1F2C,
+                                       4974E7808F9B57E9A627F878,
+                                       68C1949F56295D5871C1F223,
+                                       5E4EB84A7983AB31366A3490,
+                                       1C80C7672975C1FF9AAC4A4F,
+                                       E3BADF21095BC23DE2CB454F,
+                                       95EAB6EC9B724538B93910D4,
+                                       68F41A216E7454E7442AB1F4, ); name = Sidebar; sourceTree = "<group>"; };
+               EBC037ECAAC8156B8B19DC69 = {isa = PBXGroup; children = (
+                                       236D186F5A6536C59D6E751C,
+                                       32ECBC08D903418CA0825870,
+                                       A509BC22854D50E4C786EB32,
+                                       516D6D7C564DD5DF5C15CB06,
+                                       16751E04B0F3737BDF52CEB4,
+                                       B3528C08B84CBC950252EA69,
+                                       1B0F18E1D96F727C062B05FA,
+                                       92A66A8BD87F98EB6B4FB6D0, ); name = UI; sourceTree = "<group>"; };
+               89E9055A179B4C2019B4E1AE = {isa = PBXGroup; children = (
+                                       EBC037ECAAC8156B8B19DC69,
+                                       F797071D88542C813CF7222A,
+                                       7211101FFA28400ADBB1D47A,
+                                       BAC43B20E14A340CCF14119C,
+                                       BF3CEF080FA013E2778DCE90,
+                                       B8385E9A644BD3CD94876448, ); name = Project; sourceTree = "<group>"; };
+               4DCC5D64BBE8DE85360A3D57 = {isa = PBXGroup; children = (
+                                       CCD62DB0A19A985A4B9D7F32,
+                                       D5EF5961B1F0E3FAED32E30A,
+                                       FA790C59A304579F660F112F,
+                                       59520B8137E6A2E483074399,
+                                       FF68231DE2B395461009116C,
+                                       20075A86A4D0E8A5B973D9DB,
+                                       C3BB9F92B02B06D04A73794C,
+                                       8DBB36126CD144A8364F1F19,
+                                       4FF81FC167C924C47BD8C1C9,
+                                       9EE3141E20C9CE3EA182FA04,
+                                       E13A54A6D3A1895EACE53E51,
+                                       25BE1265FE6C6EA3473A3A0A, ); name = ProjectSaving; sourceTree = "<group>"; };
+               EC535A977A1A114BC5DAE7B3 = {isa = PBXGroup; children = (
+                                       BE618CE21C794BDEE319E328,
+                                       E2B668E2A65AEE8F07B406C8,
+                                       F5DD97B45B8EA60C1ED0DD80,
+                                       DFBEB8E086832AEB0FBEADF0, ); name = Settings; sourceTree = "<group>"; };
+               AA2CBF47682AE479C1A387BE = {isa = PBXGroup; children = (
+                                       F2E4998FB2C7221587A79F8B,
+                                       23D79A22569BEDF63B57DD36,
+                                       C3E04CD5A93A45154894E624,
+                                       B403AF75EAF361ED74EE476E,
+                                       E186BC01A1B1529937A46485,
+                                       486E8D02DAD2A0BF54A901C0,
+                                       983CFBA01CA8811F30FA7F4C,
+                                       58F1FF52E887887A93E84FC2,
+                                       A6C4AE13FB409DE414094CFA,
+                                       6FD8DBC0FF42C87D8BEE2452,
+                                       00515BA4EC5A7D4DC078ED37, ); name = Helpers; sourceTree = "<group>"; };
+               B4972C4048154E5E783D3934 = {isa = PBXGroup; children = (
+                                       191330B20DAC08B890656EA0,
+                                       C76271530EB4458B6146D463, ); name = PIPs; sourceTree = "<group>"; };
+               15F56361B9CF3E0BE705E64D = {isa = PBXGroup; children = (
+                                       9EB33734D0DBD0370AB1247B,
+                                       D859E9EA11A71BD6E85DC649,
+                                       F8F94093A0963D86BD27A95D,
+                                       E367FC2BDAF5EBA48D767FBB,
+                                       59F8A47C0020D62C8836A1E7, ); name = PropertyComponents; sourceTree = "<group>"; };
+               DD068F16F341D15E150CE6F1 = {isa = PBXGroup; children = (
+                                       15F56361B9CF3E0BE705E64D,
+                                       169DD91232C070C4D6470B31,
+                                       846B2A670C5A19DE0039E11A,
+                                       C59E624F099CC785F27429EB,
+                                       4D5F0CA8D1273144681A1D48,
+                                       00841B7EDDE9C19890F03267,
+                                       0F8C000E5FF4A2DAC1FEF8EB,
+                                       FE20FE5805A02A4843048200,
+                                       0CECD562059DFD7FBFB37E3C,
+                                       3D6FD9C0065BF16568EC0AB7,
+                                       28D0199327887FFABF9C3F20, ); name = UI; sourceTree = "<group>"; };
+               2B1F885AA027E1A76A1C32E3 = {isa = PBXGroup; children = (
+                                       AA2CBF47682AE479C1A387BE,
+                                       B4972C4048154E5E783D3934,
+                                       DD068F16F341D15E150CE6F1, ); name = Utility; sourceTree = "<group>"; };
+               73BAA89A783BBDD79AA27964 = {isa = PBXGroup; children = (
+                                       A69024A225F2AC31F17B1314,
+                                       11DC04468BC6023671017EBF,
+                                       087CB3A961CD3C7434D660A4,
+                                       4B083E951ECB62217C46CB01,
+                                       C2990A8D054BC230E7C637C3,
+                                       8BD8E9DA627D6EF9BA10FB9E,
+                                       3C95FA2AA91EBA19ADDD5C29,
+                                       8A825FDDC00DD253F44D2C3A,
+                                       4A4EBDAD8D098F72CE053235,
+                                       0F01067432AC314EAC213C1C,
+                                       A44A774EFC020D3D046A9249,
+                                       9992E6950C64322A11E39ADF,
+                                       05D67B5A8D64947C067C0945,
+                                       A085174413736ACC8D7D42A2,
+                                       471C7B0A8B92320AF0C80839,
+                                       714267352CE5C4357ADBC231,
+                                       C09BBB58CA45B66D693E8C31, ); name = Wizards; sourceTree = "<group>"; };
+               D3109994DA6AD871BE85C4E2 = {isa = PBXGroup; children = (
+                                       BC67FD952A6F210A11A1ECB8,
+                                       A9399733CAA07BDAB958242C,
+                                       F1B44F007A02A0FAE4DC8D79,
+                                       F6BD840F9A06F2DA891E2CB8,
+                                       144B649D98AE8316058B8281,
+                                       20B39D53B7DAAB53C7533532,
+                                       89E9055A179B4C2019B4E1AE,
+                                       4DCC5D64BBE8DE85360A3D57,
+                                       EC535A977A1A114BC5DAE7B3,
+                                       2B1F885AA027E1A76A1C32E3,
+                                       73BAA89A783BBDD79AA27964, ); name = Projucer; sourceTree = "<group>"; };
+               8A24D1B6925535A868974986 = {isa = PBXGroup; children = (
+                                       58DE91CE6B05AFBACADDB251,
+                                       BA159A3B7D129771F5C15EA3,
+                                       AA1C44E89D792DDC4867B2C8,
+                                       69555CEFC6ED613AA3949298,
+                                       21F4833C5B5C17B159B956F3,
+                                       B6F2905330EA5C560D527209,
+                                       7AB7640968FAAC73072FBD10,
+                                       D05BD91B6105827B010E1C20, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               2C6746F66EF4444F53B3221F = {isa = PBXGroup; children = (
+                                       8702F43110E4CCA5E5F827F5,
+                                       472F9A90F685220D730EBF6C,
+                                       4F687965FBE86EAFDB3ACFEC,
+                                       805A3A5FBA3B9E28363DD77B,
+                                       DB9C8E35DF815B803CB4A9CF,
+                                       D766BB9D8C32B5560F0493F3,
+                                       1DE5BBC777FB64798D823002,
+                                       5867DC4E39DF8539B54C0D59,
+                                       1B9B5A37F079FE3B3CF8FAB6,
+                                       0462692BAA9CD1BE6DFBCC33,
+                                       AECE3914F5119A3D586A5635,
+                                       364D1A9B113320407A7E57B9, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               8180B5894A78501084B8F133 = {isa = PBXGroup; children = (
+                                       E266DE67FF319D56F63193A6,
+                                       6678E9B3EEACAD47F438B264,
+                                       951128CA33CCDEF570436B1C, ); name = Resources; sourceTree = "<group>"; };
+               0FFEF043CA89142B18C79ABE = {isa = PBXGroup; children = (
+                                       80D62B907248523E6943298B,
+                                       5A75806B34E4EA6598A6024A,
+                                       7B3F7ECF6DBF8C8EE5C2CB86,
+                                       210CD22F25F2C22F9CEEB025,
+                                       D00F311BFC3C2625C457CB9B,
+                                       D1F9B0E9F5D54FE48BEB46EA,
+                                       728FE25157E9874D50BBECB2,
+                                       E983E6DDE3318B872EBE347F,
+                                       8F7BE18698ADCEF51CDE4A5C,
+                                       842427CFE565F3FCE5B99174,
+                                       E96597BBC6A98255B51B94DC,
+                                       431D30038CBF67F80E8B3A13,
+                                       9F01BA9942D038EA8B5289A8,
+                                       E5D6C36496F5BC84D7213BE8,
+                                       CF6C8BD0DA3D8CD4E99EBADA, ); name = Frameworks; sourceTree = "<group>"; };
+               92ABB8016546F41128399E9D = {isa = PBXGroup; children = (
+                                       09DE066936CF037E9709ADB1, ); name = Products; sourceTree = "<group>"; };
+               3CC531922CC2D398E283A845 = {isa = PBXGroup; children = (
+                                       D3109994DA6AD871BE85C4E2,
+                                       8A24D1B6925535A868974986,
+                                       2C6746F66EF4444F53B3221F,
+                                       8180B5894A78501084B8F133,
+                                       0FFEF043CA89142B18C79ABE,
+                                       92ABB8016546F41128399E9D, ); name = Source; sourceTree = "<group>"; };
+               0CC6C439D038EDA0D7F10DF0 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++11";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "_DEBUG=1",
                                        "DEBUG=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=5.4.1",
-                                       "JUCE_APP_VERSION_HEX=0x50401",
+                                       "JUCE_APP_VERSION=5.3.2",
+                                       "JUCE_APP_VERSION_HEX=0x50302",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
-                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code -Wzero-as-null-pointer-constant";
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer;
-                               PRODUCT_NAME = "Projucer";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               0BC15DC2E5FE5ECFFB398D49 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               0BC15DC2E5FE5ECFFB398D49 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++11";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "_NDEBUG=1",
                                        "NDEBUG=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=5.4.1",
-                                       "JUCE_APP_VERSION_HEX=0x50401",
+                                       "JUCE_APP_VERSION=5.3.2",
+                                       "JUCE_APP_VERSION_HEX=0x50302",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
-                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code -Wzero-as-null-pointer-constant";
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer;
-                               PRODUCT_NAME = "Projucer";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               C42924A24AB55E6A940423EA = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               C42924A24AB55E6A940423EA = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "Projucer";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               70135D15D7E0D8410C42BBA3 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               70135D15D7E0D8410C42BBA3 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "Projucer";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               50E3FDD15B8D8C9793DFABF9 = {
-                       isa = PBXTargetDependency;
-                       target = 0039FE1A254FE518518BF8B8;
-               };
-               F90407F24422C589DA251604 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               C42924A24AB55E6A940423EA,
-                               70135D15D7E0D8410C42BBA3,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               0655A4A348F7F91F77583ADC = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               0CC6C439D038EDA0D7F10DF0,
-                               0BC15DC2E5FE5ECFFB398D49,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               C262D0F297DDE25326F5AC81 = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               2610F357881240ACBF612F48,
-                               1321E6C1C6170B6C898AD09D,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               5CB869A8DA78BE6FA2757034 = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               6DD9DA1677A6CF789CDAB478,
-                               954A036F5DDB375DB23FFB3E,
-                               95B44E6C74B1DED31DBE37EB,
-                               AA9D0B8E23F3D87A23DE9F8A,
-                               98F9BB4612E82EE59689E15C,
-                               09C4EDDF7F8B6E75EA3CE3A9,
-                               71713DE4716DCEDB45A206E2,
-                               940CE4E081E9E685243C07AA,
-                               49EEEA5B74D38F3C5A8794F1,
-                               6FD9428439B572B558EF64EA,
-                               6EAAAAB0C2B2DA259B26D63C,
-                               4C0F95265A230E5A8717A0A9,
-                               FFA8B18CDF2D2AA500698A96,
-                               EE26A1C2DAAB609362F407EA,
-                               4FAAB649E846BA2764C02ACE,
-                               7D750EF5FCE1E1A461D435BE,
-                               537ABF1DB09DDBD1542A2B0C,
-                               290F2CD930097091B8DB122E,
-                               4B2F2DAA45060D3F250D0AE4,
-                               BDD30804C9424526A1122A28,
-                               37D582DA2227E004BFA237EC,
-                               9B8ED9D50406E5D75DEE57F5,
-                               89116B0BD882B51C63A84425,
-                               63D97E01F2C4C91037CB65BD,
-                               45A53AF13B0D663050632E8C,
-                               C2A85091A28C907A4E1E1687,
-                               83431B7234A78ECFB3C15F63,
-                               209FCCC2155A1FCB7E11E20D,
-                               C93569F47B4AC1A8E37992ED,
-                               1B988E139004D8E2850EB656,
-                               6FD0752A5CADCF60D79FDBB7,
-                               D25EBE02B55DB244BE0D5635,
-                               85E7FCB0516EFF853FA7B380,
-                               CC6C4D351BA9B473E5F95791,
-                               05A08E366EBF8D650974E695,
-                               3FCA61C401007B243E2E9035,
-                               30B921C38DCEE787B294B746,
-                               244567D3AE2E417A8CB2B95E,
-                               26D6AEA321E80ABCC3CCCCD1,
-                               4E6DC4778D583C48C3CCD4DC,
-                               EE722B47BC36CC8A87E0FB76,
-                               2DF375B40A64BB3778F7ABD1,
-                               8BE478303CDF061B72F219E2,
-                               BF913199032B4CE970E82AA3,
-                               25EF9B3FECB4C9F0F522DCAA,
-                               638C7247B6DBA67EFE46E124,
-                               D0E26EB54B0087C8BE3D541E,
-                               468548FB21D264DC12321327,
-                               6ECB2F11D2F593FACCCF99DB,
-                               95F56FB44C669F93AE77E465,
-                               518DD443B6F17A5AFD707263,
-                               B7EBA1A83575F48CD08140B9,
-                               3C5267E06A897B0DC0F7EA50,
-                               202DC8CF15ACBE096CC327EA,
-                               5DD883699B85E4C492CAD065,
-                               D5C9125F65493CA481F18E53,
-                               02E8F35A8E0D4A0DF6F38D60,
-                               234B6BA2952CBC7C61EF70EF,
-                               254A7C08594A152C2C646334,
-                               F15F0512666FF8CDC0D08905,
-                               B18248959DDC44EF4E85320A,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               D150288A32EE596408C2B99F = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               A578EAD4BB55680E8097BE0F,
-                               C1B9334AE849F93FB3C56B34,
-                               8B4A593B3869815BBAC3EF93,
-                               A14C2C2725DA3CA7995D2815,
-                               1E76E36772355E2A43CF4961,
-                               241F29FCBB7A17BB44A0B10C,
-                               9359F9401D59B4517F75C39C,
-                               091A57B4B9CE623E75E9A756,
-                               FAB47E69F7D9DCE1F906AA07,
-                               0E884E47A637D6C65154699A,
-                               49C22786B54C5DC94E4654B8,
-                               CDEF9FF2D119476D707305DF,
-                               96EC6315E1B3F1A109F84BAF,
-                               11D42F7EC6E6539D79A7F4B1,
-                               B980464FA2761CCD64B1FAD6,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               0039FE1A254FE518518BF8B8 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = 0655A4A348F7F91F77583ADC;
-                       buildPhases = (
-                               C262D0F297DDE25326F5AC81,
-                               5CB869A8DA78BE6FA2757034,
-                               D150288A32EE596408C2B99F,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "Projucer - App";
-                       productName = Projucer;
-                       productReference = 09DE066936CF037E9709ADB1;
-                       productType = "com.apple.product-type.application";
-               };
-               74EA481348A24104E6ACE009 = {
-                       isa = PBXProject;
-                       buildConfigurationList = F90407F24422C589DA251604;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 3CC531922CC2D398E283A845;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (0039FE1A254FE518518BF8B8);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               50E3FDD15B8D8C9793DFABF9 = {isa = PBXTargetDependency; target = 0039FE1A254FE518518BF8B8; };
+               F90407F24422C589DA251604 = {isa = XCConfigurationList; buildConfigurations = (
+                                       C42924A24AB55E6A940423EA,
+                                       70135D15D7E0D8410C42BBA3, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               0655A4A348F7F91F77583ADC = {isa = XCConfigurationList; buildConfigurations = (
+                                       0CC6C439D038EDA0D7F10DF0,
+                                       0BC15DC2E5FE5ECFFB398D49, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               C262D0F297DDE25326F5AC81 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       2610F357881240ACBF612F48,
+                                       1321E6C1C6170B6C898AD09D, ); runOnlyForDeploymentPostprocessing = 0; };
+               5CB869A8DA78BE6FA2757034 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       6DD9DA1677A6CF789CDAB478,
+                                       954A036F5DDB375DB23FFB3E,
+                                       95B44E6C74B1DED31DBE37EB,
+                                       AA9D0B8E23F3D87A23DE9F8A,
+                                       98F9BB4612E82EE59689E15C,
+                                       09C4EDDF7F8B6E75EA3CE3A9,
+                                       71713DE4716DCEDB45A206E2,
+                                       940CE4E081E9E685243C07AA,
+                                       49EEEA5B74D38F3C5A8794F1,
+                                       6FD9428439B572B558EF64EA,
+                                       6EAAAAB0C2B2DA259B26D63C,
+                                       4C0F95265A230E5A8717A0A9,
+                                       FFA8B18CDF2D2AA500698A96,
+                                       EE26A1C2DAAB609362F407EA,
+                                       4FAAB649E846BA2764C02ACE,
+                                       7D750EF5FCE1E1A461D435BE,
+                                       537ABF1DB09DDBD1542A2B0C,
+                                       290F2CD930097091B8DB122E,
+                                       4B2F2DAA45060D3F250D0AE4,
+                                       BDD30804C9424526A1122A28,
+                                       37D582DA2227E004BFA237EC,
+                                       9B8ED9D50406E5D75DEE57F5,
+                                       89116B0BD882B51C63A84425,
+                                       63D97E01F2C4C91037CB65BD,
+                                       45A53AF13B0D663050632E8C,
+                                       C2A85091A28C907A4E1E1687,
+                                       83431B7234A78ECFB3C15F63,
+                                       209FCCC2155A1FCB7E11E20D,
+                                       C93569F47B4AC1A8E37992ED,
+                                       1B988E139004D8E2850EB656,
+                                       6FD0752A5CADCF60D79FDBB7,
+                                       D25EBE02B55DB244BE0D5635,
+                                       85E7FCB0516EFF853FA7B380,
+                                       CC6C4D351BA9B473E5F95791,
+                                       05A08E366EBF8D650974E695,
+                                       3FCA61C401007B243E2E9035,
+                                       30B921C38DCEE787B294B746,
+                                       244567D3AE2E417A8CB2B95E,
+                                       26D6AEA321E80ABCC3CCCCD1,
+                                       4E6DC4778D583C48C3CCD4DC,
+                                       EE722B47BC36CC8A87E0FB76,
+                                       2DF375B40A64BB3778F7ABD1,
+                                       8BE478303CDF061B72F219E2,
+                                       BF913199032B4CE970E82AA3,
+                                       25EF9B3FECB4C9F0F522DCAA,
+                                       638C7247B6DBA67EFE46E124,
+                                       2BEC1197D981951D8A897F01,
+                                       D0E26EB54B0087C8BE3D541E,
+                                       468548FB21D264DC12321327,
+                                       6ECB2F11D2F593FACCCF99DB,
+                                       95F56FB44C669F93AE77E465,
+                                       518DD443B6F17A5AFD707263,
+                                       B7EBA1A83575F48CD08140B9,
+                                       3C5267E06A897B0DC0F7EA50,
+                                       202DC8CF15ACBE096CC327EA,
+                                       5DD883699B85E4C492CAD065,
+                                       D5C9125F65493CA481F18E53,
+                                       02E8F35A8E0D4A0DF6F38D60,
+                                       234B6BA2952CBC7C61EF70EF,
+                                       254A7C08594A152C2C646334,
+                                       F15F0512666FF8CDC0D08905,
+                                       B18248959DDC44EF4E85320A, ); runOnlyForDeploymentPostprocessing = 0; };
+               D150288A32EE596408C2B99F = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       A578EAD4BB55680E8097BE0F,
+                                       C1B9334AE849F93FB3C56B34,
+                                       8B4A593B3869815BBAC3EF93,
+                                       A14C2C2725DA3CA7995D2815,
+                                       1E76E36772355E2A43CF4961,
+                                       241F29FCBB7A17BB44A0B10C,
+                                       9359F9401D59B4517F75C39C,
+                                       091A57B4B9CE623E75E9A756,
+                                       FAB47E69F7D9DCE1F906AA07,
+                                       0E884E47A637D6C65154699A,
+                                       49C22786B54C5DC94E4654B8,
+                                       CDEF9FF2D119476D707305DF,
+                                       96EC6315E1B3F1A109F84BAF,
+                                       11D42F7EC6E6539D79A7F4B1,
+                                       B980464FA2761CCD64B1FAD6, ); runOnlyForDeploymentPostprocessing = 0; };
+               0039FE1A254FE518518BF8B8 = {isa = PBXNativeTarget; buildConfigurationList = 0655A4A348F7F91F77583ADC; buildPhases = (
+                                       C262D0F297DDE25326F5AC81,
+                                       5CB869A8DA78BE6FA2757034,
+                                       D150288A32EE596408C2B99F, ); buildRules = ( ); dependencies = (  ); name = "Projucer - App"; productName = Projucer; productReference = 09DE066936CF037E9709ADB1; productType = "com.apple.product-type.application"; };
+               74EA481348A24104E6ACE009 = {isa = PBXProject; buildConfigurationList = F90407F24422C589DA251604; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 3CC531922CC2D398E283A845; projectDirPath = ""; projectRoot = ""; targets = (0039FE1A254FE518518BF8B8); };
        };
        rootObject = 74EA481348A24104E6ACE009;
 }
index e799256f221fd3f8b0a83849594b2da0cdfc9cae..2f2992ca0a5adb11f51f5348f65a5049316a8671 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{E4CFCE31-1AF5-C360-751D-9682E333BE4D}</ProjectGuid>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,6 +25,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v120</PlatformToolset>\r
+    <PlatformToolset>v120</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
@@ -31,6 +34,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v120</PlatformToolset>\r
+    <PlatformToolset>v120</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Projucer</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\Source\Utility\Helpers\jucer_FileHelpers.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\Helpers\jucer_MiscUtilities.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp"/>\r
+    <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_JucerTreeViewBase.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_ProjucerLookAndFeel.cpp"/>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExporter.h"/>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectSaver.h"/>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h"/>\r
-    <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h"/>\r
     <ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h"/>\r
     <ClInclude Include="..\..\Source\Settings\jucer_StoredSettings.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_CodeHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\jucer_IconButton.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\jucer_Icons.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/>\r
-    <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/>\r
     <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/>\r
     <None Include="..\..\Source\BinaryData\colourscheme_light.xml"/>\r
     <None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/>\r
index 80e1150c5894c8c3a2464384bf4fd23be3283b5e..4163efab29f42fff8b3acdcdcb1bd97f8bb21161 100644 (file)
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp">\r
       <Filter>Projucer\Utility\PIPs</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp">\r
+      <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp">\r
       <Filter>Projucer\Utility\UI</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h">\r
       <Filter>Projucer\ProjectSaving</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h">\r
-      <Filter>Projucer\ProjectSaving</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h">\r
       <Filter>Projucer\Settings</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h">\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h">\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg">\r
       <Filter>Projucer\BinaryData\Icons</Filter>\r
     </None>\r
-    <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs">\r
-      <Filter>Projucer\BinaryData\Templates</Filter>\r
-    </None>\r
     <None Include="..\..\Source\BinaryData\colourscheme_dark.xml">\r
       <Filter>Projucer\BinaryData</Filter>\r
     </None>\r
index 7b50854b4bbd8bc317256648c3eda6a0589b9b5c..1c354c762fd9be739eb829a2527b544ec26b79bb 100644 (file)
@@ -7,7 +7,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  5,4,1,0\r
+FILEVERSION  5,3,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -16,9 +16,9 @@ BEGIN
       VALUE "CompanyName",  "ROLI Ltd.\0"\r
       VALUE "LegalCopyright",  "ROLI Ltd.\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "5.4.1\0"\r
+      VALUE "FileVersion",  "5.3.2\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "5.4.1\0"\r
+      VALUE "ProductVersion",  "5.3.2\0"\r
     END\r
   END\r
 \r
index c8c284673f746bd564ff9e65ee4fa8da8cb6b942..a7039ba26a87e72f81d73074f941943341335334 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{E4CFCE31-1AF5-C360-751D-9682E333BE4D}</ProjectGuid>\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,6 +25,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v140</PlatformToolset>\r
+    <PlatformToolset>v140</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
@@ -31,6 +34,7 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v140</PlatformToolset>\r
+    <PlatformToolset>v140</PlatformToolset>\r
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Projucer</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v140</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\Source\Utility\Helpers\jucer_FileHelpers.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\Helpers\jucer_MiscUtilities.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp"/>\r
+    <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_JucerTreeViewBase.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_ProjucerLookAndFeel.cpp"/>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExporter.h"/>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectSaver.h"/>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h"/>\r
-    <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h"/>\r
     <ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h"/>\r
     <ClInclude Include="..\..\Source\Settings\jucer_StoredSettings.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_CodeHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\jucer_IconButton.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\jucer_Icons.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/>\r
-    <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/>\r
     <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/>\r
     <None Include="..\..\Source\BinaryData\colourscheme_light.xml"/>\r
     <None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/>\r
index 99cfe492bbf43d72f5682eb5c181dafb28f4ec2d..8d2da9e4f24b1a907bc99beb31e99d68e00debff 100644 (file)
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp">\r
       <Filter>Projucer\Utility\PIPs</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp">\r
+      <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp">\r
       <Filter>Projucer\Utility\UI</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h">\r
       <Filter>Projucer\ProjectSaving</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h">\r
-      <Filter>Projucer\ProjectSaving</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h">\r
       <Filter>Projucer\Settings</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h">\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h">\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg">\r
       <Filter>Projucer\BinaryData\Icons</Filter>\r
     </None>\r
-    <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs">\r
-      <Filter>Projucer\BinaryData\Templates</Filter>\r
-    </None>\r
     <None Include="..\..\Source\BinaryData\colourscheme_dark.xml">\r
       <Filter>Projucer\BinaryData</Filter>\r
     </None>\r
index 7b50854b4bbd8bc317256648c3eda6a0589b9b5c..1c354c762fd9be739eb829a2527b544ec26b79bb 100644 (file)
@@ -7,7 +7,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  5,4,1,0\r
+FILEVERSION  5,3,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -16,9 +16,9 @@ BEGIN
       VALUE "CompanyName",  "ROLI Ltd.\0"\r
       VALUE "LegalCopyright",  "ROLI Ltd.\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "5.4.1\0"\r
+      VALUE "FileVersion",  "5.3.2\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "5.4.1\0"\r
+      VALUE "ProductVersion",  "5.3.2\0"\r
     END\r
   END\r
 \r
index ee6af07304bbe82fdfa57d40063e5c0e1215a15f..cd8b1d4a7d15427ec3d8502911c4ec3a1ace133b 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{E4CFCE31-1AF5-C360-751D-9682E333BE4D}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Projucer</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
@@ -74,7 +84,6 @@
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ResourceCompile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ResourceCompile>\r
     <ClCompile Include="..\..\Source\Utility\Helpers\jucer_FileHelpers.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\Helpers\jucer_MiscUtilities.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp"/>\r
+    <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_JucerTreeViewBase.cpp"/>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_ProjucerLookAndFeel.cpp"/>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExporter.h"/>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectSaver.h"/>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h"/>\r
-    <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h"/>\r
     <ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h"/>\r
     <ClInclude Include="..\..\Source\Settings\jucer_StoredSettings.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_CodeHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\jucer_IconButton.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\jucer_Icons.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/>\r
-    <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/>\r
     <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/>\r
     <None Include="..\..\Source\BinaryData\colourscheme_light.xml"/>\r
     <None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/>\r
index db33f63ec54fe3630e1d3afbb5c3fce7456369c7..42313cdb1eca8ee164c0812f5ca7bf3d68b5f007 100644 (file)
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp">\r
       <Filter>Projucer\Utility\PIPs</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp">\r
+      <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp">\r
       <Filter>Projucer\Utility\UI</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h">\r
       <Filter>Projucer\ProjectSaving</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h">\r
-      <Filter>Projucer\ProjectSaving</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h">\r
       <Filter>Projucer\Settings</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h">\r
+    <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
       <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h">\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg">\r
       <Filter>Projucer\BinaryData\Icons</Filter>\r
     </None>\r
-    <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs">\r
-      <Filter>Projucer\BinaryData\Templates</Filter>\r
-    </None>\r
     <None Include="..\..\Source\BinaryData\colourscheme_dark.xml">\r
       <Filter>Projucer\BinaryData</Filter>\r
     </None>\r
index 7b50854b4bbd8bc317256648c3eda6a0589b9b5c..1c354c762fd9be739eb829a2527b544ec26b79bb 100644 (file)
@@ -7,7 +7,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  5,4,1,0\r
+FILEVERSION  5,3,2,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -16,9 +16,9 @@ BEGIN
       VALUE "CompanyName",  "ROLI Ltd.\0"\r
       VALUE "LegalCopyright",  "ROLI Ltd.\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "5.4.1\0"\r
+      VALUE "FileVersion",  "5.3.2\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "5.4.1\0"\r
+      VALUE "ProductVersion",  "5.3.2\0"\r
     END\r
   END\r
 \r
index f4ba9f5bc641c27cdaf2878222efb6ea79d248e5..1846127fb2077a3dbc4ebbe64a42102985455a9b 100644 (file)
@@ -31,9 +31,7 @@
 \r
 // BEGIN SECTION A\r
 \r
-#ifndef JUCER_ENABLE_GPL_MODE\r
- #define JUCER_ENABLE_GPL_MODE 0\r
-#endif\r
+#define JUCER_ENABLE_GPL_MODE 0\r
 \r
 // END SECTION A\r
 \r
  #define   JUCE_USE_CURL 1\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
 \r
 #ifndef    JUCE_ALLOW_STATIC_NULL_VARIABLES\r
- #define   JUCE_ALLOW_STATIC_NULL_VARIABLES 0\r
-#endif\r
-\r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define   JUCE_STRICT_REFCOUNTEDPOINTER 1\r
+ //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
 //==============================================================================\r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
  //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0\r
 #endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index 0f57656430ebdb51c16090a8d9e6607b066db787..ff35bfd9479f826593a0c4d376e6e854ef2c28b6 100644 (file)
@@ -6538,14 +6538,9 @@ static const unsigned char temp_binary_data_42[] =
 "        {\r\n"\r
 "            setUsingNativeTitleBar (true);\r\n"\r
 "            setContentOwned (new %%content_component_class%%(), true);\r\n"\r
-"\r\n"\r
-"           #if JUCE_IOS || JUCE_ANDROID\r\n"\r
-"            setFullScreen (true);\r\n"\r
-"           #else\r\n"\r
 "            setResizable (true, true);\r\n"\r
-"            centreWithSize (getWidth(), getHeight());\r\n"\r
-"           #endif\r\n"\r
 "\r\n"\r
+"            centreWithSize (getWidth(), getHeight());\r\n"\r
 "            setVisible (true);\r\n"\r
 "        }\r\n"\r
 "\r\n"\r
@@ -6649,13 +6644,7 @@ static const unsigned char temp_binary_data_43[] =
 "            setUsingNativeTitleBar (true);\r\n"\r
 "            setContentOwned (new %%content_component_class%%(), true);\r\n"\r
 "\r\n"\r
-"           #if JUCE_IOS || JUCE_ANDROID\r\n"\r
-"            setFullScreen (true);\r\n"\r
-"           #else\r\n"\r
-"            setResizable (true, true);\r\n"\r
 "            centreWithSize (getWidth(), getHeight());\r\n"\r
-"           #endif\r\n"\r
-"\r\n"\r
 "            setVisible (true);\r\n"\r
 "        }\r\n"\r
 "\r\n"\r
@@ -7278,194 +7267,8 @@ static const unsigned char temp_binary_data_54[] =
 \r
 const char* jucer_PIPTemplate_h = (const char*) temp_binary_data_54;\r
 \r
-//================== jucer_UnityPluginGUIScript.cs ==================\r
-static const unsigned char temp_binary_data_55[] =\r
-"#if UNITY_EDITOR\n"\r
-"\n"\r
-"using UnityEditor;\n"\r
-"using UnityEngine;\n"\r
-"\n"\r
-"using System.Collections.Generic;\n"\r
-"using System.Runtime.InteropServices;\n"\r
-"\n"\r
-"public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI\n"\r
-"{\n"\r
-"    public override string Name           { get { return \"%%plugin_name%%\"; } }\n"\r
-"    public override string Description    { get { return \"%%plugin_description%%\"; } }\n"\r
-"    public override string Vendor         { get { return \"%%plugin_vendor%%\"; } }\n"\r
-"\n"\r
-"    //==============================================================================\n"\r
-"\t[DllImport(\"%%plugin_name%%\")] static extern System.IntPtr getRenderCallback();\n"\r
-"\n"\r
-"    [DllImport(\"%%plugin_name%%\")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height);\n"\r
-"\n"\r
-"    [DllImport(\"%%plugin_name%%\")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button);\n"\r
-"    [DllImport(\"%%plugin_name%%\")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button);\n"\r
-"    [DllImport(\"%%plugin_name%%\")] static extern void unityMouseUp   (int id, float x, float y, EventModifiers mods);\n"\r
-"\n"\r
-"    [DllImport(\"%%plugin_name%%\")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name);\n"\r
-"\n"\r
-"    [DllImport(\"%%plugin_name%%\")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h);\n"\r
-"\n"\r
-"    //==============================================================================\n"\r
-"    private class PluginGUIInstance\n"\r
-"    {\n"\r
-"        public PluginGUIInstance (ref IAudioEffectPlugin plugin, int id)\n"\r
-"        {\n"\r
-"            instanceID = id;\n"\r
-"\n"\r
-"            float[] arr;\n"\r
-"            plugin.GetFloatBuffer (\"Editor\", out arr, 1);\n"\r
-"            hasEditor = (arr[0] > 0.0f);\n"\r
-"        }\n"\r
-"\n"\r
-"        public void repaint (Rect r)\n"\r
-"        { \n"\r
-"            Vector2 newScreenPosition = GUIUtility.GUIToScreenPoint (r.position);\n"\r
-"\n"\r
-"            if (bounds != r \n"\r
-"                || screenPosition != newScreenPosition)\n"\r
-"            {\n"\r
-"                screenPosition = newScreenPosition;\n"\r
-"                bounds = r;\n"\r
-"\n"\r
-"                unitySetScreenBounds (instanceID, screenPosition.x, screenPosition.y, bounds.width, bounds.height);\n"\r
-"                setupTexture();\n"\r
-"            }\n"\r
-"\n"\r
-"\t\t\tGL.IssuePluginEvent (getRenderCallback(), instanceID);\n"\r
-"\n"\r
-"            texture.SetPixels32 (pixels);\n"\r
-"            texture.Apply();\n"\r
-"\n"\r
-"            EditorGUI.DrawPreviewTexture (bounds, texture);\n"\r
-"        }\n"\r
-"\n"\r
-"        public bool handleMouseEvent (EventType eventType)\n"\r
-"        {\n"\r
-"            Vector2 mousePos = Event.current.mousePosition;\n"\r
-"            EventModifiers mods = Event.current.modifiers;\n"\r
-"\n"\r
-"            if (! bounds.Contains (mousePos))\n"\r
-"                return false;\n"\r
-"\n"\r
-"            Vector2 relativePos = new Vector2 (mousePos.x - bounds.x, mousePos.y - bounds.y);\n"\r
-"\n"\r
-"            if (eventType == EventType.MouseDown)    \n"\r
-"            {\n"\r
-"                unityMouseDown (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);\n"\r
-"                GUIUtility.hotControl = GUIUtility.GetControlID (FocusType.Passive);\n"\r
-"            }\n"\r
-"            else if (eventType == EventType.MouseUp)\n"\r
-"            {\n"\r
-"                unityMouseUp (instanceID, relativePos.x, relativePos.y, mods);\n"\r
-"                GUIUtility.hotControl = 0;\n"\r
-"            }\n"\r
-"            else if (eventType == EventType.MouseDrag)    \n"\r
-"            {\n"\r
-"                unityMouseDrag (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);\n"\r
-"            }\n"\r
-"\n"\r
-"            Event.current.Use();\n"\r
-"\n"\r
-"            return true;\n"\r
-"        }\n"\r
-"\n"\r
-"        public void handleKeyEvent (EventType eventType)\n"\r
-"        {\n"\r
-"            if (eventType == EventType.KeyDown)\n"\r
-"            {\n"\r
-"                KeyCode code = Event.current.keyCode;\n"\r
-"\n"\r
-"                if (code == KeyCode.None)\n"\r
-"                    return;\n"\r
-"\n"\r
-"                EventModifiers mods = Event.current.modifiers;\n"\r
-"\n"\r
-"                unityKeyEvent (instanceID, code, mods, code.ToString());\n"\r
-"            }\n"\r
-"        }\n"\r
-"\n"\r
-"        private void setupTexture()\n"\r
-"        {\n"\r
-"            if (pixelHandle.IsAllocated)\n"\r
-"                pixelHandle.Free();\n"\r
-"\n"\r
-"            texture = new Texture2D ((int) bounds.width, (int) bounds.height, TextureFormat.ARGB32, false);\n"\r
-"\n"\r
-"            pixels = texture.GetPixels32();\n"\r
-"            pixelHandle = GCHandle.Alloc (pixels, GCHandleType.Pinned);\n"\r
-"\n"\r
-"            unityInitialiseTexture (instanceID, pixelHandle.AddrOfPinnedObject(), texture.width, texture.height);\n"\r
-"        }\n"\r
-"\n"\r
-"        public int instanceID = -1;\n"\r
-"        public bool hasEditor;\n"\r
-"\n"\r
-"        private Vector2 screenPosition;\n"\r
-"        private Rect bounds;\n"\r
-"\n"\r
-"        private Texture2D texture;\n"\r
-"        private Color32[] pixels;\n"\r
-"        private GCHandle pixelHandle;\n"\r
-"    }\n"\r
-"    List<PluginGUIInstance> guis = new List<PluginGUIInstance>();\n"\r
-"\n"\r
-"    private PluginGUIInstance getGUIInstanceForPlugin (ref IAudioEffectPlugin plugin)\n"\r
-"    {\n"\r
-"        float[] idArray;\n"\r
-"        plugin.GetFloatBuffer (\"ID\", out idArray, 1);\n"\r
-"\n"\r
-"        int id = (int) idArray[0];\n"\r
-"\n"\r
-"        for (int i = 0; i < guis.Count; ++i)\n"\r
-"        {\n"\r
-"            if (guis[i].instanceID == id)\n"\r
-"                return guis[i];\n"\r
-"        }\n"\r
-"\n"\r
-"        PluginGUIInstance newInstance = new PluginGUIInstance (ref plugin, id);\n"\r
-"        guis.Add (newInstance);\n"\r
-"\n"\r
-"        return guis[guis.Count - 1];\n"\r
-"    }\n"\r
-"\n"\r
-"    //==============================================================================\n"\r
-"    public override bool OnGUI (IAudioEffectPlugin plugin)\n"\r
-"    {\n"\r
-"        PluginGUIInstance guiInstance = getGUIInstanceForPlugin (ref plugin);\n"\r
-"\n"\r
-"        if (! guiInstance.hasEditor)\n"\r
-"            return true;\n"\r
-"\n"\r
-"        float[] arr;\n"\r
-"        plugin.GetFloatBuffer (\"Size\", out arr, 6);\n"\r
-"\n"\r
-"        Rect r = GUILayoutUtility.GetRect (arr[0], arr[1],\n"\r
-"                                           new GUILayoutOption[] { GUILayout.MinWidth (arr[2]), GUILayout.MinHeight (arr[3]),\n"\r
-"                                                                   GUILayout.MaxWidth (arr[4]), GUILayout.MaxHeight (arr[5]) });\n"\r
-"\n"\r
-"        int controlID = GUIUtility.GetControlID (FocusType.Passive);\n"\r
-"        Event currentEvent = Event.current;\n"\r
-"        EventType currentEventType = currentEvent.GetTypeForControl (controlID);\n"\r
-"\n"\r
-"        if (currentEventType == EventType.Repaint)\n"\r
-"            guiInstance.repaint (r);\n"\r
-"        else if (currentEvent.isMouse)\n"\r
-"            guiInstance.handleMouseEvent (currentEventType);\n"\r
-"        else if (currentEvent.isKey)\n"\r
-"            guiInstance.handleKeyEvent (currentEventType);\n"\r
-"\n"\r
-"        return false;\n"\r
-"    }\n"\r
-"}\n"\r
-"\n"\r
-"#endif\n";\r
-\r
-const char* jucer_UnityPluginGUIScript_cs = (const char*) temp_binary_data_55;\r
-\r
 //================== colourscheme_dark.xml ==================\r
-static const unsigned char temp_binary_data_56[] =\r
+static const unsigned char temp_binary_data_55[] =\r
 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"\r
 "\r\n"\r
 "<COLOUR_SCHEME font=\"&lt;Monospaced&gt;; 13.0\">\r\n"\r
@@ -7490,10 +7293,10 @@ static const unsigned char temp_binary_data_56[] =
 "  <COLOUR name=\"Error\" colour=\"FFE60000\"/>\r\n"\r
 "</COLOUR_SCHEME>\r\n";\r
 \r
-const char* colourscheme_dark_xml = (const char*) temp_binary_data_56;\r
+const char* colourscheme_dark_xml = (const char*) temp_binary_data_55;\r
 \r
 //================== colourscheme_light.xml ==================\r
-static const unsigned char temp_binary_data_57[] =\r
+static const unsigned char temp_binary_data_56[] =\r
 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"\r
 "\r\n"\r
 "<COLOUR_SCHEME font=\"&lt;Monospaced&gt;; 13.0\">\r\n"\r
@@ -7518,16 +7321,16 @@ static const unsigned char temp_binary_data_57[] =
 "  <COLOUR name=\"Error\" colour=\"ffcc0000\"/>\r\n"\r
 "</COLOUR_SCHEME>\r\n";\r
 \r
-const char* colourscheme_light_xml = (const char*) temp_binary_data_57;\r
+const char* colourscheme_light_xml = (const char*) temp_binary_data_56;\r
 \r
 //================== nothingtoseehere.txt ==================\r
-static const unsigned char temp_binary_data_58[] =\r
+static const unsigned char temp_binary_data_57[] =\r
 "VUEtMTk3NTkzMTgtNA==";\r
 \r
-const char* nothingtoseehere_txt = (const char*) temp_binary_data_58;\r
+const char* nothingtoseehere_txt = (const char*) temp_binary_data_57;\r
 \r
 //================== offlinepage.html ==================\r
-static const unsigned char temp_binary_data_59[] =\r
+static const unsigned char temp_binary_data_58[] =\r
 "<html>\n"\r
 "  <head>\n"\r
 "    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=11\">\n"\r
@@ -7571,10 +7374,10 @@ static const unsigned char temp_binary_data_59[] =
 "  </body>\n"\r
 "</html>";\r
 \r
-const char* offlinepage_html = (const char*) temp_binary_data_59;\r
+const char* offlinepage_html = (const char*) temp_binary_data_58;\r
 \r
 //================== projucer_EULA.txt ==================\r
-static const unsigned char temp_binary_data_60[] =\r
+static const unsigned char temp_binary_data_59[] =\r
 "\r\n"\r
 "IMPORTANT NOTICE: PLEASE READ CAREFULLY BEFORE INSTALLING THE SOFTWARE:\r\n"\r
 "\r\n"\r
@@ -7738,10 +7541,10 @@ static const unsigned char temp_binary_data_60[] =
 "\r\n"\r
 "10.6. Please note that this License, its subject matter and its formation, are governed by English law. You and we both agree to that the courts of England and Wales will have exclusive jurisdiction.\r\n";\r
 \r
-const char* projucer_EULA_txt = (const char*) temp_binary_data_60;\r
+const char* projucer_EULA_txt = (const char*) temp_binary_data_59;\r
 \r
 //================== RecentFilesMenuTemplate.nib ==================\r
-static const unsigned char temp_binary_data_61[] =\r
+static const unsigned char temp_binary_data_60[] =\r
 { 98,112,108,105,115,116,48,48,212,0,1,0,2,0,3,0,4,0,5,0,6,1,53,1,54,88,36,118,101,114,115,105,111,110,88,36,111,98,106,101,99,116,115,89,36,97,114,99,104,105,118,101,114,84,36,116,111,112,18,0,1,134,160,175,16,74,0,7,0,8,0,31,0,35,0,36,0,42,0,46,0,50,\r
 0,53,0,57,0,74,0,77,0,78,0,86,0,87,0,97,0,112,0,113,0,114,0,119,0,120,0,121,0,124,0,128,0,129,0,132,0,143,0,144,0,145,0,149,0,153,0,162,0,163,0,164,0,169,0,173,0,180,0,181,0,182,0,185,0,192,0,193,0,200,0,201,0,208,0,209,0,216,0,217,0,224,0,225,0,226,\r
 0,229,0,230,0,232,0,249,1,11,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,47,1,50,85,36,110,117,108,108,219,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,\r
@@ -7778,14 +7581,13 @@ static const unsigned char temp_binary_data_61[] =
 7,157,7,159,7,161,7,163,7,165,7,167,7,169,7,171,7,173,7,175,7,177,7,179,7,181,7,190,7,192,7,225,7,227,7,229,7,231,7,233,7,235,7,237,7,239,7,241,7,243,7,245,7,247,7,249,7,251,7,253,7,255,8,2,8,5,8,8,8,11,8,14,8,17,8,20,8,23,8,26,8,29,8,32,8,35,8,38,8,\r
 41,8,44,8,53,8,55,8,56,8,65,8,67,8,68,8,77,8,92,8,97,8,115,8,120,8,134,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,0,0 };\r
 \r
-const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_61;\r
+const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_60;\r
 \r
 \r
 const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)\r
 {\r
     unsigned int hash = 0;\r
-\r
-    if (resourceNameUTF8 != nullptr)\r
+    if (resourceNameUTF8 != 0)\r
         while (*resourceNameUTF8 != 0)\r
             hash = 31 * hash + (unsigned int) *resourceNameUTF8++;\r
 \r
@@ -7833,8 +7635,8 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)
         case 0x28d496ad:  numBytes = 1233; return jucer_InlineComponentTemplate_h;\r
         case 0x8905395b:  numBytes = 473; return jucer_MainConsoleAppTemplate_cpp;\r
         case 0x5e5ea047:  numBytes = 2021; return jucer_MainTemplate_NoWindow_cpp;\r
-        case 0xda2391f8:  numBytes = 4127; return jucer_MainTemplate_SimpleWindow_cpp;\r
-        case 0x400bc026:  numBytes = 4127; return jucer_MainTemplate_Window_cpp;\r
+        case 0xda2391f8:  numBytes = 4012; return jucer_MainTemplate_SimpleWindow_cpp;\r
+        case 0x400bc026:  numBytes = 3972; return jucer_MainTemplate_Window_cpp;\r
         case 0xf4842835:  numBytes = 1491; return jucer_NewComponentTemplate_cpp;\r
         case 0xe7bf237a:  numBytes = 646; return jucer_NewComponentTemplate_h;\r
         case 0x02a2a077:  numBytes = 278; return jucer_NewCppFileTemplate_cpp;\r
@@ -7846,7 +7648,6 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)
         case 0xbc050edc:  numBytes = 4926; return jucer_PIPAudioProcessorTemplate_h;\r
         case 0xf4ca9e9a:  numBytes = 2447; return jucer_PIPMain_cpp;\r
         case 0x0b16e320:  numBytes = 517; return jucer_PIPTemplate_h;\r
-        case 0xcd472557:  numBytes = 6433; return jucer_UnityPluginGUIScript_cs;\r
         case 0x763d39dc:  numBytes = 1050; return colourscheme_dark_xml;\r
         case 0xe8b08520:  numBytes = 1050; return colourscheme_light_xml;\r
         case 0x938e96ec:  numBytes = 20; return nothingtoseehere_txt;\r
@@ -7917,7 +7718,6 @@ const char* namedResourceList[] =
     "jucer_PIPAudioProcessorTemplate_h",\r
     "jucer_PIPMain_cpp",\r
     "jucer_PIPTemplate_h",\r
-    "jucer_UnityPluginGUIScript_cs",\r
     "colourscheme_dark_xml",\r
     "colourscheme_light_xml",\r
     "nothingtoseehere_txt",\r
@@ -7983,7 +7783,6 @@ const char* originalFilenames[] =
     "jucer_PIPAudioProcessorTemplate.h",\r
     "jucer_PIPMain.cpp",\r
     "jucer_PIPTemplate.h",\r
-    "jucer_UnityPluginGUIScript.cs",\r
     "colourscheme_dark.xml",\r
     "colourscheme_light.xml",\r
     "nothingtoseehere.txt",\r
index cad7d24f635106f0ad1262e69e95c1904674e0ca..79fa6ece5e21722f25118980da94ab6fc8b5d85c 100644 (file)
@@ -135,10 +135,10 @@ namespace BinaryData
     const int            jucer_MainTemplate_NoWindow_cppSize = 2021;\r
 \r
     extern const char*   jucer_MainTemplate_SimpleWindow_cpp;\r
-    const int            jucer_MainTemplate_SimpleWindow_cppSize = 4127;\r
+    const int            jucer_MainTemplate_SimpleWindow_cppSize = 4012;\r
 \r
     extern const char*   jucer_MainTemplate_Window_cpp;\r
-    const int            jucer_MainTemplate_Window_cppSize = 4127;\r
+    const int            jucer_MainTemplate_Window_cppSize = 3972;\r
 \r
     extern const char*   jucer_NewComponentTemplate_cpp;\r
     const int            jucer_NewComponentTemplate_cppSize = 1491;\r
@@ -173,9 +173,6 @@ namespace BinaryData
     extern const char*   jucer_PIPTemplate_h;\r
     const int            jucer_PIPTemplate_hSize = 517;\r
 \r
-    extern const char*   jucer_UnityPluginGUIScript_cs;\r
-    const int            jucer_UnityPluginGUIScript_csSize = 6433;\r
-\r
     extern const char*   colourscheme_dark_xml;\r
     const int            colourscheme_dark_xmlSize = 1050;\r
 \r
@@ -195,7 +192,7 @@ namespace BinaryData
     const int            RecentFilesMenuTemplate_nibSize = 2842;\r
 \r
     // Number of elements in the namedResourceList and originalFileNames arrays.\r
-    const int namedResourceListSize = 62;\r
+    const int namedResourceListSize = 61;\r
 \r
     // Points to the start of a list of resource names.\r
     extern const char* namedResourceList[];\r
index b91e805c91a8095ba6bf135846bf27b2f6818e92..c62718aff37121a50b57830680146874a292ca5c 100644 (file)
@@ -35,8 +35,7 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "Projucer";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
-    const char* const  versionString  = "5.4.1";\r
-    const int          versionNumber  = 0x50401;\r
+    const char* const  versionString  = "5.3.2";\r
+    const int          versionNumber  = 0x50302;\r
 }\r
 #endif\r
index 86b9720c216a4a0fa1bc5b30fa1f4e2af63a9a21..9444f7102f8116e220cc92caa3220a6fc89ae854 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
-              jucerVersion="5.4.1" version="5.4.1" bundleIdentifier="com.juce.theprojucer"\r
+              jucerVersion="5.3.1" version="5.3.2" bundleIdentifier="com.juce.theprojucer"\r
               defines="" splashScreenColour="Dark" displaySplashScreen="0"\r
               reportAppUsage="0" companyName="ROLI Ltd." companyCopyright="ROLI Ltd."\r
               cppLanguageStandard="11">\r
   <EXPORTFORMATS>\r
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"\r
                documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="rv1F4h"\r
-               extraLinkerFlags="" extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code -Wzero-as-null-pointer-constant"\r
+               extraLinkerFlags="" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
                customPList="&lt;plist&gt;&#10;&lt;dict&gt;&#10;&#9;&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;&#10;&#9;&lt;dict&gt;&#10;&#9;&#9;&lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;&#10;&#9;&#9;&lt;true/&gt;&#10;&#9;&#9;&lt;key&gt;NSExceptionDomains&lt;/key&gt;&#10;&#9;&#9;&lt;dict&gt;&#10;&#9;&#9;&#9;&lt;key&gt;amazonaws.com&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;dict&gt;&#10;&#9;&#9;&#9;&#9;&lt;key&gt;NSExceptionAllowsInsecureHTTPLoads&lt;/key&gt;&#10;&#9;&#9;&#9;&#9;&lt;true/&gt;&#10;&#9;&#9;&#9;&#9;&lt;key&gt;NSIncludesSubdomains&lt;/key&gt;&#10;&#9;&#9;&#9;&#9;&lt;true/&gt;&#10;&#9;&#9;&#9;&lt;/dict&gt;&#10;&#9;&#9;&lt;/dict&gt;&#10;&#9;&lt;/dict&gt;&#10;&lt;/dict&gt;&#10;&lt;/plist&gt;"\r
                extraFrameworks="AudioUnit; Accelerate; AVFoundation; CoreAudio; CoreAudioKit; CoreMIDI; DiscRecording; QuartzCore; AudioToolbox; OpenGL; QTKit; QuickTime">\r
       <CONFIGURATIONS>\r
@@ -67,7 +67,7 @@
         <MODULEPATH id="juce_analytics" path="../../modules"/>\r
       </MODULEPATHS>\r
     </VS2015>\r
-    <VS2017 targetFolder="Builds/VisualStudio2017" bigIcon="rv1F4h" extraCompilerFlags="/w44265 /w45038 /w44062">\r
+    <VS2017 targetFolder="Builds/VisualStudio2017" bigIcon="rv1F4h">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="Projucer" useRuntimeLibDLL="0"/>\r
         <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Projucer"\r
               file="Source/BinaryData/Templates/jucer_PIPMain.cpp"/>\r
         <FILE id="WqDCf0" name="jucer_PIPTemplate.h" compile="0" resource="1"\r
               file="Source/BinaryData/Templates/jucer_PIPTemplate.h"/>\r
-        <FILE id="wrkU1v" name="jucer_UnityPluginGUIScript.cs" compile="0"\r
-              resource="1" file="Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs"/>\r
       </GROUP>\r
       <FILE id="oXM3fR" name="colourscheme_dark.xml" compile="0" resource="1"\r
             file="Source/BinaryData/colourscheme_dark.xml"/>\r
             file="Source/ProjectSaving/jucer_ResourceFile.cpp"/>\r
       <FILE id="d4INvx" name="jucer_ResourceFile.h" compile="0" resource="0"\r
             file="Source/ProjectSaving/jucer_ResourceFile.h"/>\r
-      <FILE id="kw0nyx" name="jucer_XcodeProjectParser.h" compile="0" resource="0"\r
-            file="Source/ProjectSaving/jucer_XcodeProjectParser.h"/>\r
     </GROUP>\r
     <GROUP id="{DC7C1395-DD88-0C6C-2D8A-EC48A63D31E8}" name="Settings">\r
       <FILE id="DsopUB" name="jucer_AppearanceSettings.cpp" compile="1" resource="0"\r
         <GROUP id="{FE8C76CF-7C05-EC86-8997-C9941B88670B}" name="PropertyComponents">\r
           <FILE id="eleFsw" name="jucer_ColourPropertyComponent.h" compile="0"\r
                 resource="0" file="Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h"/>\r
+          <FILE id="D0OfLg" name="jucer_DependencyPathPropertyComponent.cpp"\r
+                compile="1" resource="0" file="Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp"/>\r
+          <FILE id="gcbJOL" name="jucer_DependencyPathPropertyComponent.h" compile="0"\r
+                resource="0" file="Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h"/>\r
           <FILE id="sfUzaf" name="jucer_FilePathPropertyComponent.h" compile="0"\r
                 resource="0" file="Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"/>\r
-          <FILE id="c5PWPd" name="jucer_LabelPropertyComponent.h" compile="0"\r
-                resource="0" file="Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h"/>\r
           <FILE id="DkLOIQ" name="jucer_PropertyComponentsWithEnablement.h" compile="0"\r
                 resource="0" file="Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h"/>\r
         </GROUP>\r
             resource="0" file="Source/Wizards/jucer_TemplateThumbnailsComponent.h"/>\r
     </GROUP>\r
   </MAINGROUP>\r
-  <JUCEOPTIONS JUCE_LOG_ASSERTIONS="1" JUCE_USE_CURL="1" JUCE_ALLOW_STATIC_NULL_VARIABLES="0"\r
-               JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+  <JUCEOPTIONS JUCE_LOG_ASSERTIONS="1" JUCE_USE_CURL="1"/>\r
   <MODULES>\r
     <MODULE id="juce_analytics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
     <MODULE id="juce_core" showAllCode="1"/>\r
index ac8a48e5ddb13834baeb648136c1511e2b7ae469..978324745851f542f7027e5df3f30b45c221da3c 100644 (file)
@@ -35,9 +35,11 @@ public:
     EditorColourSchemeWindowComponent()\r
     {\r
         if (getAppSettings().monospacedFontNames.size() == 0)\r
-            changeContent (new AppearanceEditor::FontScanPanel());\r
+            content.reset (new AppearanceEditor::FontScanPanel());\r
         else\r
-            changeContent (new AppearanceEditor::EditorPanel());\r
+            content.reset (new AppearanceEditor::EditorPanel());\r
+\r
+        changeContent (content.get());\r
     }\r
 \r
     void paint (Graphics& g) override\r
@@ -113,9 +115,9 @@ private:
                 const auto width = font.getStringWidth ("....");\r
 \r
                 return width == font.getStringWidth ("WWWW")\r
-                    && width == font.getStringWidth ("0000")\r
-                    && width == font.getStringWidth ("1111")\r
-                    && width == font.getStringWidth ("iiii");\r
+                && width == font.getStringWidth ("0000")\r
+                && width == font.getStringWidth ("1111")\r
+                && width == font.getStringWidth ("iiii");\r
             }\r
 \r
             StringArray fontsToScan, fontsFound;\r
index 29a71d3c14577fb1b448bb681b86180c8daa863e..a6c9a7c511512ef15c9201e77dbc170ef75cbb44 100644 (file)
 \r
 #pragma once\r
 \r
-#include "../../Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h"\r
 \r
 //==============================================================================\r
 class GlobalPathsWindowComponent    : public Component,\r
-                                      private Timer,\r
-                                      private Value::Listener\r
+                                      private Timer\r
 {\r
 public:\r
     GlobalPathsWindowComponent()\r
     {\r
-        addChildComponent (rescanJUCEPathButton);\r
-        rescanJUCEPathButton.onClick = [this]\r
-        {\r
-            ProjucerApplication::getApp().rescanJUCEPathModules();\r
-            lastJUCEModulePath = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get();\r
-        };\r
+        addLabelsAndSetProperties();\r
 \r
-        addChildComponent (rescanUserPathButton);\r
-        rescanUserPathButton.onClick = [this]\r
-        {\r
-            ProjucerApplication::getApp().rescanUserPathModules();\r
-            lastUserModulePath = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get();\r
-        };\r
+        addAndMakeVisible (info);\r
+        info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. "\r
+                               "\nN.B. These paths are stored locally and will only be used when "\r
+                               "saving a project on this machine. Other machines will have their own "\r
+                               "locally stored paths.");\r
 \r
-        addAndMakeVisible (resetToDefaultsButton);\r
-        resetToDefaultsButton.onClick = [this] { resetCurrentOSPathsToDefaults(); };\r
+        addAndMakeVisible (osSelector);\r
+        osSelector.addItem ("OSX", 1);\r
+        osSelector.addItem ("Windows", 2);\r
+        osSelector.addItem ("Linux", 3);\r
 \r
-        addAndMakeVisible (propertyViewport);\r
-        propertyViewport.setViewedComponent (&propertyGroup, false);\r
+        osSelector.onChange = [this]\r
+        {\r
+            addLabelsAndSetProperties();\r
+            updateFilePathPropertyComponents();\r
+        };\r
 \r
         auto os = TargetOS::getThisOS();\r
 \r
-        if      (os == TargetOS::osx)     selectedOSValue = "osx";\r
-        else if (os == TargetOS::windows) selectedOSValue = "windows";\r
-        else if (os == TargetOS::linux)   selectedOSValue = "linux";\r
-\r
-        selectedOSValue.addListener (this);\r
-\r
-        buildProps();\r
+        if      (os == TargetOS::osx)     osSelector.setSelectedId (1);\r
+        else if (os == TargetOS::windows) osSelector.setSelectedId (2);\r
+        else if (os == TargetOS::linux)   osSelector.setSelectedId (3);\r
 \r
-        lastJUCEModulePath = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get();\r
-        lastUserModulePath = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get();\r
-    }\r
-\r
-    ~GlobalPathsWindowComponent()\r
-    {\r
-        auto juceValue = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS());\r
-        auto userValue = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS());\r
-\r
-        auto jucePathNeedsScanning = (! juceValue.isUsingDefault() && juceValue.get() != lastJUCEModulePath);\r
-        auto userPathNeedsScanning = (! userValue.isUsingDefault() && userValue.get() != lastUserModulePath);\r
-\r
-        if (jucePathNeedsScanning)\r
-            ProjucerApplication::getApp().rescanJUCEPathModules();\r
-\r
-        if (userPathNeedsScanning)\r
-            ProjucerApplication::getApp().rescanUserPathModules();\r
+        updateFilePathPropertyComponents();\r
     }\r
 \r
     void paint (Graphics& g) override\r
@@ -100,31 +77,43 @@ public:
     {\r
         auto b = getLocalBounds().reduced (10);\r
 \r
-        auto buttonBounds = b.removeFromBottom (50);\r
+        auto topSlice = b.removeFromTop (25);\r
+        osSelector.setSize (200, 25);\r
+        osSelector.setCentrePosition (topSlice.getCentre());\r
 \r
-        rescanJUCEPathButton.setBounds (buttonBounds.removeFromLeft (150).reduced (5, 10));\r
-        rescanUserPathButton.setBounds (buttonBounds.removeFromLeft (150).reduced (5, 10));\r
+        info.setBounds (osSelector.getBounds().withWidth (osSelector.getHeight()).translated ((osSelector.getWidth() + 5), 0).reduced (2));\r
 \r
-        resetToDefaultsButton.setBounds (buttonBounds.removeFromRight (150).reduced (5, 10));\r
+        int labelIndex = 0;\r
+        bool isFirst = true;\r
 \r
-        propertyGroup.updateSize (0, 0, getWidth() - 20 - propertyViewport.getScrollBarThickness());\r
-        propertyViewport.setBounds (b);\r
+        for (auto* pathComp : pathPropertyComponents)\r
+        {\r
+            if (pathComp == nullptr)\r
+            {\r
+                b.removeFromTop (15);\r
+                pathPropertyLabels.getUnchecked (labelIndex++)->setBounds (b.removeFromTop (20));\r
+                b.removeFromTop (20);\r
+            }\r
+            else\r
+            {\r
+                if (isFirst)\r
+                    b.removeFromTop (20);\r
+\r
+                pathComp->setBounds (b.removeFromTop (pathComp->getPreferredHeight()));\r
+                b.removeFromTop (5);\r
+            }\r
+\r
+            isFirst = false;\r
+        }\r
     }\r
 \r
     void highlightJUCEPath()\r
     {\r
-        if (isTimerRunning() || ! isSelectedOSThisOS())\r
-            return;\r
-\r
-        PropertyComponent* jucePathPropertyComponent = nullptr;\r
-\r
-        for (auto* prop : propertyGroup.properties)\r
-            if (prop->getName() == "Path to JUCE")\r
-                jucePathPropertyComponent = prop;\r
-\r
-        if (jucePathPropertyComponent != nullptr)\r
+        if (! isTimerRunning() && isSelectedOSThisOS())\r
         {\r
-            boundsToHighlight = getLocalArea (&propertyGroup, jucePathPropertyComponent->getBounds());\r
+            if (auto* jucePathComp = pathPropertyComponents.getFirst())\r
+                boundsToHighlight = jucePathComp->getBounds();\r
+\r
             flashAlpha = 0.0f;\r
             hasFlashed = false;\r
 \r
@@ -133,6 +122,16 @@ public:
     }\r
 \r
 private:\r
+    OwnedArray<Label> pathPropertyLabels;\r
+    OwnedArray<PropertyComponent> pathPropertyComponents;\r
+\r
+    ComboBox osSelector;\r
+    InfoButton info;\r
+\r
+    Rectangle<int> boundsToHighlight;\r
+    float flashAlpha = 0.0f;\r
+    bool hasFlashed = false;\r
+\r
     //==============================================================================\r
     void timerCallback() override\r
     {\r
@@ -153,79 +152,69 @@ private:
         repaint();\r
     }\r
 \r
-    void valueChanged (Value&) override\r
-    {\r
-        buildProps();\r
-        resized();\r
-    }\r
-\r
     //==============================================================================\r
     bool isSelectedOSThisOS()    { return TargetOS::getThisOS() == getSelectedOS(); }\r
 \r
     TargetOS::OS getSelectedOS() const\r
     {\r
-        auto val = selectedOSValue.getValue();\r
+        auto selectedOS = TargetOS::unknown;\r
 \r
-        if      (val == "osx")      return TargetOS::osx;\r
-        else if (val == "windows")  return TargetOS::windows;\r
-        else if (val == "linux")    return TargetOS::linux;\r
+        switch (osSelector.getSelectedId())\r
+        {\r
+            case 1: selectedOS = TargetOS::osx;     break;\r
+            case 2: selectedOS = TargetOS::windows; break;\r
+            case 3: selectedOS = TargetOS::linux;   break;\r
+            default:                                break;\r
+        }\r
 \r
-        jassertfalse;\r
-        return TargetOS::unknown;\r
+        return selectedOS;\r
     }\r
 \r
-    //==============================================================================\r
-    void buildProps()\r
+    void updateFilePathPropertyComponents()\r
     {\r
-        updateValues();\r
+        pathPropertyComponents.clear();\r
 \r
-        PropertyListBuilder builder;\r
-        auto isThisOS = isSelectedOSThisOS();\r
+        auto& settings = getAppSettings();\r
 \r
-        builder.add (new ChoicePropertyComponent (selectedOSValue, "OS", { "OSX", "Windows", "Linux" }, { "osx", "windows", "linux" }),\r
-                     "Use this dropdown to set the global paths for different OSes. "\r
-                     "\nN.B. These paths are stored locally and will only be used when "\r
-                     "saving a project on this machine. Other machines will have their own "\r
-                     "locally stored paths.");\r
+        if (isSelectedOSThisOS())\r
+        {\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::jucePath),\r
+                                                                                          "Path to JUCE", true)));\r
 \r
-        builder.add (new LabelPropertyComponent ("JUCE"), {});\r
+            pathPropertyComponents.add (nullptr);\r
 \r
-        builder.add (new FilePathPropertyComponent (jucePathValue, "Path to JUCE", true, isThisOS),\r
-                     "This should be the path to the top-level directory of your JUCE folder. "\r
-                     "This path will be used when searching for the JUCE examples and DemoRunner application.");\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::defaultJuceModulePath),\r
+                                                                                          "JUCE Modules", true)));\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::defaultUserModulePath),\r
+                                                                                          "User Modules", true, {}, {}, true)));\r
 \r
-        builder.add (new FilePathPropertyComponent (juceModulePathValue, "JUCE Modules", true, isThisOS),\r
-                     String ("This should be the path to the folder containing the JUCE modules that you wish to use, typically the \"modules\" directory of your JUCE folder.")\r
-                     + (isThisOS ? " Use the button below to re-scan a new path." : ""));\r
-        builder.add (new FilePathPropertyComponent (userModulePathValue, "User Modules", true, isThisOS, {}, {}, true),\r
-                     String ("A semicolon-separated list of user module paths. These paths will be used to display any non-JUCE modules that are available.")\r
-                     + (isThisOS ? " Use the button below to re-scan new paths." : ""));\r
+            pathPropertyComponents.add (nullptr);\r
 \r
-        builder.add (new LabelPropertyComponent ("SDKs"), {});\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::vst3Path),\r
+                                                                                          "VST3 SDK", true)));\r
 \r
-        builder.add (new FilePathPropertyComponent (vstPathValue,  "VST (Legacy) SDK", true, isThisOS),\r
-                     "If you are building a legacy VST plug-in then this path should point to a VST2 SDK. "\r
-                     "The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. "\r
-                     "You also need a VST2 license from Steinberg to distribute VST2 plug-ins.");\r
-        builder.add (new FilePathPropertyComponent (vst3PathValue, "VST3 SDK", true, isThisOS),\r
-                     "This path can be set to use a custom VST3 SDK instead of the one which is embedded in JUCE.");\r
+            if (getSelectedOS() == TargetOS::linux)\r
+            {\r
+                addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent ({}, "RTAS SDK", true)));\r
+                pathPropertyComponents.getLast()->setEnabled (false);\r
 \r
-        if (getSelectedOS() != TargetOS::linux)\r
-        {\r
-            builder.add (new FilePathPropertyComponent (aaxPathValue, "AAX SDK", true, isThisOS),\r
-                         "If you are building AAX plug-ins, this should be the path to the AAX SDK folder.");\r
-            builder.add (new FilePathPropertyComponent (rtasPathValue, "RTAS SDK", true, isThisOS),\r
-                         "If you are building RTAS plug-ins, this should be the path to the RTAS SDK folder.");\r
-        }\r
+                addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent ({}, "AAX SDK", true)));\r
+                pathPropertyComponents.getLast()->setEnabled (false);\r
+            }\r
+            else\r
+            {\r
+                addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::rtasPath),\r
+                                                                                              "RTAS SDK", true)));\r
+                addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::aaxPath),\r
+                                                                                              "AAX SDK", true)));\r
+            }\r
 \r
-        builder.add (new FilePathPropertyComponent (androidSDKPathValue, "Android SDK", true, isThisOS),\r
-                     "This path will be used when writing the local.properties file of an Android project and should point to the Android SDK folder.");\r
-        builder.add (new FilePathPropertyComponent (androidNDKPathValue, "Android NDK", true, isThisOS),\r
-                     "This path will be used when writing the local.properties file of an Android project and should point to the Android NDK folder.");\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidSDKPath),\r
+                                                                                          "Android SDK", true)));\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidNDKPath),\r
+                                                                                          "Android NDK", true)));\r
 \r
-        if (isThisOS)\r
-        {\r
-            builder.add (new LabelPropertyComponent ("Other"), {});\r
+            pathPropertyComponents.add (nullptr);\r
 \r
            #if JUCE_MAC\r
             String exeLabel ("app");\r
@@ -234,80 +223,66 @@ private:
            #else\r
             String exeLabel ("startup script");\r
            #endif\r
-\r
-            builder.add (new FilePathPropertyComponent (clionExePathValue, "CLion " + exeLabel,          false, isThisOS),\r
-                         "This path will be used for the \"Save Project and Open in IDE...\" option of the CLion exporter.");\r
-            builder.add (new FilePathPropertyComponent (androidStudioExePathValue, "Android Studio " + exeLabel, false, isThisOS),\r
-                         "This path will be used for the \"Save Project and Open in IDE...\" option of the Android Studio exporter.");\r
-\r
-            rescanJUCEPathButton.setVisible (true);\r
-            rescanUserPathButton.setVisible (true);\r
+            addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::clionExePath),\r
+                                                                                          "CLion " + exeLabel, false)));\r
         }\r
         else\r
         {\r
-            rescanJUCEPathButton.setVisible (false);\r
-            rescanUserPathButton.setVisible (false);\r
+            auto selectedOS = getSelectedOS();\r
+            auto maxChars = 1024;\r
+\r
+            pathPropertyComponents.add (nullptr);\r
+\r
+            addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::defaultJuceModulePath, selectedOS),\r
+                                                                                      "JUCE Modules", maxChars, false)));\r
+            addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::defaultUserModulePath, selectedOS),\r
+                                                                                      "User Modules", maxChars, false)));\r
+\r
+            pathPropertyComponents.add (nullptr);\r
+\r
+            addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::vst3Path, selectedOS),\r
+                                                                                      "VST3 SDK", maxChars, false)));\r
+\r
+            if (selectedOS == TargetOS::linux)\r
+            {\r
+                addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (Value(), "RTAS SDK", maxChars, false)));\r
+                pathPropertyComponents.getLast()->setEnabled (false);\r
+\r
+                addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (Value(), "AAX SDK", maxChars, false)));\r
+                pathPropertyComponents.getLast()->setEnabled (false);\r
+            }\r
+            else\r
+            {\r
+                addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::rtasPath, selectedOS),\r
+                                                                                          "RTAS SDK", maxChars, false)));\r
+                addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::aaxPath, selectedOS),\r
+                                                                                          "AAX SDK", maxChars, false)));\r
+            }\r
+\r
+            addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::androidSDKPath, selectedOS),\r
+                                                                                      "Android SDK", maxChars, false)));\r
+            addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::androidNDKPath, selectedOS),\r
+                                                                                      "Android NDK", maxChars, false)));\r
         }\r
 \r
-        propertyGroup.setProperties (builder);\r
+        resized();\r
     }\r
 \r
-    void updateValues()\r
+    void addLabelsAndSetProperties()\r
     {\r
-        auto& settings = getAppSettings();\r
-        auto os = getSelectedOS();\r
-\r
-        jucePathValue             = settings.getStoredPath (Ids::jucePath, os);\r
-        juceModulePathValue       = settings.getStoredPath (Ids::defaultJuceModulePath, os);\r
-        userModulePathValue       = settings.getStoredPath (Ids::defaultUserModulePath, os);\r
-        vstPathValue              = settings.getStoredPath (Ids::vstLegacyPath, os);\r
-        vst3PathValue             = settings.getStoredPath (Ids::vst3Path, os);\r
-        rtasPathValue             = settings.getStoredPath (Ids::rtasPath, os);\r
-        aaxPathValue              = settings.getStoredPath (Ids::aaxPath, os);\r
-        androidSDKPathValue       = settings.getStoredPath (Ids::androidSDKPath, os);\r
-        androidNDKPathValue       = settings.getStoredPath (Ids::androidNDKPath, os);\r
-        clionExePathValue         = settings.getStoredPath (Ids::clionExePath, os);\r
-        androidStudioExePathValue = settings.getStoredPath (Ids::androidStudioExePath, os);\r
-    }\r
+        pathPropertyLabels.clear();\r
 \r
-    void resetCurrentOSPathsToDefaults()\r
-    {\r
-        jucePathValue            .resetToDefault();\r
-        juceModulePathValue      .resetToDefault();\r
-        userModulePathValue      .resetToDefault();\r
-        vstPathValue             .resetToDefault();\r
-        vst3PathValue            .resetToDefault();\r
-        rtasPathValue            .resetToDefault();\r
-        aaxPathValue             .resetToDefault();\r
-        androidSDKPathValue      .resetToDefault();\r
-        androidNDKPathValue      .resetToDefault();\r
-        clionExePathValue        .resetToDefault();\r
-        androidStudioExePathValue.resetToDefault();\r
+        pathPropertyLabels.add (new Label ("modulesLabel", "Modules"));\r
+        pathPropertyLabels.add (new Label ("sdksLabel", "SDKs"));\r
+        pathPropertyLabels.add (new Label ("otherLabel", "Other"));\r
 \r
-        repaint();\r
+        for (auto* l : pathPropertyLabels)\r
+        {\r
+            addAndMakeVisible (l);\r
+            l->setFont (Font (18.0f, Font::FontStyleFlags::bold));\r
+            l->setJustificationType (Justification::centredLeft);\r
+        }\r
     }\r
 \r
-    //==============================================================================\r
-    Value selectedOSValue;\r
-\r
-    ValueWithDefault jucePathValue, juceModulePathValue, userModulePathValue,\r
-                     vst3PathValue, vstPathValue, rtasPathValue, aaxPathValue,\r
-                     androidSDKPathValue, androidNDKPathValue,\r
-                     clionExePathValue, androidStudioExePathValue;\r
-\r
-    Viewport propertyViewport;\r
-    PropertyGroupComponent propertyGroup  { "Global Paths", { getIcons().openFolder, Colours::transparentBlack } };\r
-\r
-    TextButton rescanJUCEPathButton  { "Re-scan JUCE Modules" },\r
-               rescanUserPathButton  { "Re-scan User Modules" },\r
-               resetToDefaultsButton { "Reset to Defaults" };\r
-\r
-    Rectangle<int> boundsToHighlight;\r
-    float flashAlpha = 0.0f;\r
-    bool hasFlashed = false;\r
-\r
-    var lastJUCEModulePath, lastUserModulePath;\r
-\r
-    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlobalPathsWindowComponent)\r
 };\r
index 2a3fc65e68cf874c49a2f5930859728a0825adc0..b439d75ca9110b023caa388d430b30d3930500e7 100644 (file)
@@ -307,6 +307,13 @@ private:
     }\r
 \r
     //==============================================================================\r
+    std::unique_ptr<LookAndFeel> lf;\r
+\r
+    Viewport propertyViewport;\r
+    PropertyGroupComponent propertyGroup  { "PIP Creator", { getIcons().juceLogo, Colours::transparentBlack } };\r
+\r
+    TextButton createButton  { "Create PIP" };\r
+\r
     ValueTree pipTree  { "PIPSettings" };\r
     ValueWithDefault nameValue          { pipTree, Ids::name,          nullptr, "MyComponentPIP" },\r
                      versionValue       { pipTree, Ids::version,       nullptr },\r
@@ -316,19 +323,12 @@ private:
                      dependenciesValue  { pipTree, Ids::dependencies_, nullptr, getModulesRequiredForComponent(), "," },\r
                      exportersValue     { pipTree, Ids::exporters,     nullptr,\r
                                           StringArray (ProjectExporter::getValueTreeNameForExporter (ProjectExporter::getCurrentPlatformExporterName()).toLowerCase()), "," },\r
-                     moduleFlagsValue   { pipTree, Ids::moduleFlags,   nullptr, "JUCE_STRICT_REFCOUNTEDPOINTER=1" },\r
+                     moduleFlagsValue   { pipTree, Ids::moduleFlags,   nullptr },\r
                      definesValue       { pipTree, Ids::defines,       nullptr },\r
                      typeValue          { pipTree, Ids::type,          nullptr, "Component" },\r
                      mainClassValue     { pipTree, Ids::mainClass,     nullptr, "MyComponent" },\r
                      useLocalCopyValue  { pipTree, Ids::useLocalCopy,  nullptr, false };\r
 \r
-    std::unique_ptr<LookAndFeel> lf;\r
-\r
-    Viewport propertyViewport;\r
-    PropertyGroupComponent propertyGroup  { "PIP Creator", { getIcons().juceLogo, Colours::transparentBlack } };\r
-\r
-    TextButton createButton  { "Create PIP" };\r
-\r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PIPCreatorWindowComponent)\r
 };\r
index a3cc6ba7035798021be5a82de67391c90b6ce212..fed80a62aa02ed657440da420c50c35022a6eef3 100644 (file)
@@ -163,7 +163,9 @@ public:
         dragOver = false;\r
         repaint();\r
 \r
-        if (auto element = parseXML (File (files[0])))\r
+        std::unique_ptr<XmlElement> element (XmlDocument::parse (File (files[0])));\r
+\r
+        if (element != nullptr)\r
         {\r
             if (auto* ePath = element->getChildByName ("path"))\r
                 userText.setText (ePath->getStringAttribute ("d"), true);\r
index 58c185724b0d29ea6c6b7cc0d76c7ba7db864ace..c606b225eb536b09d8172267daa5b51ca14b932a 100644 (file)
@@ -77,21 +77,20 @@ void ProjucerApplication::initialise (const String& commandLine)
     {\r
         initialiseLogger ("IDE_Log_");\r
         Logger::writeToLog (SystemStats::getOperatingSystemName());\r
-        Logger::writeToLog ("CPU: " + String (SystemStats::getCpuSpeedInMegahertz())\r
+        Logger::writeToLog ("CPU: " + String (SystemStats::getCpuSpeedInMegaherz())\r
                               + "MHz  Cores: " + String (SystemStats::getNumCpus())\r
                               + "  " + String (SystemStats::getMemorySizeInMegabytes()) + "MB");\r
 \r
         initialiseBasics();\r
 \r
-        isRunningCommandLine = commandLine.isNotEmpty()\r
-                                && ! commandLine.startsWith ("-NSDocumentRevisionsDebugMode");\r
+        isRunningCommandLine = commandLine.isNotEmpty();\r
 \r
         licenseController.reset (new LicenseController);\r
         licenseController->addLicenseStatusChangedCallback (this);\r
 \r
         if (isRunningCommandLine)\r
         {\r
-            auto appReturnCode = performCommandLine (ArgumentList ("Projucer", commandLine));\r
+            const int appReturnCode = performCommandLine (commandLine);\r
 \r
             if (appReturnCode != commandLineNotPerformed)\r
             {\r
@@ -110,9 +109,6 @@ void ProjucerApplication::initialise (const String& commandLine)
             return;\r
         }\r
 \r
-        rescanJUCEPathModules();\r
-        rescanUserPathModules();\r
-\r
         openDocumentManager.registerType (new ProjucerAppClasses::LiveBuildCodeEditorDocument::Type(), 2);\r
 \r
         childProcessCache.reset (new ChildProcessCache());\r
@@ -201,14 +197,6 @@ void ProjucerApplication::initialiseWindows (const String& commandLine)
         showApplicationUsageDataAgreementPopup();\r
 }\r
 \r
-static void deleteTemporaryFiles()\r
-{\r
-    auto tempDirectory = File::getSpecialLocation (File::SpecialLocationType::tempDirectory).getChildFile ("PIPs");\r
-\r
-    if (tempDirectory.exists())\r
-        tempDirectory.deleteRecursively();\r
-}\r
-\r
 void ProjucerApplication::shutdown()\r
 {\r
     if (server != nullptr)\r
@@ -223,7 +211,6 @@ void ProjucerApplication::shutdown()
     aboutWindow.reset();\r
     pathsWindow.reset();\r
     editorColourSchemeWindow.reset();\r
-    pipCreatorWindow.reset();\r
 \r
     if (licenseController != nullptr)\r
     {\r
@@ -619,18 +606,6 @@ void ProjucerApplication::createExamplesPopupMenu (PopupMenu& menu) noexcept
     }\r
 }\r
 \r
-//==========================================================================\r
-static File getJUCEExamplesDirectoryPathFromGlobal()\r
-{\r
-    auto globalPath = File::createFileWithoutCheckingPath (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString()\r
-                                                                           .replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName()));\r
-\r
-    if (globalPath.exists())\r
-        return File (globalPath).getChildFile ("examples");\r
-\r
-    return {};\r
-}\r
-\r
 Array<File> ProjucerApplication::getSortedExampleDirectories() noexcept\r
 {\r
     Array<File> exampleDirectories;\r
@@ -688,10 +663,19 @@ bool ProjucerApplication::findWindowAndOpenPIP (const File& pip)
     return false;\r
 }\r
 \r
+File ProjucerApplication::getJUCEExamplesDirectoryPathFromGlobal() noexcept\r
+{\r
+    auto globalPath = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
+\r
+    if (globalPath.isNotEmpty())\r
+        return File (globalPath).getChildFile ("examples");\r
+\r
+    return {};\r
+}\r
+\r
 void ProjucerApplication::findAndLaunchExample (int selectedIndex)\r
 {\r
     File example;\r
-\r
     for (auto& dir : getSortedExampleDirectories())\r
     {\r
         auto exampleFiles = getSortedExampleFilesInDirectory (dir);\r
@@ -716,189 +700,115 @@ void ProjucerApplication::findAndLaunchExample (int selectedIndex)
     Analytics::getInstance()->logEvent ("Example Opened", data, ProjucerAnalyticsEvent::exampleEvent);\r
 }\r
 \r
-//==========================================================================\r
-static String getPlatformSpecificFileExtension()\r
+File ProjucerApplication::findDemoRunnerExecutable() noexcept\r
 {\r
-   #if JUCE_MAC\r
-    return ".app";\r
-   #elif JUCE_WINDOWS\r
-    return ".exe";\r
-   #elif JUCE_LINUX\r
-    return {};\r
-   #else\r
-    jassertfalse;\r
-    return {};\r
-   #endif\r
-}\r
+    auto buildsPath = getJUCEExamplesDirectoryPathFromGlobal().getChildFile ("DemoRunner").getChildFile ("Builds");\r
 \r
-static File getPlatformSpecificProjectFolder()\r
-{\r
-    auto examplesDir = getJUCEExamplesDirectoryPathFromGlobal();\r
-\r
-    if (examplesDir == File())\r
+    if (! buildsPath.exists())\r
         return {};\r
 \r
-    auto buildsFolder = examplesDir.getChildFile ("DemoRunner").getChildFile ("Builds");\r
-\r
-   #if JUCE_MAC\r
-    return buildsFolder.getChildFile ("MacOSX");\r
-   #elif JUCE_WINDOWS\r
-    return buildsFolder.getChildFile ("VisualStudio2017");\r
-   #elif JUCE_LINUX\r
-    return buildsFolder.getChildFile ("LinuxMakefile");\r
-   #else\r
-    jassertfalse;\r
-    return {};\r
-   #endif\r
-}\r
-\r
-static File tryToFindDemoRunnerExecutableInBuilds()\r
-{\r
-    auto projectFolder = getPlatformSpecificProjectFolder();\r
-\r
-    if (projectFolder == File())\r
-        return {};\r
+    String extension;\r
 \r
    #if JUCE_MAC\r
-    projectFolder = projectFolder.getChildFile ("build");\r
-    auto demoRunnerExecutable = projectFolder.getChildFile ("Release").getChildFile ("DemoRunner.app");\r
+    auto osxBuildFolder = buildsPath.getChildFile ("MacOSX").getChildFile ("build");\r
 \r
+    auto demoRunnerExecutable = osxBuildFolder.getChildFile ("Release").getChildFile ("DemoRunner.app");\r
     if (demoRunnerExecutable.exists())\r
         return demoRunnerExecutable;\r
 \r
-    demoRunnerExecutable = projectFolder.getChildFile ("Debug").getChildFile ("DemoRunner.app");\r
-\r
+    demoRunnerExecutable = osxBuildFolder.getChildFile ("Debug").getChildFile ("DemoRunner.app");\r
     if (demoRunnerExecutable.exists())\r
         return demoRunnerExecutable;\r
+\r
+    extension = ".app";\r
    #elif JUCE_WINDOWS\r
-    projectFolder = projectFolder.getChildFile ("x64");\r
-    auto demoRunnerExecutable = projectFolder.getChildFile ("Release").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
+    auto windowsBuildFolder = buildsPath.getChildFile ("VisualStudio2017").getChildFile ("x64");\r
 \r
+    auto demoRunnerExecutable = windowsBuildFolder.getChildFile ("Release").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
     if (demoRunnerExecutable.existsAsFile())\r
         return demoRunnerExecutable;\r
 \r
-    demoRunnerExecutable = projectFolder.getChildFile ("Debug").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
-\r
+    demoRunnerExecutable = windowsBuildFolder.getChildFile ("Debug").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
     if (demoRunnerExecutable.existsAsFile())\r
         return demoRunnerExecutable;\r
+\r
+    extension = ".exe";\r
    #elif JUCE_LINUX\r
-    projectFolder = projectFolder.getChildFile ("LinuxMakefile").getChildFile ("build");\r
-    auto demoRunnerExecutable = projectFolder.getChildFile ("DemoRunner");\r
+    auto linuxBuildFolder = buildsPath.getChildFile ("LinuxMakefile").getChildFile ("build");\r
+\r
+    auto demoRunnerExecutable = linuxBuildFolder.getChildFile ("DemoRunner");\r
 \r
     if (demoRunnerExecutable.existsAsFile())\r
         return demoRunnerExecutable;\r
-   #endif\r
-\r
-    return {};\r
-}\r
-\r
-static File tryToFindPrebuiltDemoRunnerExecutable()\r
-{\r
-    auto prebuiltFile = File (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString())\r
-                               .getChildFile ("DemoRunner" + getPlatformSpecificFileExtension());\r
 \r
-   #if JUCE_MAC\r
-    if (prebuiltFile.exists())\r
-   #else\r
-    if (prebuiltFile.existsAsFile())\r
+    extension = {};\r
    #endif\r
-        return prebuiltFile;\r
 \r
-    return {};\r
-}\r
+    auto juceDir = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
 \r
-void ProjucerApplication::checkIfGlobalJUCEPathHasChanged()\r
-{\r
-    auto globalJUCEPath = File (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get());\r
-\r
-    if (lastJUCEPath != globalJUCEPath)\r
+    if (juceDir.isNotEmpty())\r
     {\r
-        hasScannedForDemoRunnerProject = false;\r
-        hasScannedForDemoRunnerExecutable = false;\r
+        auto precompiledFile = File (juceDir).getChildFile ("DemoRunner" + extension);\r
 \r
-        lastJUCEPath = globalJUCEPath;\r
+       #if JUCE_MAC\r
+        if (precompiledFile.exists())\r
+       #else\r
+        if (precompiledFile.existsAsFile())\r
+       #endif\r
+            return precompiledFile;\r
     }\r
-}\r
-\r
-File ProjucerApplication::tryToFindDemoRunnerExecutable()\r
-{\r
-    checkIfGlobalJUCEPathHasChanged();\r
-\r
-    if (hasScannedForDemoRunnerExecutable)\r
-        return lastDemoRunnerExectuableFile;\r
-\r
-    hasScannedForDemoRunnerExecutable = true;\r
-\r
-    auto demoRunnerExecutable = tryToFindDemoRunnerExecutableInBuilds();\r
 \r
-    if (demoRunnerExecutable == File())\r
-        demoRunnerExecutable = tryToFindPrebuiltDemoRunnerExecutable();\r
 \r
-    lastDemoRunnerExectuableFile = demoRunnerExecutable;\r
-\r
-    return demoRunnerExecutable;\r
+    return {};\r
 }\r
 \r
-File ProjucerApplication::tryToFindDemoRunnerProject()\r
+File ProjucerApplication::findDemoRunnerProject() noexcept\r
 {\r
-    checkIfGlobalJUCEPathHasChanged();\r
-\r
-    if (hasScannedForDemoRunnerProject)\r
-        return lastDemoRunnerProjectFile;\r
-\r
-    hasScannedForDemoRunnerProject = true;\r
+    auto buildsPath = getJUCEExamplesDirectoryPathFromGlobal().getChildFile ("DemoRunner").getChildFile ("Builds");\r
 \r
-    auto projectFolder = getPlatformSpecificProjectFolder();\r
-\r
-    if (projectFolder == File())\r
-    {\r
-        lastDemoRunnerProjectFile = File();\r
+    if (! buildsPath.exists())\r
         return {};\r
-    }\r
 \r
    #if JUCE_MAC\r
-    auto demoRunnerProjectFile = projectFolder.getChildFile ("DemoRunner.xcodeproj");\r
+    auto file = buildsPath.getChildFile ("MacOSX").getChildFile ("DemoRunner.xcodeproj");\r
+\r
+    if (file.exists())\r
+        return file;\r
    #elif JUCE_WINDOWS\r
-    auto demoRunnerProjectFile = projectFolder.getChildFile ("DemoRunner.sln");\r
+    auto file = buildsPath.getChildFile ("VisualStudio2017").getChildFile ("DemoRunner.sln");\r
+\r
+    if (file.existsAsFile())\r
+        return file;\r
    #elif JUCE_LINUX\r
-    auto demoRunnerProjectFile = projectFolder.getChildFile ("Makefile");\r
-   #endif\r
+    auto file = buildsPath.getChildFile ("LinuxMakeFile").getChildFile ("Makefile");\r
 \r
-   #if JUCE_MAC\r
-    if (! demoRunnerProjectFile.exists())\r
-   #else\r
-    if (! demoRunnerProjectFile.existsAsFile())\r
+    if (file.existsAsFile())\r
+        return file;\r
    #endif\r
-        demoRunnerProjectFile = File();\r
 \r
-    lastDemoRunnerProjectFile = demoRunnerProjectFile;\r
-\r
-    return demoRunnerProjectFile;\r
+    return {};\r
 }\r
 \r
 void ProjucerApplication::launchDemoRunner()\r
 {\r
-    auto demoRunnerFile = tryToFindDemoRunnerExecutable();\r
-\r
-    if (demoRunnerFile != File())\r
+    if (findDemoRunnerExecutable() != File())\r
     {\r
-        auto succeeded = demoRunnerFile.startAsProcess();\r
+        bool succeeded = true;\r
+\r
+        if (! findDemoRunnerExecutable().startAsProcess())\r
+        {\r
+            AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "There was an error opening the Demo Runner file.");\r
+            succeeded = false;\r
+        }\r
 \r
         StringPairArray data;\r
         data.set ("label", succeeded ? "Success" : "Failure");\r
 \r
         Analytics::getInstance()->logEvent ("Launch DemoRunner", data, ProjucerAnalyticsEvent::exampleEvent);\r
-\r
-        if (succeeded)\r
-            return;\r
     }\r
-\r
-    demoRunnerFile = tryToFindDemoRunnerProject();\r
-\r
-    if (demoRunnerFile != File())\r
+    else if (findDemoRunnerProject() != File())\r
     {\r
         auto& lf = Desktop::getInstance().getDefaultLookAndFeel();\r
-\r
         demoRunnerAlert.reset (lf.createAlertWindow ("Open Project",\r
                                                      "Couldn't find a compiled version of the Demo Runner."\r
                                                     #if JUCE_LINUX\r
@@ -910,7 +820,7 @@ void ProjucerApplication::launchDemoRunner()
                                                      AlertWindow::QuestionIcon, 2,\r
                                                      mainWindowList.getFrontmostWindow (false)));\r
 \r
-        demoRunnerAlert->enterModalState (true, ModalCallbackFunction::create ([this, demoRunnerFile] (int retVal)\r
+        demoRunnerAlert->enterModalState (true, ModalCallbackFunction::create ([this] (int retVal)\r
                                                 {\r
                                                     demoRunnerAlert.reset (nullptr);\r
 \r
@@ -921,20 +831,25 @@ void ProjucerApplication::launchDemoRunner()
 \r
                                                     if (retVal == 1)\r
                                                     {\r
+                                                        auto projectFile = findDemoRunnerProject();\r
+\r
                                                        #if JUCE_LINUX\r
-                                                        String command ("make -C " + demoRunnerFile.getParentDirectory().getFullPathName() + " CONFIG=Release -j3");\r
+                                                        String command ("make -C " + projectFile.getParentDirectory().getFullPathName() + " CONFIG=Release -j3");\r
 \r
                                                         if (! makeProcess.start (command))\r
                                                             AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "Error building Demo Runner.");\r
                                                        #else\r
-                                                        demoRunnerFile.startAsProcess();\r
+                                                        projectFile.startAsProcess();\r
                                                        #endif\r
                                                     }\r
                                                 }), false);\r
     }\r
+    else\r
+    {\r
+        jassertfalse;\r
+    }\r
 }\r
 \r
-//==========================================================================\r
 void ProjucerApplication::handleMainMenuCommand (int menuItemID)\r
 {\r
     if (menuItemID >= recentProjectsBaseID && menuItemID < (recentProjectsBaseID + 100))\r
@@ -1025,7 +940,7 @@ void ProjucerApplication::getCommandInfo (CommandID commandID, ApplicationComman
 \r
     case CommandIDs::newPIP:\r
         result.setInfo ("New PIP...", "Opens the PIP Creator utility for creating a new PIP", CommandCategories::general, 0);\r
-        result.defaultKeypresses.add (KeyPress ('p', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0));\r
+            result.defaultKeypresses.add (KeyPress ('p', ModifierKeys::commandModifier, 0));\r
         break;\r
 \r
     case CommandIDs::launchDemoRunner:\r
@@ -1038,8 +953,8 @@ void ProjucerApplication::getCommandInfo (CommandID commandID, ApplicationComman
         else\r
        #endif\r
         {\r
-            result.setInfo ("Launch Demo Runner", "Launches the JUCE demo runner application, or the project if it can't be found", CommandCategories::general, 0);\r
-            result.setActive (tryToFindDemoRunnerExecutable() != File() || tryToFindDemoRunnerProject() != File());\r
+        result.setInfo ("Launch Demo Runner", "Launches the JUCE demo runner application, or the project if it can't be found", CommandCategories::general, 0);\r
+        result.setActive (findDemoRunnerExecutable() != File() || findDemoRunnerProject() != File());\r
         }\r
         break;\r
 \r
@@ -1140,7 +1055,7 @@ bool ProjucerApplication::perform (const InvocationInfo& info)
         case CommandIDs::newPIP:                    createNewPIP(); break;\r
         case CommandIDs::open:                      askUserToOpenFile(); break;\r
         case CommandIDs::launchDemoRunner:          launchDemoRunner(); break;\r
-        case CommandIDs::saveAll:                   saveAllDocuments(); break;\r
+        case CommandIDs::saveAll:                   openDocumentManager.saveAll(); break;\r
         case CommandIDs::closeAllWindows:           closeAllMainWindowsAndQuitIfNeeded(); break;\r
         case CommandIDs::closeAllDocuments:         closeAllDocuments (true); break;\r
         case CommandIDs::clearRecentFiles:          clearRecentFiles(); break;\r
@@ -1205,15 +1120,6 @@ bool ProjucerApplication::openFile (const File& file)
     return mainWindowList.openFile (file);\r
 }\r
 \r
-void ProjucerApplication::saveAllDocuments()\r
-{\r
-    openDocumentManager.saveAll();\r
-\r
-    for (int i = 0; i < mainWindowList.windows.size(); ++i)\r
-        if (auto* pcc = mainWindowList.windows.getUnchecked(i)->getProjectContentComponent())\r
-            pcc->refreshProjectTreeFileStatuses();\r
-}\r
-\r
 bool ProjucerApplication::closeAllDocuments (bool askUserToSave)\r
 {\r
     return openDocumentManager.closeAll (askUserToSave);\r
@@ -1297,7 +1203,7 @@ void ProjucerApplication::showPathsWindow (bool highlightJUCEPath)
     else\r
         new FloatingToolWindow ("Global Paths", "pathsWindowPos",\r
                                 new GlobalPathsWindowComponent(), pathsWindow, false,\r
-                                600, 700, 600, 700, 600, 700);\r
+                                600, 650, 600, 650, 600, 650);\r
 \r
     if (highlightJUCEPath)\r
         if (auto* pathsComp = dynamic_cast<GlobalPathsWindowComponent*> (pathsWindow->getChildComponent (0)))\r
@@ -1433,6 +1339,14 @@ void ProjucerApplication::initCommandManager()
     registerGUIEditorCommands();\r
 }\r
 \r
+void ProjucerApplication::deleteTemporaryFiles() const noexcept\r
+{\r
+    auto tempDirectory = File::getSpecialLocation (File::SpecialLocationType::tempDirectory).getChildFile ("PIPs");\r
+\r
+    if (tempDirectory.exists())\r
+        tempDirectory.deleteRecursively();\r
+}\r
+\r
 void ProjucerApplication::setAnalyticsEnabled (bool enabled)\r
 {\r
     resetAnalytics();\r
@@ -1490,37 +1404,6 @@ void ProjucerApplication::showSetJUCEPathAlert()
 \r
 }\r
 \r
-void ProjucerApplication::rescanJUCEPathModules()\r
-{\r
-    File jucePath (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString());\r
-\r
-    if (isRunningCommandLine)\r
-        jucePathModuleList.scanPaths ({ jucePath });\r
-    else\r
-        jucePathModuleList.scanPathsAsync ({ jucePath });\r
-}\r
-\r
-static Array<File> getSanitisedUserModulePaths()\r
-{\r
-    Array<File> paths;\r
-\r
-    for (auto p : StringArray::fromTokens (getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get().toString(), ";", {}))\r
-    {\r
-        p = p.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
-        paths.add (File::createFileWithoutCheckingPath (p.trim()));\r
-    }\r
-\r
-    return paths;\r
-}\r
-\r
-void ProjucerApplication::rescanUserPathModules()\r
-{\r
-    if (isRunningCommandLine)\r
-        userPathsModuleList.scanPaths (getSanitisedUserModulePaths());\r
-    else\r
-        userPathsModuleList.scanPathsAsync (getSanitisedUserModulePaths());\r
-}\r
-\r
 void ProjucerApplication::selectEditorColourSchemeWithName (const String& schemeName)\r
 {\r
     auto& appearanceSettings = getAppSettings().appearance;\r
index 7a7c5786c5dda91ee6679735704011857349ee8a..6689d45fa64b8216b68ca0281b51e5f988fbfe44 100644 (file)
@@ -96,7 +96,6 @@ public:
     void createNewPIP();\r
     void askUserToOpenFile();\r
     bool openFile (const File&);\r
-    void saveAllDocuments();\r
     bool closeAllDocuments (bool askUserToSave);\r
     bool closeAllMainWindows();\r
     void closeAllMainWindowsAndQuitIfNeeded();\r
@@ -139,13 +138,6 @@ public:
     //==============================================================================\r
     void setAnalyticsEnabled (bool);\r
 \r
-    //==============================================================================\r
-    void rescanJUCEPathModules();\r
-    void rescanUserPathModules();\r
-\r
-    AvailableModuleList& getJUCEPathModuleList()     { return jucePathModuleList; }\r
-    AvailableModuleList& getUserPathsModuleList()    { return userPathsModuleList; }\r
-\r
     //==============================================================================\r
     ProjucerLookAndFeel lookAndFeel;\r
 \r
@@ -160,7 +152,7 @@ public:
     std::unique_ptr<ApplicationCommandManager> commandManager;\r
 \r
     std::unique_ptr<Component> utf8Window, svgPathWindow, aboutWindow, applicationUsageDataWindow,\r
-                               pathsWindow, editorColourSchemeWindow, pipCreatorWindow;\r
+                             pathsWindow, editorColourSchemeWindow, pipCreatorWindow;\r
 \r
     std::unique_ptr<FileLogger> logger;\r
 \r
@@ -169,49 +161,56 @@ public:
     std::unique_ptr<LicenseController> licenseController;\r
 \r
 private:\r
-    //==============================================================================\r
+    void* server = nullptr;\r
+\r
+    std::unique_ptr<LatestVersionChecker> versionChecker;\r
+    TooltipWindow tooltipWindow;\r
+\r
+    void loginOrLogout();\r
+\r
+    bool checkEULA();\r
+    bool currentEULAHasBeenAcceptedPreviously() const;\r
+    String getEULAChecksumProperty() const;\r
+    void setCurrentEULAAccepted (bool hasBeenAccepted) const;\r
+\r
     void handleAsyncUpdate() override;\r
     void initCommandManager();\r
 \r
+    void deleteTemporaryFiles() const noexcept;\r
+\r
     void createExamplesPopupMenu (PopupMenu&) noexcept;\r
     Array<File> getSortedExampleDirectories() noexcept;\r
     Array<File> getSortedExampleFilesInDirectory (const File&) const noexcept;\r
+\r
     bool findWindowAndOpenPIP (const File&);\r
-    void findAndLaunchExample (int);\r
 \r
-    void checkIfGlobalJUCEPathHasChanged();\r
-    File tryToFindDemoRunnerExecutable();\r
-    File tryToFindDemoRunnerProject();\r
+    File getJUCEExamplesDirectoryPathFromGlobal() noexcept;\r
+    void findAndLaunchExample (int);\r
+    File findDemoRunnerExecutable() noexcept;\r
+    File findDemoRunnerProject() noexcept;\r
     void launchDemoRunner();\r
 \r
+    int numExamples = 0;\r
+    std::unique_ptr<AlertWindow> demoRunnerAlert;\r
+\r
+   #if JUCE_LINUX\r
+    ChildProcess makeProcess;\r
+   #endif\r
+\r
     void resetAnalytics() noexcept;\r
     void setupAnalytics();\r
 \r
     void showSetJUCEPathAlert();\r
+    std::unique_ptr<AlertWindow> pathAlert;\r
 \r
+    //==============================================================================\r
     void setColourScheme (int index, bool saveSetting);\r
+\r
     void setEditorColourScheme (int index, bool saveSetting);\r
     void updateEditorColourSchemeIfNeeded();\r
 \r
-    //==============================================================================\r
-    void* server = nullptr;\r
-\r
-    std::unique_ptr<LatestVersionChecker> versionChecker;\r
-    TooltipWindow tooltipWindow;\r
-\r
-    AvailableModuleList jucePathModuleList, userPathsModuleList;\r
-\r
-    int numExamples = 0;\r
-    std::unique_ptr<AlertWindow> demoRunnerAlert;\r
-    std::unique_ptr<AlertWindow> pathAlert;\r
-    bool hasScannedForDemoRunnerExecutable = false, hasScannedForDemoRunnerProject = false;\r
-    File lastJUCEPath, lastDemoRunnerExectuableFile, lastDemoRunnerProjectFile;\r
-   #if JUCE_LINUX\r
-    ChildProcess makeProcess;\r
-   #endif\r
-\r
-    int selectedColourSchemeIndex = 0, selectedEditorColourSchemeIndex = 0, numEditorColourSchemes = 0;\r
+    int selectedColourSchemeIndex = 0;\r
 \r
-    //==============================================================================\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjucerApplication)\r
+    int selectedEditorColourSchemeIndex = 0;\r
+    int numEditorColourSchemes = 0;\r
 };\r
index 30f26af5a307be07aab9028760f16a023921b2a7..1d4060448aab31c228e7d4edf44b9ce5e3ebc123 100644 (file)
@@ -751,10 +751,13 @@ void LatestVersionChecker::modalStateFinished (int result,
 \r
 void LatestVersionChecker::askUserForLocationToDownload (URL& newVersionToDownload, const String& extraHeaders)\r
 {\r
-    File targetFolder (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get());\r
+    File targetFolder (EnabledModuleList::findGlobalModulesFolder());\r
+\r
+    if (isJUCEModulesFolder (targetFolder))\r
+        targetFolder = targetFolder.getParentDirectory();\r
 \r
     FileChooser chooser (TRANS("Please select the location into which you'd like to install the new version"),\r
-                         targetFolder);\r
+        targetFolder);\r
 \r
     if (chooser.browseForDirectory())\r
     {\r
index a97de857991421a19f809fd5d84c468e28a252be..4dfe6cfc44817cbc4d16d84f7616e191e8828643 100644 (file)
@@ -25,8 +25,9 @@
 */\r
 \r
 #include "jucer_Headers.h"\r
-#include "jucer_Application.h"\r
+#include "../Project/jucer_Module.h"\r
 #include "../Utility/Helpers/jucer_TranslationHelpers.h"\r
+#include "../Utility/PIPs/jucer_PIPGenerator.h"\r
 \r
 #include "jucer_CommandLine.h"\r
 \r
@@ -37,6 +38,13 @@ const char* getPreferredLinefeed()     { return preferredLinefeed; }
 //==============================================================================\r
 namespace\r
 {\r
+    struct CommandLineError\r
+    {\r
+        CommandLineError (const String& s) : message (s) {}\r
+\r
+        String message;\r
+    };\r
+\r
     static void hideDockIcon()\r
     {\r
        #if JUCE_MAC\r
@@ -44,6 +52,58 @@ namespace
        #endif\r
     }\r
 \r
+    static bool matchArgument (const String& arg, const String& possible)\r
+    {\r
+        return arg == possible\r
+            || arg == "-" + possible\r
+            || arg == "--" + possible;\r
+    }\r
+\r
+    static void checkArgumentCount (const StringArray& args, int minNumArgs)\r
+    {\r
+        if (args.size() < minNumArgs)\r
+            throw CommandLineError ("Not enough arguments!");\r
+    }\r
+\r
+    static bool findArgument (StringArray& args, const String& target)\r
+    {\r
+        for (int i = 0; i < args.size(); ++i)\r
+        {\r
+            if (args[i].trim() == target)\r
+            {\r
+                args.remove (i);\r
+                return true;\r
+            }\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    static File getFile (const String& filename)\r
+    {\r
+        return File::getCurrentWorkingDirectory().getChildFile (filename.unquoted());\r
+    }\r
+\r
+    static File getDirectoryCheckingForExistence (const String& filename)\r
+    {\r
+        File f = getFile (filename);\r
+\r
+        if (! f.isDirectory())\r
+            throw CommandLineError ("Could not find folder: " + f.getFullPathName());\r
+\r
+        return f;\r
+    }\r
+\r
+    static File getFileCheckingForExistence (const String& filename)\r
+    {\r
+        File f = getFile (filename);\r
+\r
+        if (! f.exists())\r
+            throw CommandLineError ("Could not find file: " + f.getFullPathName());\r
+\r
+        return f;\r
+    }\r
+\r
     static Array<File> findAllSourceFiles (const File& folder)\r
     {\r
         Array<File> files;\r
@@ -62,30 +122,30 @@ namespace
         TemporaryFile temp (file);\r
 \r
         if (! temp.getFile().replaceWithText (newText, false, false, nullptr))\r
-            ConsoleApplication::fail ("!!! ERROR Couldn't write to temp file!");\r
+            throw CommandLineError ("!!! ERROR Couldn't write to temp file!");\r
 \r
         if (! temp.overwriteTargetFileWithTemporary())\r
-            ConsoleApplication::fail ("!!! ERROR Couldn't write to file!");\r
+            throw CommandLineError ("!!! ERROR Couldn't write to file!");\r
     }\r
 \r
     //==============================================================================\r
     struct LoadedProject\r
     {\r
-        LoadedProject (const ArgumentList::Argument& fileToLoad)\r
+        LoadedProject (const String& fileToLoad)\r
         {\r
             hideDockIcon();\r
 \r
-            auto projectFile = fileToLoad.resolveAsExistingFile();\r
+            auto projectFile = getFileCheckingForExistence (fileToLoad);\r
 \r
             if (! projectFile.hasFileExtension (Project::projectFileExtension))\r
-                ConsoleApplication::fail (projectFile.getFullPathName() + " isn't a valid jucer project file!");\r
+                throw CommandLineError (projectFile.getFullPathName() + " isn't a valid jucer project file!");\r
 \r
             project.reset (new Project (projectFile));\r
 \r
             if (! project->loadFrom (projectFile, true))\r
             {\r
                 project.reset();\r
-                ConsoleApplication::fail ("Failed to load the project file: " + projectFile.getFullPathName());\r
+                throw CommandLineError ("Failed to load the project file: " + projectFile.getFullPathName());\r
             }\r
         }\r
 \r
@@ -93,46 +153,14 @@ namespace
         {\r
             if (project != nullptr)\r
             {\r
-                if (! justSaveResources)\r
-                    rescanModulePathsIfNecessary();\r
-\r
                 auto error = justSaveResources ? project->saveResourcesOnly (project->getFile())\r
                                                : project->saveProject (project->getFile(), true);\r
 \r
                 project.reset();\r
 \r
                 if (error.failed())\r
-                    ConsoleApplication::fail ("Error when saving: " + error.getErrorMessage());\r
-            }\r
-        }\r
-\r
-        void rescanModulePathsIfNecessary()\r
-        {\r
-            bool scanJUCEPath = false, scanUserPaths = false;\r
-\r
-            const auto& modules = project->getEnabledModules();\r
-\r
-            for (auto i = modules.getNumModules(); --i >= 0;)\r
-            {\r
-                const auto& id = modules.getModuleID (i);\r
-\r
-                if (isJUCEModule (id) && ! scanJUCEPath)\r
-                {\r
-                    if (modules.shouldUseGlobalPath (id))\r
-                        scanJUCEPath = true;\r
-                }\r
-                else if (! scanUserPaths)\r
-                {\r
-                    if (modules.shouldUseGlobalPath (id))\r
-                        scanUserPaths = true;\r
-                }\r
+                    throw CommandLineError ("Error when saving: " + error.getErrorMessage());\r
             }\r
-\r
-            if (scanJUCEPath)\r
-                ProjucerApplication::getApp().rescanJUCEPathModules();\r
-\r
-            if (scanUserPaths)\r
-                ProjucerApplication::getApp().rescanUserPathModules();\r
         }\r
 \r
         std::unique_ptr<Project> project;\r
@@ -142,9 +170,9 @@ namespace
     /* Running a command-line of the form "projucer --resave foobar.jucer" will try to load\r
        that project and re-export all of its targets.\r
     */\r
-    static void resaveProject (const ArgumentList& args, bool justSaveResources)\r
+    static void resaveProject (const StringArray& args, bool justSaveResources)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
         LoadedProject proj (args[1]);\r
 \r
         std::cout << (justSaveResources ? "Re-saving project resources: "\r
@@ -155,21 +183,21 @@ namespace
     }\r
 \r
     //==============================================================================\r
-    static void getVersion (const ArgumentList& args)\r
+    static void getVersion (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
         LoadedProject proj (args[1]);\r
 \r
         std::cout << proj.project->getVersionString() << std::endl;\r
     }\r
 \r
     //==============================================================================\r
-    static void setVersion (const ArgumentList& args)\r
+    static void setVersion (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 3);\r
         LoadedProject proj (args[2]);\r
 \r
-        String version (args[1].text.trim());\r
+        String version (args[1].trim());\r
 \r
         std::cout << "Setting project version: " << version << std::endl;\r
 \r
@@ -178,9 +206,9 @@ namespace
     }\r
 \r
     //==============================================================================\r
-    static void bumpVersion (const ArgumentList& args)\r
+    static void bumpVersion (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
         LoadedProject proj (args[1]);\r
 \r
         String version = proj.project->getVersionString();\r
@@ -194,15 +222,15 @@ namespace
         proj.save (false);\r
     }\r
 \r
-    static void gitTag (const ArgumentList& args)\r
+    static void gitTag (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
         LoadedProject proj (args[1]);\r
 \r
         String version (proj.project->getVersionString());\r
 \r
         if (version.trim().isEmpty())\r
-            ConsoleApplication::fail ("Cannot read version number from project!");\r
+            throw CommandLineError ("Cannot read version number from project!");\r
 \r
         StringArray command;\r
         command.add ("git");\r
@@ -217,19 +245,19 @@ namespace
         ChildProcess c;\r
 \r
         if (! c.start (command, 0))\r
-            ConsoleApplication::fail ("Cannot run git!");\r
+            throw CommandLineError ("Cannot run git!");\r
 \r
         c.waitForProcessToFinish (10000);\r
 \r
         if (c.getExitCode() != 0)\r
-            ConsoleApplication::fail ("git command failed!");\r
+            throw CommandLineError ("git command failed!");\r
     }\r
 \r
     //==============================================================================\r
-    static void showStatus (const ArgumentList& args)\r
+    static void showStatus (const StringArray& args)\r
     {\r
         hideDockIcon();\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
 \r
         LoadedProject proj (args[1]);\r
 \r
@@ -237,7 +265,7 @@ namespace
                   << "Name: " << proj.project->getProjectNameString() << std::endl\r
                   << "UID: " << proj.project->getProjectUIDString() << std::endl;\r
 \r
-        EnabledModuleList& modules = proj.project->getEnabledModules();\r
+        EnabledModuleList& modules = proj.project->getModules();\r
 \r
         if (int numModules = modules.getNumModules())\r
         {\r
@@ -258,13 +286,13 @@ namespace
     {\r
         jassert (targetFolder.isDirectory());\r
 \r
-        auto moduleFolderParent = moduleFolder.getParentDirectory();\r
+        const File moduleFolderParent (moduleFolder.getParentDirectory());\r
         LibraryModule module (moduleFolder);\r
 \r
         if (! module.isValid())\r
-            ConsoleApplication::fail (moduleFolder.getFullPathName() + " is not a valid module folder!");\r
+            throw CommandLineError (moduleFolder.getFullPathName() + " is not a valid module folder!");\r
 \r
-        auto targetFile = targetFolder.getChildFile (getModulePackageName (module));\r
+        const File targetFile (targetFolder.getChildFile (getModulePackageName (module)));\r
 \r
         ZipFile::Builder zip;\r
 \r
@@ -279,31 +307,29 @@ namespace
         std::cout << "Writing: " << targetFile.getFullPathName() << std::endl;\r
 \r
         TemporaryFile temp (targetFile);\r
+        std::unique_ptr<FileOutputStream> out (temp.getFile().createOutputStream());\r
 \r
-        {\r
-            FileOutputStream out (temp.getFile());\r
+        bool ok = out != nullptr && zip.writeToStream (*out, nullptr);\r
+        out.reset();\r
+        ok = ok && temp.overwriteTargetFileWithTemporary();\r
 \r
-            if (! (out.openedOk() && zip.writeToStream (out, nullptr)))\r
-                ConsoleApplication::fail ("Failed to write to the target file: " + targetFile.getFullPathName());\r
-        }\r
-\r
-        if (! temp.overwriteTargetFileWithTemporary())\r
-            ConsoleApplication::fail ("Failed to write to the target file: " + targetFile.getFullPathName());\r
+        if (! ok)\r
+            throw CommandLineError ("Failed to write to the target file: " + targetFile.getFullPathName());\r
     }\r
 \r
-    static void buildModules (const ArgumentList& args, const bool buildAllWithIndex)\r
+    static void buildModules (const StringArray& args, const bool buildAllWithIndex)\r
     {\r
         hideDockIcon();\r
-        args.checkMinNumArguments (3);\r
+        checkArgumentCount (args, 3);\r
 \r
-        auto targetFolder = args[1].resolveAsFile();\r
+        const File targetFolder (getFile (args[1]));\r
 \r
         if (! targetFolder.isDirectory())\r
-            ConsoleApplication::fail ("The first argument must be the directory to put the result.");\r
+            throw CommandLineError ("The first argument must be the directory to put the result.");\r
 \r
         if (buildAllWithIndex)\r
         {\r
-            auto folderToSearch = args[2].resolveAsFile();\r
+            const File folderToSearch (getFile (args[2]));\r
             DirectoryIterator i (folderToSearch, false, "*", File::findDirectories);\r
             var infoList;\r
 \r
@@ -322,14 +348,14 @@ namespace
                 }\r
             }\r
 \r
-            auto indexFile = targetFolder.getChildFile ("modulelist");\r
+            const File indexFile (targetFolder.getChildFile ("modulelist"));\r
             std::cout << "Writing: " << indexFile.getFullPathName() << std::endl;\r
             indexFile.replaceWithText (JSON::toString (infoList), false, false);\r
         }\r
         else\r
         {\r
             for (int i = 2; i < args.size(); ++i)\r
-                zipModule (targetFolder, args[i].resolveAsFile());\r
+                zipModule (targetFolder, getFile (args[i]));\r
         }\r
     }\r
 \r
@@ -403,13 +429,13 @@ namespace
                                                            : "Cleaning file: ");\r
     }\r
 \r
-    static void scanFilesForCleanup (const ArgumentList& args, CleanupOptions options)\r
+    static void scanFilesForCleanup (const StringArray& args, CleanupOptions options)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
 \r
-        for (auto it = args.arguments.begin() + 1; it < args.arguments.end(); ++it)\r
+        for (auto it = args.begin() + 1; it < args.end(); ++it)\r
         {\r
-            auto target = it->resolveAsFile();\r
+            auto target = getFileCheckingForExistence (*it);\r
 \r
             Array<File> files;\r
 \r
@@ -423,13 +449,13 @@ namespace
         }\r
     }\r
 \r
-    static void cleanWhitespace (const ArgumentList& args, bool replaceTabs)\r
+    static void cleanWhitespace (const StringArray& args, bool replaceTabs)\r
     {\r
         CleanupOptions options = { replaceTabs, false };\r
         scanFilesForCleanup (args, options);\r
     }\r
 \r
-    static void tidyDividerComments (const ArgumentList& args)\r
+    static void tidyDividerComments (const StringArray& args)\r
     {\r
         CleanupOptions options = { false, true };\r
         scanFilesForCleanup (args, options);\r
@@ -499,10 +525,10 @@ namespace
         }\r
     }\r
 \r
-    static void fixRelativeIncludePaths (const ArgumentList& args)\r
+    static void fixRelativeIncludePaths (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
-        auto target = args[1].resolveAsExistingFolder();\r
+        checkArgumentCount (args, 2);\r
+        auto target = getDirectoryCheckingForExistence (args[1]);\r
         auto files = findAllSourceFiles (target);\r
 \r
         for (int i = 0; i < files.size(); ++i)\r
@@ -523,10 +549,10 @@ namespace
                 + " + " + getStringConcatenationExpression (rng, start + breakPos, length - breakPos) + ")";\r
     }\r
 \r
-    static void generateObfuscatedStringCode (const ArgumentList& args)\r
+    static void generateObfuscatedStringCode (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
-        auto originalText = args[1].text.unquoted();\r
+        checkArgumentCount (args, 2);\r
+        const String originalText (args[1].unquoted());\r
 \r
         struct Section\r
         {\r
@@ -582,29 +608,29 @@ namespace
         std::cout << out.toString() << std::endl;\r
     }\r
 \r
-    static void scanFoldersForTranslationFiles (const ArgumentList& args)\r
+    static void scanFoldersForTranslationFiles (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (2);\r
+        checkArgumentCount (args, 2);\r
 \r
         StringArray translations;\r
 \r
-        for (auto it = args.arguments.begin() + 1; it != args.arguments.end(); ++it)\r
+        for (auto it = args.begin() + 1; it != args.end(); ++it)\r
         {\r
-            auto directoryToSearch = it->resolveAsExistingFolder();\r
+            const File directoryToSearch (getDirectoryCheckingForExistence (*it));\r
             TranslationHelpers::scanFolderForTranslations (translations, directoryToSearch);\r
         }\r
 \r
         std::cout << TranslationHelpers::mungeStrings (translations) << std::endl;\r
     }\r
 \r
-    static void createFinishedTranslationFile (const ArgumentList& args)\r
+    static void createFinishedTranslationFile (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (3);\r
+        checkArgumentCount (args, 3);\r
 \r
-        auto preTranslated  = args[1].resolveAsExistingFile().loadFileAsString();\r
-        auto postTranslated = args[2].resolveAsExistingFile().loadFileAsString();\r
+        auto preTranslated  = getFileCheckingForExistence (args[1]).loadFileAsString();\r
+        auto postTranslated = getFileCheckingForExistence (args[2]).loadFileAsString();\r
 \r
-        auto localisedContent = (args.size() > 3 ? args[3].resolveAsExistingFile().loadFileAsString() : String());\r
+        auto localisedContent = (args.size() > 3 ? getFileCheckingForExistence (args[3]).loadFileAsString() : String());\r
         auto localised        = LocalisedStrings (localisedContent, false);\r
 \r
         using TH = TranslationHelpers;\r
@@ -614,11 +640,11 @@ namespace
     }\r
 \r
     //==============================================================================\r
-    static void encodeBinary (const ArgumentList& args)\r
+    static void encodeBinary (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (3);\r
-        auto source = args[1].resolveAsExistingFile();\r
-        auto target = args[2].resolveAsExistingFile();\r
+        checkArgumentCount (args, 3);\r
+        const File source (getFileCheckingForExistence (args[1]));\r
+        const File target (getFile (args[2]));\r
 \r
         MemoryOutputStream literal;\r
         size_t dataSize = 0;\r
@@ -667,7 +693,7 @@ namespace
         }\r
         else\r
         {\r
-            ConsoleApplication::fail ("You need to specify a .h or .cpp file as the target");\r
+            throw CommandLineError ("You need to specify a .h or .cpp file as the target");\r
         }\r
     }\r
 \r
@@ -681,7 +707,7 @@ namespace
         else if (os == "linux")      targetOS = TargetOS::linux;\r
 \r
         if (targetOS == TargetOS::unknown)\r
-            ConsoleApplication::fail ("You need to specify a valid OS! Use osx, windows or linux");\r
+            throw CommandLineError ("You need to specify a valid OS! Use osx, windows or linux");\r
 \r
         return targetOS == TargetOS::getThisOS();\r
     }\r
@@ -692,19 +718,12 @@ namespace
             || id == "androidSDKPath" || id == "androidNDKPath" || id == "defaultJuceModulePath" || id == "defaultUserModulePath";\r
     }\r
 \r
-    static void checkIfUserModulesPathsAreValid (const String& list)\r
+    static void setGlobalPath (const StringArray& args)\r
     {\r
-        for (auto& p : StringArray::fromTokens (list, ";", {}))\r
-            if (! File (p.trim()).exists())\r
-                ConsoleApplication::fail (p + " doesn't exist!");\r
-    }\r
+        checkArgumentCount (args, 3);\r
 \r
-    static void setGlobalPath (const ArgumentList& args)\r
-    {\r
-        args.checkMinNumArguments (3);\r
-\r
-        if (! isValidPathIdentifier (args[2].text, args[1].text))\r
-            ConsoleApplication::fail ("Identifier " + args[2].text + " is not valid for the OS " + args[1].text);\r
+        if (! isValidPathIdentifier (args[2], args[1]))\r
+            throw CommandLineError ("Identifier " + args[2] + " is not valid for the OS " + args[1]);\r
 \r
         auto userAppData = File::getSpecialLocation (File::userApplicationDataDirectory);\r
 \r
@@ -713,98 +732,55 @@ namespace
        #endif\r
 \r
         auto settingsFile = userAppData.getChildFile ("Projucer").getChildFile ("Projucer.settings");\r
-        auto xml = parseXML (settingsFile);\r
-\r
-        if (xml == nullptr)\r
-            ConsoleApplication::fail ("Settings file not valid!");\r
-\r
+        std::unique_ptr<XmlElement> xml (XmlDocument::parse (settingsFile));\r
         auto settingsTree = ValueTree::fromXml (*xml);\r
 \r
         if (! settingsTree.isValid())\r
-            ConsoleApplication::fail ("Settings file not valid!");\r
+            throw CommandLineError ("Settings file not valid!");\r
 \r
         ValueTree childToSet;\r
-\r
-        if (isThisOS (args[1].text))\r
+        if (isThisOS (args[1]))\r
         {\r
             childToSet = settingsTree.getChildWithProperty (Ids::name, "PROJECT_DEFAULT_SETTINGS")\r
-                                     .getOrCreateChildWithName ("PROJECT_DEFAULT_SETTINGS", nullptr);\r
+                                     .getChildWithName ("PROJECT_DEFAULT_SETTINGS");\r
         }\r
         else\r
         {\r
             childToSet = settingsTree.getChildWithProperty (Ids::name, "FALLBACK_PATHS")\r
-                                     .getOrCreateChildWithName ("FALLBACK_PATHS", nullptr)\r
-                                     .getOrCreateChildWithName (args[1].text + "Fallback", nullptr);\r
+                                     .getChildWithName ("FALLBACK_PATHS")\r
+                                     .getChildWithName (args[1] + String ("Fallback"));\r
         }\r
 \r
         if (! childToSet.isValid())\r
-            ConsoleApplication::fail ("Failed to set the requested setting!");\r
-\r
-        if (args[2].text == Ids::defaultUserModulePath.toString())\r
-        {\r
-            auto pathList = args[3].text.removeCharacters ("\"");\r
+            throw CommandLineError ("Failed to set the requested setting!");\r
 \r
-            if (isThisOS (args[1].text))\r
-                checkIfUserModulesPathsAreValid (pathList);\r
-\r
-            childToSet.setProperty (args[2].text, pathList, nullptr);\r
-        }\r
-        else\r
-        {\r
-            childToSet.setProperty (args[2].text, args[3].resolveAsFile().getFullPathName(), nullptr);\r
-        }\r
+        childToSet.setProperty (args[2], File::getCurrentWorkingDirectory().getChildFile (args[3]).getFullPathName(), nullptr);\r
 \r
         settingsFile.replaceWithText (settingsTree.toXmlString());\r
     }\r
 \r
-    static void createProjectFromPIP (const ArgumentList& args)\r
+    static void createProjectFromPIP (const StringArray& args)\r
     {\r
-        args.checkMinNumArguments (3);\r
-\r
-        auto pipFile = args[1].resolveAsFile();\r
+        checkArgumentCount (args, 3);\r
 \r
+        auto pipFile = File::getCurrentWorkingDirectory().getChildFile (args[1].unquoted());\r
         if (! pipFile.existsAsFile())\r
-            ConsoleApplication::fail ("PIP file doesn't exist.");\r
-\r
-        auto outputDir = args[2].resolveAsFile();\r
+            throw CommandLineError ("PIP file doesn't exist.");\r
 \r
+        auto outputDir = File::getCurrentWorkingDirectory().getChildFile (args[2].unquoted());\r
         if (! outputDir.exists())\r
         {\r
             auto res = outputDir.createDirectory();\r
             std::cout << "Creating directory " << outputDir.getFullPathName() << std::endl;\r
         }\r
 \r
-        File juceModulesPath;\r
-        Array<File> userModulesPaths;\r
-\r
-        if (args.size() > 3)\r
-        {\r
-            juceModulesPath = args[3].resolveAsFile();\r
-\r
-            if (! juceModulesPath.exists())\r
-                ConsoleApplication::fail ("Specified JUCE modules directory doesn't exist.");\r
-\r
-            if (args.size() == 5)\r
-            {\r
-                auto pathList = args[4].text.removeCharacters ("\"");\r
-                checkIfUserModulesPathsAreValid (pathList);\r
-\r
-                for (auto& p : StringArray::fromTokens (pathList, ";", {}))\r
-                    userModulesPaths.add ({ p });\r
-            }\r
-        }\r
-\r
-        PIPGenerator generator (pipFile, outputDir, juceModulesPath, userModulesPaths);\r
-\r
-        auto createJucerFileResult = generator.createJucerFile();\r
+        PIPGenerator generator (pipFile, outputDir);\r
 \r
-        if (! createJucerFileResult)\r
-            ConsoleApplication::fail (createJucerFileResult.getErrorMessage());\r
+        if (! generator.createJucerFile())\r
+            throw CommandLineError ("Failed to create .jucer file in " + outputDir.getFullPathName()+ ".");\r
 \r
-        auto createMainCppResult = generator.createMainCpp();\r
-\r
-        if (! createMainCppResult)\r
-            ConsoleApplication::fail (createMainCppResult.getErrorMessage());\r
+        if (! generator.createMainCpp())\r
+            throw CommandLineError ("Failed to create Main.cpp.");\r
     }\r
 \r
     //==============================================================================\r
@@ -871,12 +847,10 @@ namespace
                   << std::endl\r
                   << " " << appName << " --set-global-search-path os identifier_to_set new_path" << std::endl\r
                   << "    Sets the global path for a specified os and identifier. The os should be either osx, windows or linux and the identifiers can be any of the following: "\r
-                  << "defaultJuceModulePath, defaultUserModulePath, vst3Path, aaxPath (not valid on linux), rtasPath (not valid on linux), androidSDKPath or androidNDKPath. "\r
-                     "When setting defaultUserModulePath you can specify multiple paths by surrounding a semicolon-separated list of paths with double quotes \"like;so\"" << std::endl\r
+                  << "defaultJuceModulePath, defaultUserModulePath, vst3path, aaxPath (not valid on linux), rtasPath (not valid on linux), androidSDKPath or androidNDKPath." << std::endl\r
                   << std::endl\r
-                  << " " << appName << " --create-project-from-pip path/to/PIP path/to/output path/to/JUCE/modules (optional) path/to/user/modules (optional)" << std::endl\r
-                  << "    Generates a folder containing a JUCE project in the specified output path using the specified PIP file. Use the optional JUCE and user module paths to override "\r
-                     "the global module paths (you can specify multiple user module paths by using a semicolon-separated list)." << std::endl\r
+                  << " " << appName << " --create-project-from-pip path/to/PIP path/to/output" << std::endl\r
+                  << "    Generates a JUCE project from a PIP file." << std::endl\r
                   << std::endl\r
                   << "Note that for any of the file-rewriting commands, add the option \"--lf\" if you want it to use LF linefeeds instead of CRLF" << std::endl\r
                   << std::endl;\r
@@ -884,45 +858,46 @@ namespace
 }\r
 \r
 //==============================================================================\r
-int performCommandLine (const ArgumentList& args)\r
+int performCommandLine (const String& commandLine)\r
 {\r
-    return ConsoleApplication::invokeCatchingFailures ([&] () -> int\r
+    StringArray args;\r
+    args.addTokens (commandLine, true);\r
+    args.trim();\r
+\r
+    if (findArgument (args, "--lf") || findArgument (args, "-lf"))\r
+       preferredLinefeed = "\n";\r
+\r
+    String command (args[0]);\r
+\r
+    try\r
+    {\r
+        if (matchArgument (command, "help"))                     { showHelp();                            return 0; }\r
+        if (matchArgument (command, "h"))                        { showHelp();                            return 0; }\r
+        if (matchArgument (command, "resave"))                   { resaveProject (args, false);           return 0; }\r
+        if (matchArgument (command, "resave-resources"))         { resaveProject (args, true);            return 0; }\r
+        if (matchArgument (command, "get-version"))              { getVersion (args);                     return 0; }\r
+        if (matchArgument (command, "set-version"))              { setVersion (args);                     return 0; }\r
+        if (matchArgument (command, "bump-version"))             { bumpVersion (args);                    return 0; }\r
+        if (matchArgument (command, "git-tag-version"))          { gitTag (args);                         return 0; }\r
+        if (matchArgument (command, "buildmodule"))              { buildModules (args, false);            return 0; }\r
+        if (matchArgument (command, "buildallmodules"))          { buildModules (args, true);             return 0; }\r
+        if (matchArgument (command, "status"))                   { showStatus (args);                     return 0; }\r
+        if (matchArgument (command, "trim-whitespace"))          { cleanWhitespace (args, false);         return 0; }\r
+        if (matchArgument (command, "remove-tabs"))              { cleanWhitespace (args, true);          return 0; }\r
+        if (matchArgument (command, "tidy-divider-comments"))    { tidyDividerComments (args);            return 0; }\r
+        if (matchArgument (command, "fix-broken-include-paths")) { fixRelativeIncludePaths (args);        return 0; }\r
+        if (matchArgument (command, "obfuscated-string-code"))   { generateObfuscatedStringCode (args);   return 0; }\r
+        if (matchArgument (command, "encode-binary"))            { encodeBinary (args);                   return 0; }\r
+        if (matchArgument (command, "trans"))                    { scanFoldersForTranslationFiles (args); return 0; }\r
+        if (matchArgument (command, "trans-finish"))             { createFinishedTranslationFile (args);  return 0; }\r
+        if (matchArgument (command, "set-global-search-path"))   { setGlobalPath (args);                  return 0; }\r
+        if (matchArgument (command, "create-project-from-pip"))  { createProjectFromPIP (args);           return 0; }\r
+    }\r
+    catch (const CommandLineError& error)\r
     {\r
-        if (args.containsOption ("--lf"))\r
-            preferredLinefeed = "\n";\r
-\r
-        auto command = args[0];\r
-\r
-        auto matchCommand = [&] (StringRef name) -> bool\r
-        {\r
-            return command == name || command.isLongOption (name);\r
-        };\r
+        std::cout << error.message << std::endl << std::endl;\r
+        return 1;\r
+    }\r
 \r
-        if (matchCommand ("help"))                     { showHelp();                            return 0; }\r
-        if (matchCommand ("h"))                        { showHelp();                            return 0; }\r
-        if (matchCommand ("resave"))                   { resaveProject (args, false);           return 0; }\r
-        if (matchCommand ("resave-resources"))         { resaveProject (args, true);            return 0; }\r
-        if (matchCommand ("get-version"))              { getVersion (args);                     return 0; }\r
-        if (matchCommand ("set-version"))              { setVersion (args);                     return 0; }\r
-        if (matchCommand ("bump-version"))             { bumpVersion (args);                    return 0; }\r
-        if (matchCommand ("git-tag-version"))          { gitTag (args);                         return 0; }\r
-        if (matchCommand ("buildmodule"))              { buildModules (args, false);            return 0; }\r
-        if (matchCommand ("buildallmodules"))          { buildModules (args, true);             return 0; }\r
-        if (matchCommand ("status"))                   { showStatus (args);                     return 0; }\r
-        if (matchCommand ("trim-whitespace"))          { cleanWhitespace (args, false);         return 0; }\r
-        if (matchCommand ("remove-tabs"))              { cleanWhitespace (args, true);          return 0; }\r
-        if (matchCommand ("tidy-divider-comments"))    { tidyDividerComments (args);            return 0; }\r
-        if (matchCommand ("fix-broken-include-paths")) { fixRelativeIncludePaths (args);        return 0; }\r
-        if (matchCommand ("obfuscated-string-code"))   { generateObfuscatedStringCode (args);   return 0; }\r
-        if (matchCommand ("encode-binary"))            { encodeBinary (args);                   return 0; }\r
-        if (matchCommand ("trans"))                    { scanFoldersForTranslationFiles (args); return 0; }\r
-        if (matchCommand ("trans-finish"))             { createFinishedTranslationFile (args);  return 0; }\r
-        if (matchCommand ("set-global-search-path"))   { setGlobalPath (args);                  return 0; }\r
-        if (matchCommand ("create-project-from-pip"))  { createProjectFromPIP (args);           return 0; }\r
-\r
-        if (command.isLongOption() || command.isShortOption())\r
-            ConsoleApplication::fail ("Unrecognised command: " + command.text.quoted());\r
-\r
-        return commandLineNotPerformed;\r
-    });\r
+    return commandLineNotPerformed;\r
 }\r
index 455879d26f1becfc4f1a8d5cffaeb97bbe1f840d..31042f5cc95f3388ff452d2f1dd6234aedeb36d7 100644 (file)
@@ -26,6 +26,6 @@
 \r
 #pragma once\r
 \r
-int performCommandLine (const ArgumentList&);\r
+int performCommandLine (const String& commandLine);\r
 \r
 enum { commandLineNotPerformed = 0x72346231 };\r
index 77fcd794cf771a4e5fd1e27fa9c450d8b772248b..6a07ad3059db48d9b6e6ddbe75cc5551cc31f980 100644 (file)
@@ -628,7 +628,7 @@ void MainWindowList::closeWindow (MainWindow* w)
     jassert (windows.contains (w));\r
 \r
    #if ! JUCE_MAC\r
-    if (windows.size() == 1 && ! isInReopenLastProjects)\r
+    if (windows.size() == 1)\r
     {\r
         JUCEApplicationBase::getInstance()->systemRequestedQuit();\r
     }\r
@@ -688,7 +688,7 @@ bool MainWindowList::openFile (const File& file, bool openInBackground)
 \r
     if (file.hasFileExtension (Project::projectFileExtension))\r
     {\r
-        WeakReference<Component> previousFrontWindow (getFrontmostWindow());\r
+        auto previousFrontWindow = getFrontmostWindow();\r
 \r
         auto* w = getOrCreateEmptyWindow();\r
         bool ok = w->openFile (file);\r
@@ -703,7 +703,7 @@ bool MainWindowList::openFile (const File& file, bool openInBackground)
             closeWindow (w);\r
         }\r
 \r
-        if (openInBackground && previousFrontWindow != nullptr)\r
+        if (openInBackground && (previousFrontWindow != nullptr))\r
             previousFrontWindow->toFront (true);\r
 \r
         return ok;\r
@@ -829,8 +829,6 @@ void MainWindowList::saveCurrentlyOpenProjectList()
 \r
 void MainWindowList::reopenLastProjects()\r
 {\r
-    const ScopedValueSetter<bool> setter (isInReopenLastProjects, true);\r
-\r
     for (auto& p : getAppSettings().getLastProjects())\r
         openFile (p, true);\r
 }\r
index 7e69255f5d3bfd032c38d634453b2f7cde2eafab..3a1b43127c67f268d935f458525d52cc8aedefc0 100644 (file)
@@ -125,7 +125,5 @@ public:
     OwnedArray<MainWindow> windows;\r
 \r
 private:\r
-    bool isInReopenLastProjects = false;\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindowList)\r
 };\r
index 926eb48a297035a5b5fb31195a3d77b2cbc4d032..7efafdfdbe5f3fd8cc34047f4d8f4bc6d5f4f8ec 100644 (file)
@@ -66,14 +66,9 @@ public:
         {\r
             setUsingNativeTitleBar (true);\r
             setContentOwned (new %%content_component_class%%(), true);\r
-\r
-           #if JUCE_IOS || JUCE_ANDROID\r
-            setFullScreen (true);\r
-           #else\r
             setResizable (true, true);\r
-            centreWithSize (getWidth(), getHeight());\r
-           #endif\r
 \r
+            centreWithSize (getWidth(), getHeight());\r
             setVisible (true);\r
         }\r
 \r
index 926eb48a297035a5b5fb31195a3d77b2cbc4d032..53a5a9bb7b2b6117b6c30363e87a5c37ae7d5e37 100644 (file)
@@ -67,13 +67,7 @@ public:
             setUsingNativeTitleBar (true);\r
             setContentOwned (new %%content_component_class%%(), true);\r
 \r
-           #if JUCE_IOS || JUCE_ANDROID\r
-            setFullScreen (true);\r
-           #else\r
-            setResizable (true, true);\r
             centreWithSize (getWidth(), getHeight());\r
-           #endif\r
-\r
             setVisible (true);\r
         }\r
 \r
diff --git a/extras/Projucer/Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs b/extras/Projucer/Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs
deleted file mode 100644 (file)
index 3b15b1f..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-#if UNITY_EDITOR
-
-using UnityEditor;
-using UnityEngine;
-
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-
-public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI
-{
-    public override string Name           { get { return "%%plugin_name%%"; } }
-    public override string Description    { get { return "%%plugin_description%%"; } }
-    public override string Vendor         { get { return "%%plugin_vendor%%"; } }
-
-    //==============================================================================
-       [DllImport("%%plugin_name%%")] static extern System.IntPtr getRenderCallback();
-
-    [DllImport("%%plugin_name%%")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height);
-
-    [DllImport("%%plugin_name%%")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button);
-    [DllImport("%%plugin_name%%")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button);
-    [DllImport("%%plugin_name%%")] static extern void unityMouseUp   (int id, float x, float y, EventModifiers mods);
-
-    [DllImport("%%plugin_name%%")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name);
-
-    [DllImport("%%plugin_name%%")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h);
-
-    //==============================================================================
-    private class PluginGUIInstance
-    {
-        public PluginGUIInstance (ref IAudioEffectPlugin plugin, int id)
-        {
-            instanceID = id;
-
-            float[] arr;
-            plugin.GetFloatBuffer ("Editor", out arr, 1);
-            hasEditor = (arr[0] > 0.0f);
-        }
-
-        public void repaint (Rect r)
-        { 
-            Vector2 newScreenPosition = GUIUtility.GUIToScreenPoint (r.position);
-
-            if (bounds != r 
-                || screenPosition != newScreenPosition)
-            {
-                screenPosition = newScreenPosition;
-                bounds = r;
-
-                unitySetScreenBounds (instanceID, screenPosition.x, screenPosition.y, bounds.width, bounds.height);
-                setupTexture();
-            }
-
-                       GL.IssuePluginEvent (getRenderCallback(), instanceID);
-
-            texture.SetPixels32 (pixels);
-            texture.Apply();
-
-            EditorGUI.DrawPreviewTexture (bounds, texture);
-        }
-
-        public bool handleMouseEvent (EventType eventType)
-        {
-            Vector2 mousePos = Event.current.mousePosition;
-            EventModifiers mods = Event.current.modifiers;
-
-            if (! bounds.Contains (mousePos))
-                return false;
-
-            Vector2 relativePos = new Vector2 (mousePos.x - bounds.x, mousePos.y - bounds.y);
-
-            if (eventType == EventType.MouseDown)    
-            {
-                unityMouseDown (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);
-                GUIUtility.hotControl = GUIUtility.GetControlID (FocusType.Passive);
-            }
-            else if (eventType == EventType.MouseUp)
-            {
-                unityMouseUp (instanceID, relativePos.x, relativePos.y, mods);
-                GUIUtility.hotControl = 0;
-            }
-            else if (eventType == EventType.MouseDrag)    
-            {
-                unityMouseDrag (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);
-            }
-
-            Event.current.Use();
-
-            return true;
-        }
-
-        public void handleKeyEvent (EventType eventType)
-        {
-            if (eventType == EventType.KeyDown)
-            {
-                KeyCode code = Event.current.keyCode;
-
-                if (code == KeyCode.None)
-                    return;
-
-                EventModifiers mods = Event.current.modifiers;
-
-                unityKeyEvent (instanceID, code, mods, code.ToString());
-            }
-        }
-
-        private void setupTexture()
-        {
-            if (pixelHandle.IsAllocated)
-                pixelHandle.Free();
-
-            texture = new Texture2D ((int) bounds.width, (int) bounds.height, TextureFormat.ARGB32, false);
-
-            pixels = texture.GetPixels32();
-            pixelHandle = GCHandle.Alloc (pixels, GCHandleType.Pinned);
-
-            unityInitialiseTexture (instanceID, pixelHandle.AddrOfPinnedObject(), texture.width, texture.height);
-        }
-
-        public int instanceID = -1;
-        public bool hasEditor;
-
-        private Vector2 screenPosition;
-        private Rect bounds;
-
-        private Texture2D texture;
-        private Color32[] pixels;
-        private GCHandle pixelHandle;
-    }
-    List<PluginGUIInstance> guis = new List<PluginGUIInstance>();
-
-    private PluginGUIInstance getGUIInstanceForPlugin (ref IAudioEffectPlugin plugin)
-    {
-        float[] idArray;
-        plugin.GetFloatBuffer ("ID", out idArray, 1);
-
-        int id = (int) idArray[0];
-
-        for (int i = 0; i < guis.Count; ++i)
-        {
-            if (guis[i].instanceID == id)
-                return guis[i];
-        }
-
-        PluginGUIInstance newInstance = new PluginGUIInstance (ref plugin, id);
-        guis.Add (newInstance);
-
-        return guis[guis.Count - 1];
-    }
-
-    //==============================================================================
-    public override bool OnGUI (IAudioEffectPlugin plugin)
-    {
-        PluginGUIInstance guiInstance = getGUIInstanceForPlugin (ref plugin);
-
-        if (! guiInstance.hasEditor)
-            return true;
-
-        float[] arr;
-        plugin.GetFloatBuffer ("Size", out arr, 6);
-
-        Rect r = GUILayoutUtility.GetRect (arr[0], arr[1],
-                                           new GUILayoutOption[] { GUILayout.MinWidth (arr[2]), GUILayout.MinHeight (arr[3]),
-                                                                   GUILayout.MaxWidth (arr[4]), GUILayout.MaxHeight (arr[5]) });
-
-        int controlID = GUIUtility.GetControlID (FocusType.Passive);
-        Event currentEvent = Event.current;
-        EventType currentEventType = currentEvent.GetTypeForControl (controlID);
-
-        if (currentEventType == EventType.Repaint)
-            guiInstance.repaint (r);
-        else if (currentEvent.isMouse)
-            guiInstance.handleMouseEvent (currentEventType);
-        else if (currentEvent.isKey)
-            guiInstance.handleKeyEvent (currentEventType);
-
-        return false;
-    }
-}
-
-#endif
index 4a457565efb1601a20a4965e1f290e2cdd381f8e..1629e7b5266c49847c80b166dca00a5c8036c69a 100644 (file)
@@ -47,20 +47,13 @@ bool DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Documen
     {\r
         jassert (document != nullptr);\r
 \r
-        if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
+        if (ProjectContentComponent* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
             pcc->hideDocument (document);\r
     }\r
 \r
     return true;\r
 }\r
 \r
-void DocumentEditorComponent::setEditedState (bool hasBeenEdited)\r
+void DocumentEditorComponent::setEditedState (bool /*hasBeenEdited*/)\r
 {\r
-    if (hasBeenEdited != lastEditedState)\r
-    {\r
-        if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
-            pcc->refreshProjectTreeFileStatuses();\r
-\r
-        lastEditedState = hasBeenEdited;\r
-    }\r
 }\r
index 24a96a7fb2c3d0dbf74e8a073c8dbcfdcb903bc3..3d5af0457a96dbe7ebfef85d7958a5219ec9447b 100644 (file)
@@ -43,7 +43,6 @@ public:
 \r
 protected:\r
     OpenDocumentManager::Document* document;\r
-    bool lastEditedState = false;\r
 \r
     void setEditedState (bool hasBeenEdited);\r
 \r
index e2133316bef573665742af5d323c06881500229e..507d2e7da05112898142b6122a0ee3dbde37e2e3 100644 (file)
@@ -82,34 +82,42 @@ private:
         facts.add (file.getFullPathName());\r
         drawable.reset();\r
 \r
-        if (auto input = std::unique_ptr<FileInputStream> (file.createInputStream()))\r
         {\r
-            auto totalSize = input->getTotalLength();\r
-            String formatName;\r
+            std::unique_ptr<InputStream> input (file.createInputStream());\r
 \r
-            if (auto* format = ImageFileFormat::findImageFormatForStream (*input))\r
-                formatName = " " + format->getFormatName();\r
+            if (input != nullptr)\r
+            {\r
+                auto totalSize = input->getTotalLength();\r
+                String formatName;\r
 \r
-            input.reset();\r
+                if (auto* format = ImageFileFormat::findImageFormatForStream (*input))\r
+                    formatName = " " + format->getFormatName();\r
 \r
-            auto image = ImageCache::getFromFile (file);\r
+                input.reset();\r
 \r
-            if (image.isValid())\r
-            {\r
-                auto* d = new DrawableImage();\r
-                d->setImage (image);\r
-                drawable.reset (d);\r
+                auto image = ImageCache::getFromFile (file);\r
 \r
-                facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);\r
-            }\r
+                if (image.isValid())\r
+                {\r
+                    auto* d = new DrawableImage();\r
+                    d->setImage (image);\r
+                    drawable.reset (d);\r
+\r
+                    facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);\r
+                }\r
 \r
-            if (totalSize > 0)\r
-                facts.add (File::descriptionOfSizeInBytes (totalSize));\r
+                if (totalSize > 0)\r
+                    facts.add (File::descriptionOfSizeInBytes (totalSize));\r
+            }\r
         }\r
 \r
         if (drawable == nullptr)\r
-            if (auto svg = parseXML (file))\r
+        {\r
+            std::unique_ptr<XmlElement> svg (XmlDocument::parse (file));\r
+\r
+            if (svg != nullptr)\r
                 drawable.reset (Drawable::createFromSVG (*svg));\r
+        }\r
 \r
         facts.removeEmptyStrings (true);\r
     }\r
index 2e6881bcf0645c892b339c483004c2620e054b94..71e32d3e136bcc087cdcf81cb308c95254728415 100644 (file)
@@ -450,7 +450,7 @@ private:
     {\r
     public:\r
         ControlsComponent (CodeDocument& doc, const Range<int>& selection,\r
-                           CompileEngineChildProcess::Ptr cp, bool showColourSelector)\r
+                           CompileEngineChildProcess* cp, bool showColourSelector)\r
             : document (doc),\r
               start (doc, selection.getStart()),\r
               end (doc, selection.getEnd()),\r
@@ -629,7 +629,7 @@ private:
 \r
         ~LiteralHighlightOverlay()\r
         {\r
-            if (auto* p = getParentComponent())\r
+            if (Component* p = getParentComponent())\r
             {\r
                 p->removeChildComponent (this);\r
 \r
index 249bdb83ed7a94c4638c5deae66c87aec289e677..45624392fa35f49cc1595f57cc650e4c6fe3a5f3 100644 (file)
@@ -200,7 +200,7 @@ bool ComponentTypeHandler::restoreFromXml (const XmlElement& xml,
     RelativePositionedRectangle rpr;\r
     rpr.restoreFromXml (xml, currentPos);\r
 \r
-    jassert (layout != nullptr);\r
+    jassert (layout != 0);\r
     setComponentPosition (comp, rpr, layout);\r
 \r
     if (SettableTooltipClient* const ttc = dynamic_cast<SettableTooltipClient*> (comp))\r
index 7e425d23869c25eab7f91dbc7f7b09ebbb4c366d..7220377b3f8e9f4190062152b60c735aaee78b66 100644 (file)
@@ -170,11 +170,11 @@ public:
     }\r
 \r
     //==============================================================================\r
-    class ImageButtonResourceProperty    : public ImageResourceProperty<ImageButton>\r
+    class ImageButtonResourceProperty    : public ImageResourceProperty <ImageButton>\r
     {\r
     public:\r
         ImageButtonResourceProperty (ComponentLayout& layout_, ImageButton* const owner_, const ImageRole role_, const String& name)\r
-            : ImageResourceProperty<ImageButton> (*layout_.getDocument(), owner_, name, true),\r
+            : ImageResourceProperty <ImageButton> (*layout_.getDocument(), owner_, name, true),\r
               role (role_),\r
               layout (layout_)\r
         {\r
@@ -195,28 +195,29 @@ public:
         ComponentLayout& layout;\r
     };\r
 \r
-    class SetImageResourceAction   : public ComponentUndoableAction<ImageButton>\r
+    class SetImageResourceAction   : public ComponentUndoableAction <ImageButton>\r
     {\r
     public:\r
         SetImageResourceAction (ImageButton* const button,\r
                                 ComponentLayout& layout_,\r
                                 const ImageRole role_,\r
                                 const String& newResource_)\r
-            : ComponentUndoableAction<ImageButton> (button, layout_),\r
+            : ComponentUndoableAction <ImageButton> (button, layout_),\r
               newResource (newResource_),\r
-              role (role_)\r
+              role (role_),\r
+              layout (layout_)\r
         {\r
             oldResource = ImageButtonHandler::getImageResource (button, role_);\r
         }\r
 \r
-        bool perform() override\r
+        bool perform()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageResource (layout, getComponent(), role, newResource, false);\r
             return true;\r
         }\r
 \r
-        bool undo() override\r
+        bool undo()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageResource (layout, getComponent(), role, oldResource, false);\r
@@ -226,6 +227,7 @@ public:
     private:\r
         String newResource, oldResource;\r
         const ImageRole role;\r
+        ComponentLayout& layout;\r
     };\r
 \r
     //==============================================================================\r
@@ -256,26 +258,27 @@ public:
     }\r
 \r
     //==============================================================================\r
-    class SetImageKeepsPropAction   : public ComponentUndoableAction<ImageButton>\r
+    class SetImageKeepsPropAction   : public ComponentUndoableAction <ImageButton>\r
     {\r
     public:\r
         SetImageKeepsPropAction (ImageButton* const button,\r
                                  ComponentLayout& layout_,\r
                                  const bool newState_)\r
-            : ComponentUndoableAction<ImageButton> (button, layout_),\r
-              newState (newState_)\r
+            : ComponentUndoableAction <ImageButton> (button, layout_),\r
+              newState (newState_),\r
+              layout (layout_)\r
         {\r
             oldState = ImageButtonHandler::doesImageKeepProportions (button);\r
         }\r
 \r
-        bool perform() override\r
+        bool perform()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageKeepProportions (layout, getComponent(), newState, false);\r
             return true;\r
         }\r
 \r
-        bool undo() override\r
+        bool undo()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageKeepProportions (layout, getComponent(), oldState, false);\r
@@ -284,6 +287,7 @@ public:
 \r
     private:\r
         bool newState, oldState;\r
+        ComponentLayout& layout;\r
     };\r
 \r
     static bool doesImageKeepProportions (ImageButton* button)\r
@@ -305,12 +309,12 @@ public:
         }\r
     }\r
 \r
-    class ImageButtonProportionProperty    : public ComponentBooleanProperty<ImageButton>\r
+    class ImageButtonProportionProperty    : public ComponentBooleanProperty <ImageButton>\r
     {\r
     public:\r
         ImageButtonProportionProperty (ComponentLayout& layout_, ImageButton* const owner_)\r
-            : ComponentBooleanProperty<ImageButton> ("proportional", "maintain image proportions", "scale to fit",\r
-                                                     owner_, *layout_.getDocument()),\r
+            : ComponentBooleanProperty <ImageButton> ("proportional", "maintain image proportions", "scale to fit",\r
+                                                      owner_, *layout_.getDocument()),\r
               layout (layout_)\r
         {\r
         }\r
@@ -330,28 +334,29 @@ public:
     };\r
 \r
     //==============================================================================\r
-    class SetImageOpacityAction   : public ComponentUndoableAction<ImageButton>\r
+    class SetImageOpacityAction   : public ComponentUndoableAction <ImageButton>\r
     {\r
     public:\r
         SetImageOpacityAction (ImageButton* const button,\r
                                ComponentLayout& layout_,\r
                                const ImageRole role_,\r
                                const float newState_)\r
-            : ComponentUndoableAction<ImageButton> (button, layout_),\r
+            : ComponentUndoableAction <ImageButton> (button, layout_),\r
               role (role_),\r
-              newState (newState_)\r
+              newState (newState_),\r
+              layout (layout_)\r
         {\r
             oldState = ImageButtonHandler::getImageOpacity (button, role_);\r
         }\r
 \r
-        bool perform() override\r
+        bool perform()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageOpacity (layout, getComponent(), role, newState, false);\r
             return true;\r
         }\r
 \r
-        bool undo() override\r
+        bool undo()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageOpacity (layout, getComponent(), role, oldState, false);\r
@@ -361,6 +366,7 @@ public:
     private:\r
         const ImageRole role;\r
         float newState, oldState;\r
+        ComponentLayout& layout;\r
     };\r
 \r
     static float getImageOpacity (ImageButton* button, const ImageRole role)\r
@@ -394,12 +400,12 @@ public:
         {\r
         }\r
 \r
-        void setValue (double newValue) override\r
+        void setValue (double newValue)\r
         {\r
             setImageOpacity (layout, owner, role, (float) newValue, true);\r
         }\r
 \r
-        double getValue() const override\r
+        double getValue() const\r
         {\r
             return getImageOpacity (owner, role);\r
         }\r
@@ -411,7 +417,7 @@ public:
     };\r
 \r
     //==============================================================================\r
-    class SetImageColourAction   : public ComponentUndoableAction<ImageButton>\r
+    class SetImageColourAction   : public ComponentUndoableAction <ImageButton>\r
     {\r
     public:\r
         SetImageColourAction (ImageButton* const button,\r
@@ -420,19 +426,20 @@ public:
                               Colour newState_)\r
             : ComponentUndoableAction<ImageButton> (button, layout_),\r
               role (role_),\r
-              newState (newState_)\r
+              newState (newState_),\r
+              layout (layout_)\r
         {\r
             oldState = ImageButtonHandler::getImageColour (button, role_);\r
         }\r
 \r
-        bool perform() override\r
+        bool perform()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageColour (layout, getComponent(), role, newState, false);\r
             return true;\r
         }\r
 \r
-        bool undo() override\r
+        bool undo()\r
         {\r
             showCorrectTab();\r
             ImageButtonHandler::setImageColour (layout, getComponent(), role, oldState, false);\r
@@ -442,6 +449,7 @@ public:
     private:\r
         const ImageRole role;\r
         Colour newState, oldState;\r
+        ComponentLayout& layout;\r
     };\r
 \r
     static Colour getImageColour (ImageButton* button, const ImageRole role)\r
index cceb7735ef31afdfd9dec1b50f807fb416998d47..9a5827bdaee5b3ba7622fea60518a014088bf8bf 100644 (file)
@@ -43,7 +43,7 @@ public:
 \r
     Component* createNewComponent (JucerDocument* doc) override\r
     {\r
-        return new TestComponent (doc, nullptr, false);\r
+        return new TestComponent (doc, 0, false);\r
     }\r
 \r
     String getXmlTagName() const noexcept override               { return "JUCERCOMP"; }\r
@@ -61,7 +61,7 @@ public:
 \r
     bool restoreFromXml (const XmlElement& xml, Component* comp, const ComponentLayout* layout) override\r
     {\r
-        auto tc = dynamic_cast<TestComponent*> (comp);\r
+        TestComponent* const tc = dynamic_cast<TestComponent*> (comp);\r
 \r
         if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout))\r
             return false;\r
@@ -74,11 +74,11 @@ public:
 \r
     String getClassName (Component* comp) const override\r
     {\r
-        auto tc = dynamic_cast<TestComponent*> (comp);\r
+        TestComponent* const tc = dynamic_cast<TestComponent*> (comp);\r
 \r
         String jucerCompClassName;\r
 \r
-        if (tc->getDocument() != nullptr)\r
+        if (tc->getDocument() != 0)\r
             jucerCompClassName = tc->getDocument()->getClassName();\r
 \r
         if (jucerCompClassName.isEmpty())\r
@@ -95,7 +95,7 @@ public:
         if (multipleSelected)\r
             return;\r
 \r
-        if (auto tc = dynamic_cast<TestComponent*> (component))\r
+        if (auto* const tc = dynamic_cast<TestComponent*> (component))\r
         {\r
             props.add (new JucerCompFileProperty (tc, document));\r
             props.add (new ConstructorParamsProperty (tc, document));\r
@@ -112,7 +112,7 @@ public:
     {\r
         ComponentTypeHandler::fillInCreationCode (code, component, memberVariableName);\r
 \r
-        if (auto tc = dynamic_cast<TestComponent*> (component))\r
+        if (TestComponent* const tc = dynamic_cast<TestComponent*> (component))\r
             code.includeFilesH.add (tc->findFile().withFileExtension (".h"));\r
         else\r
             jassertfalse;\r
index 50872603a66414f0ce8e35b17c3072c389a81959..2bfc6bde3fc1a24c1169206a58a25a45d2769c2c 100644 (file)
@@ -168,8 +168,8 @@ public:
             const String userCodeComment ("UserLabelCode_" + memberVariableName);\r
 \r
             callback\r
-                << "if (labelThatHasChanged == " << memberVariableName << ".get())\n"\r
-                << "{\n    //[" << userCodeComment << "] -- add your label text handling code here..\n    //[/" << userCodeComment << "]\n}\n";\r
+                << "if (labelThatHasChanged == " << memberVariableName\r
+                << ")\n{\n    //[" << userCodeComment << "] -- add your label text handling code here..\n    //[/" << userCodeComment << "]\n}\n";\r
         }\r
     }\r
 \r
index 1b9ac348e737e84bcdad5ea595755f3658c21af5..25c5fc73078df341e6049144024a9a2902c3c2f6 100644 (file)
@@ -614,8 +614,8 @@ private:
 \r
         String getText() const override\r
         {\r
-            auto s = dynamic_cast<Slider*> (component);\r
-            jassert (s != nullptr);\r
+            Slider* s = dynamic_cast<Slider*> (component);\r
+            jassert (s != 0);\r
 \r
             return String (s->getSkewFactor());\r
         }\r
index 2472bda42dcfd03ae8fcb9566231d760d28e229f..b7e97d4d8b56167acbbd198c647bcebb0ceeae20 100644 (file)
@@ -264,15 +264,15 @@ public:
     //==============================================================================\r
     static bool isTabUsingJucerComp (TabbedComponent* tc, int tabIndex)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
-        return tdc != nullptr && tdc->isUsingJucerComp;\r
+        return tdc != 0 && tdc->isUsingJucerComp;\r
     }\r
 \r
     static void setTabUsingJucerComp (TabbedComponent* tc, int tabIndex, const bool b)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
         if (tdc != nullptr)\r
@@ -284,10 +284,10 @@ public:
 \r
     static String getTabClassName (TabbedComponent* tc, int tabIndex)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
-        return tdc != nullptr ? tdc->contentClassName : String();\r
+        return tdc != 0 ? tdc->contentClassName : String();\r
     }\r
 \r
     static void setTabClassName (TabbedComponent* tc, int tabIndex, const String& newName)\r
@@ -304,15 +304,15 @@ public:
 \r
     static String getTabConstructorParams (TabbedComponent* tc, int tabIndex)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
-        return tdc != nullptr ? tdc->constructorParams : String();\r
+        return tdc != 0 ? tdc->constructorParams : String();\r
     }\r
 \r
     static void setTabConstructorParams (TabbedComponent* tc, int tabIndex, const String& newParams)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
         if (tdc != nullptr)\r
@@ -324,15 +324,15 @@ public:
 \r
     static String getTabJucerFile (TabbedComponent* tc, int tabIndex)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
-        return tdc != nullptr ? tdc->jucerComponentFile : String();\r
+        return tdc != 0 ? tdc->jucerComponentFile : String();\r
     }\r
 \r
     static void setTabJucerFile (TabbedComponent* tc, int tabIndex, const String& newFile)\r
     {\r
-        auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+        TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
         jassert (tdc != nullptr);\r
 \r
         if (tdc != nullptr)\r
@@ -380,7 +380,7 @@ private:
                 {\r
                     jucerComp.reset();\r
 \r
-                    jucerComp.reset (new TestComponent (ComponentTypeHandler::findParentDocument (this), nullptr, false));\r
+                    jucerComp.reset (new TestComponent (ComponentTypeHandler::findParentDocument (this), 0, false));\r
                     jucerComp->setFilename (jucerComponentFile);\r
                     jucerComp->setToInitialSize();\r
 \r
index 0298e5361841a254ce52597e66c5bce406c5c77b..550d0d85f081663ade88d89ae8e56aca9fc83753 100644 (file)
@@ -115,8 +115,8 @@ public:
     {\r
         ComponentTypeHandler::fillInCreationCode (code, component, memberVariableName);\r
 \r
-        auto te = dynamic_cast<TextEditor*> (component);\r
-        jassert (te != nullptr);\r
+        TextEditor* const te = dynamic_cast<TextEditor*> (component);\r
+        jassert (te != 0);\r
 \r
         String s;\r
         s << memberVariableName << "->setMultiLine (" << CodeHelpers::boolLiteral (te->isMultiLine()) << ");\n"\r
index 167706dbae99e640cbdc51899e1744fcbad96725..f416c23ab41bc304e211a213a8f42ad149107bb0 100644 (file)
@@ -152,9 +152,10 @@ public:
 \r
                 if (doc != nullptr)\r
                 {\r
-                    code.includeFilesCPP.add (File::createFileWithoutCheckingPath (doc->getHeaderFile()\r
-                                                                                       .getRelativePathFrom (code.document->getCppFile().getParentDirectory())\r
-                                                                                       .replaceCharacter ('\\', '/')));\r
+                    code.includeFilesCPP.add (doc->getHeaderFile()\r
+                                                .getRelativePathFrom (code.document->getCppFile().getParentDirectory())\r
+                                                .replaceCharacter ('\\', '/'));\r
+\r
                     classNm = doc->getClassName();\r
                 }\r
                 else\r
@@ -188,7 +189,7 @@ public:
         if (getViewportContentType (vp) == 1)\r
         {\r
             JucerDocument* doc = findParentDocument (vp);\r
-            auto tc = new TestComponent (doc, nullptr, false);\r
+            TestComponent* tc = new TestComponent (doc, 0, false);\r
 \r
             tc->setFilename (getViewportJucerComponentFile (vp));\r
             tc->setToInitialSize();\r
index 6bb89e486ce529209fb3de6f5efd832de0904b31..106788736b4b6a7da5ec36589a272226991872dd 100644 (file)
@@ -50,7 +50,7 @@ public:
 \r
     int chooseBestEnabledPaintRoutine (int paintRoutineWanted) const;\r
 \r
-    ComponentLayout* getComponentLayout() const                 { return nullptr; }\r
+    ComponentLayout* getComponentLayout() const                 { return 0; }\r
 \r
     void addExtraClassProperties (PropertyPanel&);\r
 \r
index feaeff44008f9f59d00499e837a6fa36f9ef1d3d..35384cbe26a41d3c5cb8f921e203c092b625d8a0 100644 (file)
@@ -328,7 +328,7 @@ void PaintElementPath::mouseDrag (const MouseEvent& e)
 \r
 void PaintElementPath::mouseUp (const MouseEvent& e)\r
 {\r
-    if (points[mouseDownOnSegment] == nullptr)\r
+    if (points [mouseDownOnSegment] == 0)\r
         ColouredElement::mouseUp (e);\r
     else\r
         owner->getSelectedPoints().addToSelectionOnMouseUp (points [mouseDownOnSegment],\r
index 6421dba1bf30a324665f31920f29465265315535..16a322e79635c07d010d25dd53cd463dad9b5677 100644 (file)
@@ -38,7 +38,7 @@ public:
         : routine (*element->getOwner()),\r
           elementIndex (element->getOwner()->indexOfElement (element))\r
     {\r
-        jassert (element != nullptr);\r
+        jassert (element != 0);\r
 \r
         if (elementIndex < 0)\r
             findGroupIndices (element->getOwner(), element);\r
@@ -50,27 +50,28 @@ public:
     {\r
         if (containerGroups.size() > 0)\r
         {\r
-            auto group = dynamic_cast<PaintElementGroup*> (routine.getElement (containerGroups.getFirst()));\r
+            PaintElementGroup* group = 0;\r
+            group = dynamic_cast<PaintElementGroup*> (routine.getElement (containerGroups.getFirst()));\r
 \r
-            if (group == nullptr)\r
-                return nullptr;\r
+            if (group == 0)\r
+                return 0;\r
 \r
             for (int i = 1; i < containerGroups.size(); ++i)\r
             {\r
                 group = dynamic_cast<PaintElementGroup*> (group->getElement (containerGroups.getUnchecked(i)));\r
 \r
-                if (group == nullptr)\r
-                    return nullptr;\r
+                if (group == 0)\r
+                    return 0;\r
             }\r
 \r
-            auto e = dynamic_cast<ElementType*> (group->getElement (elementIndex));\r
-            jassert (e != nullptr);\r
+            ElementType* const e = dynamic_cast<ElementType*> (group->getElement (elementIndex));\r
+            jassert (e != 0);\r
             return e;\r
         }\r
         else\r
         {\r
-            auto e = dynamic_cast<ElementType*> (routine.getElement (elementIndex));\r
-            jassert (e != nullptr);\r
+            ElementType* const e = dynamic_cast<ElementType*> (routine.getElement (elementIndex));\r
+            jassert (e != 0);\r
             return e;\r
         }\r
     }\r
@@ -103,13 +104,12 @@ private:
     {\r
         for (int i = pr->getNumElements(); --i >= 0;)\r
         {\r
-            if (auto pg = dynamic_cast<PaintElementGroup*> (pr->getElement (i)))\r
+            PaintElementGroup* const pg = dynamic_cast<PaintElementGroup*> (pr->getElement (i));\r
+\r
+            if (pg != 0 && pg->containsElement (element))\r
             {\r
-                if (pg->containsElement (element))\r
-                {\r
-                    containerGroups.add (i);\r
-                    findGroupIndices (pg, element);\r
-                }\r
+                containerGroups.add (i);\r
+                findGroupIndices (pg, element);\r
             }\r
         }\r
     }\r
@@ -122,13 +122,12 @@ private:
         {\r
             for (int i = group->getNumElements(); --i >= 0;)\r
             {\r
-                if (auto pg = dynamic_cast<PaintElementGroup*> (group->getElement (i)))\r
+                PaintElementGroup* pg = dynamic_cast<PaintElementGroup*> (group->getElement (i));\r
+\r
+                if (pg != 0 && pg->containsElement (element))\r
                 {\r
-                    if (pg->containsElement (element))\r
-                    {\r
-                        containerGroups.add (i);\r
-                        findGroupIndices (pg, element);\r
-                    }\r
+                    containerGroups.add (i);\r
+                    findGroupIndices (pg, element);\r
                 }\r
             }\r
         }\r
index f497314a410d42a625f75316eb6206ce849fd86d..3c3cbd40447eb247bcd96efa55822bef1f96a47b 100644 (file)
@@ -343,9 +343,9 @@ public:
 \r
         Rectangle<int> parentArea;\r
 \r
-        if (component->findParentComponentOfClass<ComponentLayoutEditor>() != nullptr)\r
+        if (component->findParentComponentOfClass<ComponentLayoutEditor>() != 0)\r
             parentArea.setSize (component->getParentWidth(), component->getParentHeight());\r
-        else if (auto pre = dynamic_cast<PaintRoutineEditor*> (component->getParentComponent()))\r
+        else if (PaintRoutineEditor* pre = dynamic_cast<PaintRoutineEditor*> (component->getParentComponent()))\r
             parentArea = pre->getComponentArea();\r
         else\r
             jassertfalse;\r
index 4b079ecdc28a6da2e76e0813459384a5c1f12962..1895f5d44136573387736296d9b321ca8f8df439 100644 (file)
@@ -220,16 +220,16 @@ void ComponentLayoutEditor::refreshAllComponents()
 \r
     for (int i = layout.getNumComponents(); --i >= 0;)\r
     {\r
-        auto c = layout.getComponent (i);\r
+        Component* const c = layout.getComponent (i);\r
         jassert (c != nullptr);\r
 \r
-        auto overlay = getOverlayCompFor (c);\r
+        ComponentOverlayComponent* overlay = getOverlayCompFor (c);\r
 \r
         bool isNewOverlay = false;\r
 \r
-        if (overlay == nullptr)\r
+        if (overlay == 0)\r
         {\r
-            auto handler = ComponentTypeHandler::getHandlerFor (*c);\r
+            ComponentTypeHandler* const handler = ComponentTypeHandler::getHandlerFor (*c);\r
             jassert (handler != nullptr);\r
 \r
             overlay = handler->createOverlayComponent (c, layout);\r
@@ -272,7 +272,7 @@ void ComponentLayoutEditor::mouseDown (const MouseEvent& e)
 {\r
     if (e.mods.isPopupMenu())\r
     {\r
-        auto commandManager = &ProjucerApplication::getCommandManager();\r
+        ApplicationCommandManager* commandManager = &ProjucerApplication::getCommandManager();\r
 \r
         PopupMenu m;\r
 \r
index da36ea9e9f2c73f5daa7f55f7cb93c6971b57570..9aab5943417993cd0e447f1dc21979d72de4cd9f 100644 (file)
@@ -197,7 +197,7 @@ private:
     {\r
     public:\r
         ComponentClassNameProperty (JucerDocument& doc)\r
-            : ComponentTextProperty<Component> ("Class name", 128, false, nullptr, doc)\r
+            : ComponentTextProperty <Component> ("Class name", 128, false, 0, doc)\r
         {}\r
 \r
         void setText (const String& newText) override    { document.setClassName (newText); }\r
@@ -209,7 +209,7 @@ private:
     {\r
     public:\r
         ComponentCompNameProperty (JucerDocument& doc)\r
-            : ComponentTextProperty<Component> ("Component name", 200, false, nullptr, doc)\r
+            : ComponentTextProperty <Component> ("Component name", 200, false, 0, doc)\r
         {}\r
 \r
         void setText (const String& newText) override    { document.setComponentName (newText); }\r
@@ -221,7 +221,7 @@ private:
     {\r
     public:\r
         ComponentParentClassesProperty (JucerDocument& doc)\r
-            : ComponentTextProperty<Component> ("Parent classes", 512, false, nullptr, doc)\r
+            : ComponentTextProperty <Component> ("Parent classes", 512, false, 0, doc)\r
         {}\r
 \r
         void setText (const String& newText) override    { document.setParentClasses (newText); }\r
@@ -233,7 +233,7 @@ private:
     {\r
     public:\r
         ComponentConstructorParamsProperty (JucerDocument& doc)\r
-            : ComponentTextProperty<Component> ("Constructor params", 2048, false, nullptr, doc)\r
+            : ComponentTextProperty <Component> ("Constructor params", 2048, false, 0, doc)\r
         {}\r
 \r
         void setText (const String& newText) override    { document.setConstructorParams (newText); }\r
@@ -245,7 +245,7 @@ private:
     {\r
     public:\r
         ComponentInitialisersProperty (JucerDocument& doc)\r
-            : ComponentTextProperty <Component> ("Member initialisers", 16384, true, nullptr, doc)\r
+            : ComponentTextProperty <Component> ("Member initialisers", 16384, true, 0, doc)\r
         {\r
             preferredHeight = 24 * 3;\r
         }\r
@@ -260,9 +260,9 @@ private:
     {\r
     public:\r
         ComponentInitialSizeProperty (JucerDocument& doc, const bool isWidth_)\r
-            : ComponentTextProperty<Component> (isWidth_ ? "Initial width"\r
-                                                         : "Initial height",\r
-                                     10, false, nullptr, doc),\r
+            : ComponentTextProperty <Component> (isWidth_ ? "Initial width"\r
+                                                          : "Initial height",\r
+                                     10, false, 0, doc),\r
               isWidth (isWidth_)\r
         {}\r
 \r
@@ -289,7 +289,7 @@ private:
     {\r
     public:\r
         FixedSizeProperty (JucerDocument& doc)\r
-            : ComponentChoiceProperty<Component> ("Fixed size", nullptr, doc)\r
+            : ComponentChoiceProperty <Component> ("Fixed size", 0, doc)\r
         {\r
             choices.add ("Resize component to fit workspace");\r
             choices.add ("Keep component size fixed");\r
@@ -304,7 +304,7 @@ private:
     {\r
     public:\r
         TemplateFileProperty (JucerDocument& doc)\r
-            : ComponentTextProperty<Component> ("Template file", 2048, false, nullptr, doc)\r
+            : ComponentTextProperty <Component> ("Template file", 2048, false, 0, doc)\r
         {}\r
 \r
         void setText (const String& newText) override    { document.setTemplateFile (newText); }\r
@@ -394,7 +394,7 @@ void JucerDocumentEditor::updateTabs()
 \r
     for (int i = tabbedComponent.getNumTabs(); --i >= 0;)\r
     {\r
-        if (dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)) != nullptr\r
+        if (dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)) != 0\r
              && ! paintRoutineNames.contains (tabbedComponent.getTabNames() [i]))\r
         {\r
             tabbedComponent.removeTab (i);\r
@@ -485,11 +485,11 @@ void JucerDocumentEditor::showLayout()
 \r
 void JucerDocumentEditor::showGraphics (PaintRoutine* routine)\r
 {\r
-    if (getCurrentPaintRoutine() != routine || routine == nullptr)\r
+    if (getCurrentPaintRoutine() != routine || routine == 0)\r
     {\r
         for (int i = 0; i < tabbedComponent.getNumTabs(); ++i)\r
         {\r
-            if (auto pr = dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)))\r
+            if (PaintRoutinePanel* pr = dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)))\r
             {\r
                 if (routine == &(pr->getPaintRoutine()) || routine == nullptr)\r
                 {\r
@@ -938,7 +938,9 @@ void JucerDocumentEditor::getCommandInfo (const CommandID commandID, Application
 \r
             bool canPaste = false;\r
 \r
-            if (auto doc = parseXML (SystemClipboard::getTextFromClipboard()))\r
+            std::unique_ptr<XmlElement> doc (XmlDocument::parse (SystemClipboard::getTextFromClipboard()));\r
+\r
+            if (doc != nullptr)\r
             {\r
                 if (doc->hasTagName (ComponentLayout::clipboardXmlTag))\r
                     canPaste = (currentLayout != nullptr);\r
@@ -1027,7 +1029,7 @@ bool JucerDocumentEditor::perform (const InvocationInfo& info)
             break;\r
 \r
         case JucerCommandIDs::editCompGraphics:\r
-            showGraphics (nullptr);\r
+            showGraphics (0);\r
             break;\r
 \r
         case JucerCommandIDs::zoomIn:      setZoom (snapToIntegerZoom (getZoom() * 2.0)); break;\r
@@ -1154,7 +1156,9 @@ bool JucerDocumentEditor::perform (const InvocationInfo& info)
 \r
         case StandardApplicationCommandIDs::paste:\r
             {\r
-                if (auto doc = parseXML (SystemClipboard::getTextFromClipboard()))\r
+                std::unique_ptr<XmlElement> doc (XmlDocument::parse (SystemClipboard::getTextFromClipboard()));\r
+\r
+                if (doc != nullptr)\r
                 {\r
                     if (doc->hasTagName (ComponentLayout::clipboardXmlTag))\r
                     {\r
index 545d4327d72053a3b5e06ca0090a2f2381d305ce..3c82b60837520d5512a2a10961219f4c81247189 100644 (file)
@@ -240,7 +240,7 @@ public:
     */\r
     void updateFromComponent (const Component& comp) noexcept\r
     {\r
-        if (comp.getParentComponent() == nullptr && ! comp.isOnDesktop())\r
+        if (comp.getParentComponent() == 0 && ! comp.isOnDesktop())\r
             updateFrom (comp.getBounds(), Rectangle<int>());\r
         else\r
             updateFrom (comp.getBounds(), Rectangle<int> (comp.getParentWidth(), comp.getParentHeight()));\r
@@ -627,12 +627,12 @@ struct RelativePositionedRectangle
                                   int& x, int& xw, int& y, int& yh,\r
                                   int& w, int& h) const\r
     {\r
-        Component* rx = {};\r
-        Component* ry = {};\r
-        Component* rw = {};\r
-        Component* rh = {};\r
+        Component* rx = 0;\r
+        Component* ry = 0;\r
+        Component* rw = 0;\r
+        Component* rh = 0;\r
 \r
-        if (layout != nullptr)\r
+        if (layout != 0)\r
         {\r
             rx = layout->findComponentWithId (relativeToX);\r
             ry = layout->findComponentWithId (relativeToY);\r
@@ -640,12 +640,12 @@ struct RelativePositionedRectangle
             rh = layout->findComponentWithId (relativeToH);\r
         }\r
 \r
-        x = parentArea.getX() + (rx != nullptr ? rx->getX() : 0);\r
-        y = parentArea.getY() + (ry != nullptr ? ry->getY() : 0);\r
-        w = rw != nullptr ? rw->getWidth() : parentArea.getWidth();\r
-        h = rh != nullptr ? rh->getHeight() : parentArea.getHeight();\r
-        xw = rx != nullptr ? rx->getWidth() : parentArea.getWidth();\r
-        yh = ry != nullptr ? ry->getHeight() : parentArea.getHeight();\r
+        x = parentArea.getX() + (rx != 0 ? rx->getX() : 0);\r
+        y = parentArea.getY() + (ry != 0 ? ry->getY() : 0);\r
+        w = rw != 0 ? rw->getWidth() : parentArea.getWidth();\r
+        h = rh != 0 ? rh->getHeight() : parentArea.getHeight();\r
+        xw = rx != 0 ? rx->getWidth() : parentArea.getWidth();\r
+        yh = ry != 0 ? ry->getHeight() : parentArea.getHeight();\r
     }\r
 \r
     Rectangle<int> getRectangle (const Rectangle<int>& parentArea,\r
index f3516b189b3e38559f49ff94e236aa851fb949f8..1d7b0bf97a5ce5ee009b5829c23c7bf5ee53494a 100644 (file)
@@ -502,11 +502,11 @@ void ComponentLayout::setComponentRelativeTarget (Component* comp, int whichDime
 \r
     jassert (comp != nullptr);\r
     jassert (pe != nullptr || components.contains (comp));\r
-    jassert (compToBeRelativeTo == nullptr || components.contains (compToBeRelativeTo));\r
-    jassert (compToBeRelativeTo == nullptr || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp));\r
+    jassert (compToBeRelativeTo == 0 || components.contains (compToBeRelativeTo));\r
+    jassert (compToBeRelativeTo == 0 || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp));\r
 \r
     if (compToBeRelativeTo != getComponentRelativePosTarget (comp, whichDimension)\r
-         && (compToBeRelativeTo == nullptr || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp)))\r
+         && (compToBeRelativeTo == 0 || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp)))\r
     {\r
         const int64 compId = ComponentTypeHandler::getComponentId (compToBeRelativeTo);\r
 \r
@@ -560,9 +560,9 @@ PopupMenu ComponentLayout::getRelativeTargetMenu (Component* comp, int whichDime
 {\r
     PopupMenu m;\r
 \r
-    auto current = getComponentRelativePosTarget (comp, whichDimension);\r
+    Component* const current = getComponentRelativePosTarget (comp, whichDimension);\r
 \r
-    m.addItem (menuIdBase, "Relative to parent component", true, current == nullptr);\r
+    m.addItem (menuIdBase, "Relative to parent component", true, current == 0);\r
     m.addSeparator();\r
 \r
     for (int i = 0; i < components.size(); ++i)\r
index 681a0263fb9dfac9bcfb74d10046c44dc5eef8e1..307c8e79865bad40e64c0b2af1e4d9c63560b21b 100644 (file)
@@ -90,7 +90,7 @@ static LicenseState::ApplicationUsageData getApplicationUsageDataTypeFromValue (
     return LicenseState::ApplicationUsageData::notChosenYet;\r
 }\r
 \r
-#if ! JUCER_ENABLE_GPL_MODE\r
+#if !JUCER_ENABLE_GPL_MODE\r
 struct LicenseController::ModalCompletionCallback : ModalComponentManager::Callback\r
 {\r
     ModalCompletionCallback (LicenseController& controller) : owner (controller) {}\r
@@ -153,7 +153,7 @@ void LicenseController::startWebviewIfNeeded()
 \r
 void LicenseController::logout()\r
 {\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
    #if ! JUCER_ENABLE_GPL_MODE\r
     thread.reset();\r
@@ -169,7 +169,7 @@ void LicenseController::logout()
 \r
 void LicenseController::chooseNewLicense()\r
 {\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
    #if ! JUCER_ENABLE_GPL_MODE\r
     thread.reset();\r
index 8070027cea204c72e13c79562aa84d465f65747f..d970d2968bf9c5ce9e14ab73e09dcbc87ac158e3 100644 (file)
@@ -103,6 +103,9 @@ private:
    #if ! JUCER_ENABLE_GPL_MODE\r
     //==============================================================================\r
     struct ModalCompletionCallback;\r
+    friend struct ModalCompletionCallback;\r
+\r
+    friend struct ContainerDeletePolicy<LicenseThread>;\r
     friend struct LicenseThread;\r
 \r
     //==============================================================================\r
index 8d5febaf3cb20283fcb0f5ba4ea64d6f165116b4..3a51bca4b3986e1cb373132ee5678d6ddc487b6a 100644 (file)
@@ -35,7 +35,7 @@ struct NetWorkerThread   : public Thread,
 \r
     ~NetWorkerThread()\r
     {\r
-        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
         signalThreadShouldExit();\r
         cancelPendingUpdate();\r
@@ -269,10 +269,10 @@ struct LicenseThread : NetWorkerThread
 \r
             if (productKey.isNotEmpty())\r
             {\r
-                DynamicObject::Ptr redeemObject (new DynamicObject());\r
-                redeemObject->setProperty (serialIdentifier, productKey);\r
+                DynamicObject::Ptr redeamObject = new DynamicObject();\r
+                redeamObject->setProperty (serialIdentifier, productKey);\r
 \r
-                String postData (JSON::toString (var (redeemObject.get())));\r
+                String postData (JSON::toString (var (redeamObject.get())));\r
 \r
                 std::unique_ptr<WebInputStream> shared (getSharedWebInputStream (URL ("https://api.roli.com/api/v1/user/products").withPOSTData (postData),\r
                                                                                  true));\r
@@ -295,12 +295,12 @@ struct LicenseThread : NetWorkerThread
             if (chosenLicenseType.isNotEmpty())\r
             {\r
                 // redeem the license\r
-                DynamicObject::Ptr jsonLicenseObject (new DynamicObject());\r
+                DynamicObject::Ptr jsonLicenseObject = new DynamicObject();\r
                 jsonLicenseObject->setProperty (projucerLicenseTypeIdentifier, chosenLicenseType);\r
                 jsonLicenseObject->setProperty (versionIdentifier,     5);\r
 \r
 \r
-                DynamicObject::Ptr jsonLicenseRequest (new DynamicObject());\r
+                DynamicObject::Ptr jsonLicenseRequest = new DynamicObject();\r
                 jsonLicenseRequest->setProperty (licenseIdentifier, var (jsonLicenseObject.get()));\r
                 jsonLicenseRequest->setProperty (searchInternalIdentifier, "com.roli.projucer");\r
                 jsonLicenseRequest->setProperty (licenseTypeIdentifier, "software");\r
index 90efe2429698a9f78bf54123cbb9de2239325761..097f7f798a61751a25d144a2d87781e73d97e25b 100644 (file)
@@ -105,7 +105,7 @@ private:
 \r
     static void checkThread()\r
     {\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
     }\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActivityList)\r
index 0069bacbc4ef88474a30b931113f19e6929a5962..fd7d4bcd0cb2ef871a6826934edc05f542471068 100644 (file)
@@ -106,18 +106,10 @@ public:
         server = createClangServer (command);\r
        #endif\r
 \r
-        for (int i = 0; i < 20; ++i)\r
-        {\r
-            if (connectToPipe (pipeName, 10000))\r
-            {\r
-                MessageTypes::sendPing (*this);\r
-                break;\r
-            }\r
-\r
-            Thread::sleep (50);\r
-        }\r
-\r
-        jassert (isConnected());\r
+        if (connectToPipe (pipeName, 10000))\r
+            MessageTypes::sendPing (*this);\r
+        else\r
+            jassertfalse;\r
 \r
         startTimer (serverKeepAliveTimeout);\r
     }\r
@@ -378,13 +370,13 @@ private:
         scanProjectItem (proj.getMainGroup(), compileUnits, userFiles);\r
 \r
         {\r
-            auto isVSTHost = project.getEnabledModules().isModuleEnabled ("juce_audio_processors")\r
-                   && (project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3") || project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST"));\r
+            auto isVST3Host = project.getModules().isModuleEnabled ("juce_audio_processors")\r
+                           && project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
 \r
             auto isPluginProject = proj.getProjectType().isAudioPlugin();\r
 \r
             OwnedArray<LibraryModule> modules;\r
-            proj.getEnabledModules().createRequiredModules (modules);\r
+            proj.getModules().createRequiredModules (modules);\r
 \r
             for (Project::ExporterIterator exporter (proj); exporter.next();)\r
             {\r
@@ -392,16 +384,16 @@ private:
                 {\r
                     for (auto* m : modules)\r
                     {\r
-                        auto localModuleFolder = proj.getEnabledModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue()\r
+                        auto localModuleFolder = proj.getModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue()\r
                                                         ? proj.getLocalModuleFolder (m->moduleInfo.getID())\r
                                                         : m->moduleInfo.getFolder();\r
 \r
 \r
                         m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits,\r
-                                                    isPluginProject || isVSTHost ? ProjectType::Target::SharedCodeTarget\r
-                                                                                 : ProjectType::Target::unspecified);\r
+                                                    isPluginProject || isVST3Host ? ProjectType::Target::SharedCodeTarget\r
+                                                                                  : ProjectType::Target::unspecified);\r
 \r
-                        if (isPluginProject || isVSTHost)\r
+                        if (isPluginProject || isVST3Host)\r
                             m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, ProjectType::Target::StandalonePlugIn);\r
                     }\r
 \r
@@ -430,7 +422,7 @@ private:
     {\r
         auto liveModules = project.getProjectRoot().getChildWithName (Ids::MODULES);\r
 \r
-        auto xml = parseXML (project.getFile());\r
+        std::unique_ptr<XmlElement> xml (XmlDocument::parse (project.getFile()));\r
 \r
         if (xml == nullptr || ! xml->hasTagName (Ids::JUCERPROJECT.toString()))\r
             return false;\r
@@ -443,7 +435,7 @@ private:
     static bool areAnyModulesMissing (Project& project)\r
     {\r
         OwnedArray<LibraryModule> modules;\r
-        project.getEnabledModules().createRequiredModules (modules);\r
+        project.getModules().createRequiredModules (modules);\r
 \r
         for (auto* module : modules)\r
             if (! module->getFolder().isDirectory())\r
@@ -466,27 +458,18 @@ private:
         StringArray paths;\r
         paths.addArray (getSearchPathsFromString (project.getCompileEngineSettings().getSystemHeaderPathString()));\r
 \r
-        auto isVSTHost = project.getEnabledModules().isModuleEnabled ("juce_audio_processors")\r
-                       && (project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3")\r
-                             || project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST"));\r
-\r
-        auto customVst3Path = getAppSettings().getStoredPath (Ids::vst3Path, TargetOS::getThisOS()).get().toString();\r
+        auto isVST3Host = project.getModules().isModuleEnabled ("juce_audio_processors")\r
+                       && project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
 \r
-        if (customVst3Path.isNotEmpty() && (project.getProjectType().isAudioPlugin() || isVSTHost))\r
-            paths.add (customVst3Path);\r
+        if (project.getProjectType().isAudioPlugin() || isVST3Host)\r
+            paths.add (getAppSettings().getStoredPath (Ids::vst3Path).toString());\r
 \r
         OwnedArray<LibraryModule> modules;\r
-        project.getEnabledModules().createRequiredModules (modules);\r
+        project.getModules().createRequiredModules (modules);\r
 \r
         for (auto* module : modules)\r
-        {\r
             paths.addIfNotAlreadyThere (module->getFolder().getParentDirectory().getFullPathName());\r
 \r
-            if (customVst3Path.isEmpty() && (project.getProjectType().isAudioPlugin() || isVSTHost))\r
-                if (module->getID() == "juce_audio_processors")\r
-                    paths.addIfNotAlreadyThere (module->getFolder().getChildFile ("format_types").getChildFile ("VST3_SDK").getFullPathName());\r
-        }\r
-\r
         return convertSearchPathsToAbsolute (paths);\r
     }\r
 \r
index 1732424097a370531370e0bf69c2c959b1db0d8a..b05e1a63e4c22f2a9560c7383811c7d996c23da2 100644 (file)
@@ -117,31 +117,34 @@ struct ChildProcessCache
 \r
     CompileEngineChildProcess::Ptr getExisting (Project& project) const noexcept\r
     {\r
-        for (auto& p : processes)\r
+        for (CompileEngineChildProcess* p : processes)\r
             if (&(p->project) == &project)\r
-                return *p;\r
+                return p;\r
 \r
-        return {};\r
+        return nullptr;\r
     }\r
 \r
     CompileEngineChildProcess::Ptr getOrCreate (Project& project)\r
     {\r
-        if (auto p = getExisting (project))\r
-            return p;\r
+        CompileEngineChildProcess::Ptr p (getExisting (project));\r
 \r
-        auto p = new CompileEngineChildProcess (project);\r
-        tellNewProcessAboutExistingEditors (*p);\r
-        processes.add (p);\r
-        return *p;\r
+        if (p == nullptr)\r
+        {\r
+            p = new CompileEngineChildProcess (project);\r
+            tellNewProcessAboutExistingEditors (p);\r
+            processes.add (p);\r
+        }\r
+\r
+        return p;\r
     }\r
 \r
-    static void tellNewProcessAboutExistingEditors (CompileEngineChildProcess& process)\r
+    static void tellNewProcessAboutExistingEditors (CompileEngineChildProcess* process)\r
     {\r
-        auto& odm = ProjucerApplication::getApp().openDocumentManager;\r
+        OpenDocumentManager& odm = ProjucerApplication::getApp().openDocumentManager;\r
 \r
         for (int i = odm.getNumOpenDocuments(); --i >= 0;)\r
-            if (auto d = dynamic_cast<SourceCodeDocument*> (odm.getOpenDocument (i)))\r
-                process.editorOpened (d->getFile(), d->getCodeDocument());\r
+            if (SourceCodeDocument* d = dynamic_cast<SourceCodeDocument*> (odm.getOpenDocument (i)))\r
+                process->editorOpened (d->getFile(), d->getCodeDocument());\r
     }\r
 \r
     void removeOrphans()\r
index 21878217db189d0c7d8fe7880570f2ba8f1de2fb..60cfe34ecfb0d89a1a8b684173f2b46fe17a031c 100644 (file)
@@ -114,7 +114,7 @@ private:
 \r
     static void checkThread()\r
     {\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
     }\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ErrorList)\r
index c574ad7515d994d51eaa4104b2409f48be401afc..0174b47547b2a2b926bd68ef6e876fef01de93aa 100644 (file)
@@ -74,7 +74,7 @@ public:
 \r
     void showDocument() override\r
     {\r
-        showSettingsPage (new SettingsComp (*exporter));\r
+        showSettingsPage (new SettingsComp (exporter.get()));\r
     }\r
 \r
     void deleteItem() override\r
@@ -186,15 +186,15 @@ private:
     //==============================================================================\r
     struct SettingsComp  : public Component\r
     {\r
-        SettingsComp (ProjectExporter& exp)\r
-            : group (exp.getName(),\r
-                     ExporterItem::getIconForExporter (&exp),\r
-                     exp.getDescription())\r
+        SettingsComp (ProjectExporter* exp)\r
+            : group (exp->getName(),\r
+                     ExporterItem::getIconForExporter (exp),\r
+                     exp->getDescription())\r
         {\r
             addAndMakeVisible (group);\r
 \r
             PropertyListBuilder props;\r
-            exp.createPropertyEditors (props);\r
+            exp->createPropertyEditors (props);\r
             group.setProperties (props);\r
             parentSizeChanged();\r
         }\r
@@ -234,7 +234,7 @@ public:
 \r
     void showDocument() override\r
     {\r
-        showSettingsPage (new SettingsComp (*config));\r
+        showSettingsPage (new SettingsComp (config));\r
     }\r
 \r
     void deleteItem() override\r
@@ -283,13 +283,13 @@ private:
     class SettingsComp  : public Component\r
     {\r
     public:\r
-        SettingsComp (ProjectExporter::BuildConfiguration& conf)\r
-            : group (conf.exporter.getName() + " - " + conf.getName(), Icon (getIcons().config, Colours::transparentBlack))\r
+        SettingsComp (ProjectExporter::BuildConfiguration* conf)\r
+            : group (conf->exporter.getName() + " - " + conf->getName(), Icon (getIcons().config, Colours::transparentBlack))\r
         {\r
             addAndMakeVisible (group);\r
 \r
             PropertyListBuilder props;\r
-            conf.createPropertyEditors (props);\r
+            conf->createPropertyEditors (props);\r
             group.setProperties (props);\r
             parentSizeChanged();\r
         }\r
index 7a3c3000dd8270eb74aa4df53ee8a75abe09ebca..e95d978665230fbdda76a4688488987464ba5bd3 100644 (file)
@@ -465,21 +465,6 @@ public:
         return getFile().getFileName();\r
     }\r
 \r
-    void paintItem (Graphics& g, int width, int height) override\r
-    {\r
-        JucerTreeViewBase::paintItem (g, width, height);\r
-\r
-        if (item.needsSaving())\r
-        {\r
-            auto bounds = g.getClipBounds().withY (0).withHeight (height);\r
-\r
-            g.setFont (getFont());\r
-            g.setColour (getContentColour (false));\r
-\r
-            g.drawFittedText ("*", bounds.removeFromLeft (height), Justification::centred, 1);\r
-        }\r
-    }\r
-\r
     static File findCorrespondingHeaderOrCpp (const File& f)\r
     {\r
         if (f.hasFileExtension (sourceFileExtensions))  return f.withFileExtension (".h");\r
@@ -730,7 +715,7 @@ public:
 \r
     static void setFilesToCompile (Project::Item item, const bool shouldCompile)\r
     {\r
-        if (item.isFile() && (item.getFile().hasFileExtension (fileTypesToCompileByDefault)))\r
+        if (item.isFile())\r
             item.getShouldCompileValue() = shouldCompile;\r
 \r
         for (auto i = item.getNumChildren(); --i >= 0;)\r
index 11b215e7e0d9f51d745e2ad977c97735e7095779..3a5b300b112e8b5d8508ed687fc65fc00e09b095 100644 (file)
@@ -67,7 +67,7 @@ class LiveBuildTab    : public Component,
                         private ChangeListener\r
 {\r
 public:\r
-    LiveBuildTab (const CompileEngineChildProcess::Ptr& child, String lastErrorMessage)\r
+    LiveBuildTab (CompileEngineChildProcess* child, String lastErrorMessage)\r
     {\r
         settingsButton.reset (new IconButton ("Settings", &getIcons().settings));\r
         addAndMakeVisible (settingsButton.get());\r
@@ -80,11 +80,13 @@ public:
         if (child != nullptr)\r
         {\r
             addAndMakeVisible (concertinaPanel);\r
-            buildConcertina (*child);\r
+            buildConcertina (child);\r
             isEnabled = true;\r
         }\r
         else\r
         {\r
+            isEnabled = false;\r
+\r
             errorMessage = getErrorMessage();\r
             errorMessageLabel.reset (new Label ("Error", errorMessage));\r
             errorMessageLabel->setJustificationType (Justification::centred);\r
@@ -156,7 +158,7 @@ public:
         }\r
     }\r
 \r
-    bool isEnabled = false;\r
+    bool isEnabled;\r
     String errorMessage;\r
     Component::SafePointer<ProjucerAppClasses::ErrorListComp> errorListComp;\r
 \r
@@ -230,16 +232,16 @@ private:
         }\r
     }\r
 \r
-    void buildConcertina (CompileEngineChildProcess& child)\r
+    void buildConcertina (CompileEngineChildProcess* child)\r
     {\r
         for (auto i = concertinaPanel.getNumPanels() - 1; i >= 0 ; --i)\r
             concertinaPanel.removePanel (concertinaPanel.getPanel (i));\r
 \r
         headers.clear();\r
 \r
-        errorListComp = new ProjucerAppClasses::ErrorListComp (child.errorList);\r
-        auto* activities = new CurrentActivitiesComp (child.activityList);\r
-        auto* comps = new ComponentListComp (child);\r
+        errorListComp = new ProjucerAppClasses::ErrorListComp (child->errorList);\r
+        auto* activities = new CurrentActivitiesComp (child->activityList);\r
+        auto* comps = new ComponentListComp (*child);\r
 \r
         concertinaPanel.addPanel (-1, errorListComp, true);\r
         concertinaPanel.addPanel (-1, comps, true);\r
index c2b114de3acf824219b7c2fb6d03bdb765388827..708e25a46208712992f44d03185be84a510559b3 100644 (file)
@@ -34,10 +34,10 @@ public:
     ModuleItem (Project& p, const String& modID)\r
         : project (p), moduleID (modID)\r
     {\r
-        missingDependencies = project.getEnabledModules().getExtraDependenciesNeeded (moduleID).size() > 0;\r
-        cppStandardHigherThanProject = project.getEnabledModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
+        missingDependencies = project.getModules().getExtraDependenciesNeeded (moduleID).size() > 0;\r
+        cppStandardHigherThanProject = project.getModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
 \r
-        moduleInfo = project.getEnabledModules().getModuleInfo (moduleID);\r
+        moduleInfo = project.getModules().getModuleInfo (moduleID);\r
     }\r
 \r
     bool canBeSelected() const override       { return true; }\r
@@ -57,7 +57,7 @@ public:
     void deleteItem() override\r
     {\r
         closeSettingsPage();\r
-        project.getEnabledModules().removeModule (moduleID);\r
+        project.getModules().removeModule (moduleID);\r
     }\r
 \r
     Icon getIcon() const override\r
@@ -101,7 +101,7 @@ public:
     bool checkCppStandard()\r
     {\r
         auto oldVal = cppStandardHigherThanProject;\r
-        cppStandardHigherThanProject = project.getEnabledModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
+        cppStandardHigherThanProject = project.getModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
 \r
         if (oldVal != cppStandardHigherThanProject)\r
             return true;\r
@@ -109,6 +109,20 @@ public:
         return false;\r
     }\r
 \r
+    void refreshModuleInfoIfCurrentlyShowing (bool juceModulePathChanged)\r
+    {\r
+        auto isJuceModule = isJUCEModule (moduleID);\r
+        auto shouldRefresh = (juceModulePathChanged && isJuceModule) || (! juceModulePathChanged && ! isJuceModule);\r
+\r
+        if (! shouldRefresh)\r
+            return;\r
+\r
+        if (auto* pcc = getProjectContentComponent())\r
+            if (auto* settingsPanel = dynamic_cast<ModuleSettingsPanel*> (pcc->getEditorComponentContent()))\r
+                if (settingsPanel->getModuleID() == moduleID)\r
+                    showDocument();\r
+    }\r
+\r
     Project& project;\r
     String moduleID;\r
 \r
@@ -119,12 +133,11 @@ private:
 \r
     //==============================================================================\r
     class ModuleSettingsPanel  : public Component,\r
-                                 private Value::Listener,\r
-                                 private Timer\r
+                                 private Value::Listener\r
     {\r
     public:\r
         ModuleSettingsPanel (Project& p, const String& modID, TreeView* tree)\r
-            : group (p.getEnabledModules().getModuleInfo (modID).getID(),\r
+            : group (p.getModules().getModuleInfo (modID).getID(),\r
                      Icon (getIcons().singleModule, Colours::transparentBlack)),\r
               project (p),\r
               modulesTree (tree),\r
@@ -136,7 +149,7 @@ private:
 \r
         void refresh()\r
         {\r
-            auto& modules = project.getEnabledModules();\r
+            auto& modules = project.getModules();\r
 \r
             setEnabled (modules.isModuleEnabled (moduleID));\r
 \r
@@ -150,22 +163,21 @@ private:
             if (modules.doesModuleHaveHigherCppStandardThanProject (moduleID))\r
                 props.add (new CppStandardWarningComponent());\r
 \r
-            group.properties.clear();\r
-            exporterModulePathValues.clear();\r
+            modulePathValueSources.clear();\r
 \r
             for (Project::ExporterIterator exporter (project); exporter.next();)\r
             {\r
                 if (exporter->isCLion())\r
                     continue;\r
 \r
-                exporterModulePathValues.add (exporter->getPathForModuleValue (moduleID));\r
+                auto key = isJUCEModule (moduleID) ? Ids::defaultJuceModulePath\r
+                                                   : Ids::defaultUserModulePath;\r
 \r
-                auto& value = exporterModulePathValues.getReference (exporterModulePathValues.size() - 1);\r
-                value.onDefaultChange = [this] { startTimer (50); };\r
+                Value src (modulePathValueSources.add (new DependencyPathValueSource (exporter->getPathForModuleValue (moduleID),\r
+                                                                                      key, exporter->getTargetOSForExporter())));\r
 \r
-                auto* pathComponent = new FilePathPropertyComponent (value, "Path for " + exporter->getName().quoted(), true,\r
-                                                                     exporter->getTargetOSForExporter() == TargetOS::getThisOS(),\r
-                                                                     "*", project.getProjectFolder());\r
+                auto* pathComponent = new DependencyFilePathPropertyComponent (src, "Path for " + exporter->getName().quoted(),\r
+                                                                               true, "*", project.getProjectFolder());\r
 \r
                 props.add (pathComponent,\r
                            "A path to the folder that contains the " + moduleID + " module when compiling the "\r
@@ -175,11 +187,10 @@ private:
                            "is empty then the global path will be used.");\r
 \r
                 pathComponent->setEnabled (! modules.shouldUseGlobalPath (moduleID));\r
+                pathComponent->getValue().addListener (this);\r
             }\r
 \r
-            globalPathValue.removeListener (this);\r
             globalPathValue.referTo (modules.getShouldUseGlobalPathValue (moduleID));\r
-            globalPathValue.addListener (this);\r
 \r
             auto menuItemString = (TargetOS::getThisOS() == TargetOS::osx ? "\"Projucer->Global Paths...\""\r
                                                                           : "\"File->Global Paths...\"");\r
@@ -189,6 +200,7 @@ private:
                        String ("If this is enabled, then the locally-stored global path (set in the ") + menuItemString + " menu item) "\r
                        "will be used as the path to this module. "\r
                        "This means that if this Projucer project is opened on another machine it will use that machine's global path as the path to this module.");\r
+            globalPathValue.addListener (this);\r
 \r
             props.add (new BooleanPropertyComponent (modules.shouldCopyModuleFilesLocally (moduleID),\r
                                                      "Create local copy", "Copy the module into the project folder"),\r
@@ -227,19 +239,33 @@ private:
         String getModuleID() const noexcept    { return moduleID; }\r
 \r
     private:\r
-        void valueChanged (Value&) override    { startTimer (50); }\r
-        void timerCallback() override          { stopTimer(); refresh(); }\r
-\r
-        //==============================================================================\r
-        Array<ValueWithDefault> exporterModulePathValues;\r
-        Value globalPathValue;\r
-\r
-        OwnedArray <Project::ConfigFlag> configFlags;\r
-\r
         PropertyGroupComponent group;\r
         Project& project;\r
         SafePointer<TreeView> modulesTree;\r
         String moduleID;\r
+        Value globalPathValue;\r
+        Value defaultJuceModulePathValue, defaultUserModulePathValue;\r
+        OwnedArray <Project::ConfigFlag> configFlags;\r
+\r
+        ReferenceCountedArray<Value::ValueSource> modulePathValueSources;\r
+\r
+        //==============================================================================\r
+        void valueChanged (Value& v) override\r
+        {\r
+            if (v == globalPathValue)\r
+            {\r
+                auto useGlobalPath =  globalPathValue.getValue();\r
+\r
+                for (auto prop : group.properties)\r
+                {\r
+                    if (auto* pathPropertyComponent = dynamic_cast<DependencyFilePathPropertyComponent*> (prop))\r
+                        pathPropertyComponent->setEnabled (! useGlobalPath);\r
+                }\r
+            }\r
+\r
+            if (auto* infoComponent = dynamic_cast<ModuleInfoComponent*> (group.properties.getUnchecked (0)))\r
+                infoComponent->refresh();\r
+        }\r
 \r
         //==============================================================================\r
         class ModuleInfoComponent  : public PropertyComponent,\r
@@ -250,14 +276,15 @@ private:
                 : PropertyComponent ("Module", 150), project (p), moduleID (modID)\r
             {\r
                 for (Project::ExporterIterator exporter (project); exporter.next();)\r
-                    listeningValues.add (new Value (exporter->getPathForModuleValue (moduleID).getPropertyAsValue()))->addListener (this);\r
+                    listeningValues.add (new Value (exporter->getPathForModuleValue (moduleID)))\r
+                        ->addListener (this);\r
 \r
                 refresh();\r
             }\r
 \r
             void refresh() override\r
             {\r
-                info = project.getEnabledModules().getModuleInfo (moduleID);\r
+                info = project.getModules().getModuleInfo (moduleID);\r
                 repaint();\r
             }\r
 \r
@@ -310,7 +337,7 @@ private:
             MissingDependenciesComponent (Project& p, const String& modID)\r
                 : PropertyComponent ("Dependencies", 100),\r
                   project (p), moduleID (modID),\r
-                  missingDependencies (project.getEnabledModules().getExtraDependenciesNeeded (modID))\r
+                  missingDependencies (project.getModules().getExtraDependenciesNeeded (modID))\r
             {\r
                 addAndMakeVisible (fixButton);\r
                 fixButton.setColour (TextButton::buttonColourId, Colours::red);\r
@@ -332,14 +359,28 @@ private:
 \r
             void fixDependencies()\r
             {\r
-                if (! tryToFix())\r
+                ModuleList list;\r
+\r
+                list.scanGlobalJuceModulePath();\r
+\r
+                if (! tryToFix (list))\r
                 {\r
-                    AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
-                                                      "Adding Missing Dependencies",\r
-                                                      "Couldn't locate some of these modules - you'll need to find their "\r
-                                                      "folders manually and add them to the list.");\r
+                    list.scanGlobalUserModulePath();\r
 \r
-                    return;\r
+                    if (! tryToFix (list))\r
+                    {\r
+                        list.scanProjectExporterModulePaths (project);\r
+\r
+                        if (! tryToFix (list))\r
+                        {\r
+                            AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
+                                                              "Adding Missing Dependencies",\r
+                                                              "Couldn't locate some of these modules - you'll need to find their "\r
+                                                              "folders manually and add them to the list.");\r
+\r
+                            return;\r
+                        }\r
+                    }\r
                 }\r
 \r
                 refreshAndReselectItem();\r
@@ -356,21 +397,18 @@ private:
             StringArray missingDependencies;\r
             TextButton fixButton { "Add Required Modules" };\r
 \r
-            bool tryToFix()\r
+            bool tryToFix (ModuleList& list)\r
             {\r
-                auto& enabledModules   = project.getEnabledModules();\r
-\r
-                auto copyLocally       = enabledModules.areMostModulesCopiedLocally();\r
-                auto useGlobalPath     = enabledModules.areMostModulesUsingGlobalPath();\r
+                auto& modules      = project.getModules();\r
+                auto copyLocally   = modules.areMostModulesCopiedLocally();\r
+                auto useGlobalPath = modules.areMostModulesUsingGlobalPath();\r
 \r
                 StringArray missing;\r
 \r
                 for (auto missingModule : missingDependencies)\r
                 {\r
-                    auto mod = project.getModuleWithID (missingModule);\r
-\r
-                    if (mod.second != File())\r
-                        enabledModules.addModule (mod.second, copyLocally, useGlobalPath, false);\r
+                    if (auto* info = list.getModuleWithID (missingModule))\r
+                        modules.addModule (info->moduleFolder, copyLocally, useGlobalPath, false);\r
                     else\r
                         missing.add (missingModule);\r
                 }\r
@@ -438,29 +476,22 @@ private:
 \r
 //==============================================================================\r
 class EnabledModulesItem   : public ProjectTreeItemBase,\r
-                             private Value::Listener,\r
-                             private AvailableModuleList::Listener\r
+                             private Value::Listener\r
 {\r
 public:\r
     EnabledModulesItem (Project& p)\r
         : project (p),\r
-          moduleListTree (p.getEnabledModules().state)\r
+          moduleListTree (p.getModules().state)\r
     {\r
         moduleListTree.addListener (this);\r
 \r
         projectCppStandardValue.referTo (project.getProjectValue (Ids::cppLanguageStandard));\r
-        projectCppStandardValue.addListener (this);\r
+        defaultJuceModulePathValue.referTo (getAppSettings().getStoredPath (Ids::defaultJuceModulePath));\r
+        defaultUserModulePathValue.referTo (getAppSettings().getStoredPath (Ids::defaultUserModulePath));\r
 \r
-        ProjucerApplication::getApp().getJUCEPathModuleList().addListener (this);\r
-        ProjucerApplication::getApp().getUserPathsModuleList().addListener (this);\r
-        project.getExporterPathsModuleList().addListener (this);\r
-    }\r
-\r
-    ~EnabledModulesItem()\r
-    {\r
-        ProjucerApplication::getApp().getJUCEPathModuleList().removeListener (this);\r
-        ProjucerApplication::getApp().getUserPathsModuleList().removeListener (this);\r
-        project.getExporterPathsModuleList().removeListener (this);\r
+        projectCppStandardValue.addListener (this);\r
+        defaultJuceModulePathValue.addListener (this);\r
+        defaultUserModulePathValue.addListener (this);\r
     }\r
 \r
     int getItemHeight() const override      { return 22; }\r
@@ -510,63 +541,43 @@ public:
         }\r
 \r
         for (int i = 0; i < modules.size(); ++i)\r
-            project.getEnabledModules().addModule (modules.getReference(i).moduleFolder,\r
-                                                   project.getEnabledModules().areMostModulesCopiedLocally(),\r
-                                                   project.getEnabledModules().areMostModulesUsingGlobalPath(),\r
-                                                   true);\r
+            project.getModules().addModule (modules.getReference(i).moduleFolder,\r
+                                            project.getModules().areMostModulesCopiedLocally(),\r
+                                            project.getModules().areMostModulesUsingGlobalPath(),\r
+                                            true);\r
     }\r
 \r
     void addSubItems() override\r
     {\r
-        for (int i = 0; i < project.getEnabledModules().getNumModules(); ++i)\r
-            addSubItem (new ModuleItem (project, project.getEnabledModules().getModuleID (i)));\r
+        for (int i = 0; i < project.getModules().getNumModules(); ++i)\r
+            addSubItem (new ModuleItem (project, project.getModules().getModuleID (i)));\r
     }\r
 \r
     void showPopupMenu() override\r
     {\r
-        auto& enabledModules = project.getEnabledModules();\r
-        PopupMenu allModules;\r
+        auto& modules = project.getModules();\r
+        PopupMenu knownModules, jucePathModules, userPathModules, exporterPathsModules;\r
 \r
         int index = 100;\r
+        for (auto m : getAvailableModulesInGlobalJucePath())\r
+            jucePathModules.addItem (index++, m, ! modules.isModuleEnabled (m));\r
 \r
-        // JUCE path\r
-        PopupMenu jucePathModules;\r
-\r
-        for (auto& mod : ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules())\r
-            jucePathModules.addItem (index++, mod.first, ! enabledModules.isModuleEnabled (mod.first));\r
-\r
-        jucePathModules.addSeparator();\r
-        jucePathModules.addItem (-1, "Re-scan path");\r
+        knownModules.addSubMenu ("Global JUCE modules path", jucePathModules);\r
 \r
-        allModules.addSubMenu ("Global JUCE modules path", jucePathModules);\r
-\r
-        // User path\r
         index = 200;\r
-        PopupMenu userPathModules;\r
-\r
-        for (auto& mod : ProjucerApplication::getApp().getUserPathsModuleList().getAllModules())\r
-            userPathModules.addItem (index++, mod.first, ! enabledModules.isModuleEnabled (mod.first));\r
+        for (auto m : getAvailableModulesInGlobalUserPath())\r
+            userPathModules.addItem (index++, m, ! modules.isModuleEnabled (m));\r
 \r
-        userPathModules.addSeparator();\r
-        userPathModules.addItem (-2, "Re-scan path");\r
+        knownModules.addSubMenu ("Global user modules path", userPathModules);\r
 \r
-        allModules.addSubMenu ("Global user modules path", userPathModules);\r
-\r
-        // Exporter path\r
         index = 300;\r
-        PopupMenu exporterPathModules;\r
-\r
-        for (auto& mod : project.getExporterPathsModuleList().getAllModules())\r
-            exporterPathModules.addItem (index++, mod.first, ! enabledModules.isModuleEnabled (mod.first));\r
-\r
-        exporterPathModules.addSeparator();\r
-        exporterPathModules.addItem (-3, "Re-scan path");\r
+        for (auto m : getAvailableModulesInExporterPaths())\r
+            exporterPathsModules.addItem (index++, m, ! modules.isModuleEnabled (m));\r
 \r
-        allModules.addSubMenu ("Exporter paths", exporterPathModules);\r
+        knownModules.addSubMenu ("Exporter paths", exporterPathsModules);\r
 \r
         PopupMenu menu;\r
-        menu.addSubMenu ("Add a module", allModules);\r
-\r
+        menu.addSubMenu ("Add a module", knownModules);\r
         menu.addSeparator();\r
         menu.addItem (1001, "Add a module from a specified folder...");\r
 \r
@@ -575,40 +586,67 @@ public:
 \r
     void handlePopupMenuResult (int resultCode) override\r
     {\r
+        auto& modules = project.getModules();\r
+\r
         if (resultCode == 1001)\r
         {\r
-            project.getEnabledModules().addModuleFromUserSelectedFile();\r
-        }\r
-        else if (resultCode < 0)\r
-        {\r
-            if      (resultCode == -1)  ProjucerApplication::getApp().rescanJUCEPathModules();\r
-            else if (resultCode == -2)  ProjucerApplication::getApp().rescanUserPathModules();\r
-            else if (resultCode == -3)  project.rescanExporterPathModules();\r
+            modules.addModuleFromUserSelectedFile();\r
         }\r
         else if (resultCode > 0)\r
         {\r
-            std::vector<ModuleIDAndFolder> list;\r
-            int offset = -1;\r
-\r
             if (resultCode < 200)\r
-            {\r
-                list = ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules();\r
-                offset = 100;\r
-            }\r
+                modules.addModuleInteractive (getAvailableModulesInGlobalJucePath() [resultCode - 100]);\r
             else if (resultCode < 300)\r
-            {\r
-                list = ProjucerApplication::getApp().getUserPathsModuleList().getAllModules();\r
-                offset = 200;\r
-            }\r
+                modules.addModuleInteractive (getAvailableModulesInGlobalUserPath() [resultCode - 200]);\r
             else if (resultCode < 400)\r
-            {\r
-                list = project.getExporterPathsModuleList().getAllModules();\r
-                offset = 300;\r
-            }\r
+                modules.addModuleInteractive (getAvailableModulesInExporterPaths() [resultCode - 300]);\r
+        }\r
+    }\r
+\r
+    StringArray getAvailableModulesInGlobalJucePath()\r
+    {\r
+        ModuleList list;\r
+        list.addAllModulesInFolder ({ getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString() });\r
+\r
+        return list.getIDs();\r
+    }\r
+\r
+    StringArray getAvailableModulesInGlobalUserPath()\r
+    {\r
+        ModuleList list;\r
+        auto paths = StringArray::fromTokens (getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString(), ";", {});\r
+\r
+        for (auto p : paths)\r
+        {\r
+            p = p.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
 \r
-            if (offset != -1)\r
-                project.getEnabledModules().addModuleInteractive (list[(size_t) (resultCode - offset)].first);\r
+            auto f = File::createFileWithoutCheckingPath (p.trim());\r
+            if (f.exists())\r
+                list.addAllModulesInFolder (f);\r
         }\r
+\r
+        auto ids = list.getIDs();\r
+\r
+        for (auto m : getAvailableModulesInGlobalJucePath())\r
+            ids.removeString (m);\r
+\r
+        return ids;\r
+    }\r
+\r
+    StringArray getAvailableModulesInExporterPaths()\r
+    {\r
+        ModuleList list;\r
+        list.scanProjectExporterModulePaths (project);\r
+\r
+        auto ids = list.getIDs();\r
+\r
+        for (auto m : getAvailableModulesInGlobalJucePath())\r
+            ids.removeString (m);\r
+\r
+        for (auto m : getAvailableModulesInGlobalUserPath())\r
+            ids.removeString (m);\r
+\r
+        return ids;\r
     }\r
 \r
     //==============================================================================\r
@@ -625,7 +663,7 @@ public:
 private:\r
     Project& project;\r
     ValueTree moduleListTree;\r
-    Value projectCppStandardValue;\r
+    Value projectCppStandardValue, defaultJuceModulePathValue, defaultUserModulePathValue;\r
 \r
     //==============================================================================\r
     void valueChanged (Value& v) override\r
@@ -644,26 +682,17 @@ private:
                 }\r
             }\r
         }\r
-    }\r
-\r
-    void removeDuplicateModules()\r
-    {\r
-        auto jucePathModuleList = ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules();\r
-\r
-        auto& userPathModules = ProjucerApplication::getApp().getUserPathsModuleList();\r
-        userPathModules.removeDuplicates (jucePathModuleList);\r
+        else if (v == defaultJuceModulePathValue || v == defaultUserModulePathValue)\r
+        {\r
+            auto juceModulePathChanged = (v == defaultJuceModulePathValue);\r
 \r
-        auto& exporterPathModules = project.getExporterPathsModuleList();\r
-        exporterPathModules.removeDuplicates (jucePathModuleList);\r
-        exporterPathModules.removeDuplicates (userPathModules.getAllModules());\r
-    }\r
+            for (int i = 0; i < getNumSubItems(); ++i)\r
+                if (auto* moduleItem = dynamic_cast<ModuleItem*> (getSubItem (i)))\r
+                    moduleItem->refreshModuleInfoIfCurrentlyShowing (juceModulePathChanged);\r
 \r
-    void availableModulesChanged() override\r
-    {\r
-        removeDuplicateModules();\r
-        refreshSubItems();\r
+            refreshSubItems();\r
+        }\r
     }\r
 \r
-    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnabledModulesItem)\r
 };\r
index bdf3c633fca52ca1bf77d44669b6c1e7cbf8ba80..f3ba6502ac1ae470689769379110d397b47903da 100644 (file)
@@ -206,7 +206,7 @@ void HeaderComponent::sidebarTabsWidthChanged (int newWidth) noexcept
 void HeaderComponent::showUserSettings() noexcept\r
 {\r
    #if JUCER_ENABLE_GPL_MODE\r
-    auto settingsPopupHeight = 100;\r
+    auto settingsPopupHeight = 40;\r
     auto settingsPopupWidth = 200;\r
    #else\r
     auto settingsPopupHeight = 150;\r
@@ -289,7 +289,7 @@ void HeaderComponent::initialiseButtons() noexcept
     {\r
         sendProjectButtonAnalyticsEvent ("User Settings");\r
 \r
-        if (findParentComponentOfClass<ProjectContentComponent>() != nullptr)\r
+        if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
             showUserSettings();\r
     };\r
 \r
index d5fa108f31ea3f6f087b463228f49aa99f93638c..0578ba746a6f58a6052029426b5e0386b4874bc4 100644 (file)
@@ -35,7 +35,7 @@ class ModulesInformationComponent  : public Component,
 public:\r
     ModulesInformationComponent (Project& p)\r
         : project (p),\r
-          modulesValueTree (p.getEnabledModules().state)\r
+          modulesValueTree (p.getModules().state)\r
     {\r
         listHeader = new ListBoxHeader ( { "Module", "Version", "Make Local Copy", "Paths" },\r
                                         { 0.25f, 0.2f, 0.2f, 0.35f } );\r
@@ -106,7 +106,7 @@ public:
 \r
     int getNumRows() override\r
     {\r
-        return project.getEnabledModules().getNumModules();\r
+        return project.getModules().getNumModules();\r
     }\r
 \r
     void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) override\r
@@ -123,26 +123,26 @@ public:
         g.setColour (rowIsSelected ? findColour (defaultHighlightedTextColourId) : findColour (widgetTextColourId));\r
 \r
         //======================================================================\r
-        auto moduleID = project.getEnabledModules().getModuleID (rowNumber);\r
+        auto moduleID = project.getModules().getModuleID (rowNumber);\r
 \r
         g.drawFittedText (moduleID, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (0) * width)), Justification::centredLeft, 1);\r
 \r
         //======================================================================\r
-        auto version = project.getEnabledModules().getModuleInfo (moduleID).getVersion();\r
+        auto version = project.getModules().getModuleInfo (moduleID).getVersion();\r
         if (version.isEmpty())\r
             version = "?";\r
 \r
         g.drawFittedText (version, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (1) * width)), Justification::centredLeft, 1);\r
 \r
         //======================================================================\r
-        auto copyLocally = project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID).getValue() ? "Yes" : "No";\r
+        auto copyLocally = project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue() ? "Yes" : "No";\r
 \r
         g.drawFittedText (copyLocally, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (2) * width)), Justification::centredLeft, 1);\r
 \r
         //======================================================================\r
         String pathText;\r
 \r
-        if (project.getEnabledModules().shouldUseGlobalPath (moduleID))\r
+        if (project.getModules().shouldUseGlobalPath (moduleID))\r
         {\r
             pathText = "Global";\r
         }\r
@@ -161,7 +161,7 @@ public:
 \r
     void listBoxItemDoubleClicked (int row, const MouseEvent&) override\r
     {\r
-        auto moduleID = project.getEnabledModules().getModuleID (row);\r
+        auto moduleID = project.getModules().getModuleID (row);\r
 \r
         if (moduleID.isNotEmpty())\r
             if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
@@ -170,7 +170,7 @@ public:
 \r
     void deleteKeyPressed (int row) override\r
     {\r
-        project.getEnabledModules().removeModule (project.getEnabledModules().getModuleID (row));\r
+        project.getModules().removeModule (project.getModules().getModuleID (row));\r
     }\r
 \r
     void lookAndFeelChanged() override\r
@@ -224,7 +224,7 @@ private:
         auto res = m.showAt (&setCopyModeButton);\r
 \r
         if (res != 0)\r
-            project.getEnabledModules().setLocalCopyModeForAllModules (res == 1);\r
+            project.getModules().setLocalCopyModeForAllModules (res == 1);\r
     }\r
 \r
     void showGlobalPathsMenu()\r
@@ -243,7 +243,7 @@ private:
         {\r
             auto enableGlobalPaths = (res % 2 == 1);\r
 \r
-            auto& moduleList = project.getEnabledModules();\r
+            auto& moduleList = project.getModules();\r
 \r
             if (res < 3)\r
             {\r
@@ -271,7 +271,7 @@ private:
             pastePathsID\r
         };\r
 \r
-        auto& moduleList = project.getEnabledModules();\r
+        auto& moduleList = project.getModules();\r
         auto moduleToCopy = moduleList.getModuleID (list.getSelectedRow());\r
 \r
         if (moduleToCopy.isNotEmpty())\r
@@ -292,7 +292,7 @@ private:
                         auto modID = moduleList.getModuleID (i);\r
 \r
                         if (modID != moduleToCopy)\r
-                            exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).get();\r
+                            exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).getValue();\r
                     }\r
                 }\r
             }\r
@@ -301,7 +301,7 @@ private:
                  modulePathClipboard.clear();\r
 \r
                  for (Project::ExporterIterator exporter (project); exporter.next();)\r
-                     modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).get();\r
+                     modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).getValue();\r
             }\r
             else if (res == pastePathsID)\r
             {\r
index 4896430cc760afc606f9fd43d67e2d7c0daf6bb9..6137807dfa6971a1e11bd8215dcf441e197527c9 100644 (file)
@@ -39,10 +39,8 @@ struct LogoComponent  : public Component
 {\r
     LogoComponent()\r
     {\r
-        if (auto svg = parseXML (BinaryData::background_logo_svg))\r
-            logo.reset (Drawable::createFromSVG (*svg));\r
-        else\r
-            jassertfalse;\r
+        std::unique_ptr<XmlElement> svg (XmlDocument::parse (BinaryData::background_logo_svg));\r
+        logo.reset (Drawable::createFromSVG (*svg));\r
     }\r
 \r
     void paint (Graphics& g) override\r
@@ -336,13 +334,6 @@ void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster*)
     updateMissingFileStatuses();\r
 }\r
 \r
-void ProjectContentComponent::refreshProjectTreeFileStatuses()\r
-{\r
-    if (auto* projectTab = getProjectTab())\r
-        if (auto* fileTree = projectTab->getFileTreePanel())\r
-            fileTree->repaint();\r
-}\r
-\r
 void ProjectContentComponent::updateMissingFileStatuses()\r
 {\r
     if (auto* pTab = getProjectTab())\r
@@ -491,8 +482,6 @@ void ProjectContentComponent::saveDocument()
     {\r
         if (! currentDocument->save())\r
             showSaveWarning (currentDocument);\r
-\r
-        refreshProjectTreeFileStatuses();\r
     }\r
     else\r
     {\r
@@ -502,13 +491,8 @@ void ProjectContentComponent::saveDocument()
 \r
 void ProjectContentComponent::saveAs()\r
 {\r
-    if (currentDocument != nullptr)\r
-    {\r
-        if (! currentDocument->saveAs())\r
-            showSaveWarning (currentDocument);\r
-\r
-        refreshProjectTreeFileStatuses();\r
-    }\r
+    if (currentDocument != nullptr && ! currentDocument->saveAs())\r
+        showSaveWarning (currentDocument);\r
 }\r
 \r
 bool ProjectContentComponent::goToPreviousFile()\r
@@ -847,7 +831,6 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica
                         "Saves the current project",\r
                         CommandCategories::general, 0);\r
         result.setActive (project != nullptr && ! project->isCurrentlySaving());\r
-        result.defaultKeypresses.add ({ 'p', ModifierKeys::commandModifier, 0 });\r
         break;\r
 \r
     case CommandIDs::closeProject:\r
index 6c7254ae68db715e322ef90767186800e1fd5786..758ac33671633b8dca7f3d7d2723061842abbeb4 100644 (file)
@@ -97,7 +97,6 @@ public:
 \r
     void deleteSelectedTreeItems();\r
 \r
-    void refreshProjectTreeFileStatuses();\r
     void updateMissingFileStatuses();\r
     void createProjectTabs();\r
     void deleteProjectTabs();\r
index fa85fd0cf9330f49c11572be5c7bf111ea57fbf0..233bc9de183365bed389a4390c1352f80710aee3 100644 (file)
 */\r
 \r
 #include "../Application/jucer_Headers.h"\r
+#include "jucer_Module.h"\r
 #include "../ProjectSaving/jucer_ProjectSaver.h"\r
 #include "../ProjectSaving/jucer_ProjectExport_Xcode.h"\r
-#include "../Application/jucer_Application.h"\r
+#include "../Application/jucer_ProjucerAnalytics.h"\r
 \r
 //==============================================================================\r
+static var parseModuleDesc (const StringArray& lines)\r
+{\r
+    DynamicObject* o = new DynamicObject();\r
+    var result (o);\r
+\r
+    for (auto line : lines)\r
+    {\r
+        line = trimCommentCharsFromStartOfLine (line);\r
+\r
+        auto colon = line.indexOfChar (':');\r
+\r
+        if (colon >= 0)\r
+        {\r
+            auto key = line.substring (0, colon).trim();\r
+            auto value = line.substring (colon + 1).trim();\r
+\r
+            o->setProperty (key, value);\r
+        }\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+static var parseModuleDesc (const File& header)\r
+{\r
+    StringArray lines;\r
+    header.readLines (lines);\r
+\r
+    for (int i = 0; i < lines.size(); ++i)\r
+    {\r
+        if (trimCommentCharsFromStartOfLine (lines[i]).startsWith ("BEGIN_JUCE_MODULE_DECLARATION"))\r
+        {\r
+            StringArray desc;\r
+\r
+            for (int j = i + 1; j < lines.size(); ++j)\r
+            {\r
+                if (trimCommentCharsFromStartOfLine (lines[j]).startsWith ("END_JUCE_MODULE_DECLARATION"))\r
+                    return parseModuleDesc (desc);\r
+\r
+                desc.add (lines[j]);\r
+            }\r
+\r
+            break;\r
+        }\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
 ModuleDescription::ModuleDescription (const File& folder)\r
    : moduleFolder (folder),\r
-     moduleInfo (parseJUCEHeaderMetadata (getHeader()))\r
+     moduleInfo (parseModuleDesc (getHeader()))\r
 {\r
 }\r
 \r
@@ -63,149 +113,223 @@ StringArray ModuleDescription::getDependencies() const
 }\r
 \r
 //==============================================================================\r
-static bool tryToAddModuleFromFolder (const File& path, ModuleIDAndFolderList& list)\r
+ModuleList::ModuleList()\r
+{\r
+}\r
+\r
+ModuleList::ModuleList (const ModuleList& other)\r
+{\r
+    operator= (other);\r
+}\r
+\r
+ModuleList& ModuleList::operator= (const ModuleList& other)\r
+{\r
+    modules.clear();\r
+    modules.addCopiesOf (other.modules);\r
+    return *this;\r
+}\r
+\r
+const ModuleDescription* ModuleList::getModuleWithID (const String& moduleID) const\r
+{\r
+    for (auto* m : modules)\r
+        if (m->getID() == moduleID)\r
+            return m;\r
+\r
+    return nullptr;\r
+}\r
+\r
+void ModuleList::sort()\r
+{\r
+    std::sort (modules.begin(), modules.end(), [] (const ModuleDescription* m1, const ModuleDescription* m2)\r
+    {\r
+        return m1->getID().compareIgnoreCase (m2->getID()) < 0;\r
+    });\r
+}\r
+\r
+StringArray ModuleList::getIDs() const\r
+{\r
+    StringArray results;\r
+\r
+    for (auto* m : modules)\r
+        results.add (m->getID());\r
+\r
+    results.sort (true);\r
+    return results;\r
+}\r
+\r
+Result ModuleList::tryToAddModuleFromFolder (const File& path)\r
 {\r
     ModuleDescription m (path);\r
 \r
     if (m.isValid())\r
     {\r
-        list.push_back ({ m.getID(), path });\r
-        return true;\r
+        modules.add (new ModuleDescription (m));\r
+        return Result::ok();\r
+    }\r
+\r
+    return Result::fail (path.getFullPathName() + " is not a valid module");\r
+}\r
+\r
+Result ModuleList::addAllModulesInFolder (const File& path)\r
+{\r
+    if (! tryToAddModuleFromFolder (path))\r
+    {\r
+        int subfolders = 2;\r
+        return addAllModulesInSubfoldersRecursively (path, subfolders);\r
     }\r
 \r
-    return false;\r
+    return Result::ok();\r
 }\r
 \r
-static void addAllModulesInSubfoldersRecursively (const File& path, int depth, ModuleIDAndFolderList& list)\r
+Result ModuleList::addAllModulesInSubfoldersRecursively (const File& path, int depth)\r
 {\r
     if (depth > 0)\r
     {\r
         for (DirectoryIterator iter (path, false, "*", File::findDirectories); iter.next();)\r
         {\r
-            if (auto* job = ThreadPoolJob::getCurrentThreadPoolJob())\r
-                if (job->shouldExit())\r
-                    return;\r
+            auto childPath = iter.getFile().getLinkedTarget();\r
 \r
-            auto childPath = iter.getFile();\r
-\r
-            if (! tryToAddModuleFromFolder (childPath, list))\r
-                addAllModulesInSubfoldersRecursively (childPath, depth - 1, list);\r
+            if (! tryToAddModuleFromFolder (childPath))\r
+                addAllModulesInSubfoldersRecursively (childPath, depth - 1);\r
         }\r
     }\r
+\r
+    return Result::ok();\r
 }\r
 \r
-static void addAllModulesInFolder (const File& path, ModuleIDAndFolderList& list)\r
+static File getModuleFolderFromPathIfItExists (const String& path, const String& moduleID, const Project& project)\r
 {\r
-    if (! tryToAddModuleFromFolder (path, list))\r
+    if (path.isNotEmpty())\r
     {\r
-        int subfolders = 3;\r
-        addAllModulesInSubfoldersRecursively (path, subfolders, list);\r
+        auto moduleFolder = project.resolveFilename (path);\r
+\r
+        if (moduleFolder.exists())\r
+        {\r
+            if (ModuleDescription (moduleFolder).getID() == moduleID)\r
+                return moduleFolder;\r
+\r
+            auto f = moduleFolder.getChildFile (moduleID);\r
+\r
+            if (ModuleDescription (f).getID() == moduleID)\r
+                return f;\r
+        }\r
     }\r
-}\r
 \r
-static void sort (ModuleIDAndFolderList& listToSort)\r
-{\r
-    std::sort (listToSort.begin(), listToSort.end(), [] (const ModuleIDAndFolder& m1, const ModuleIDAndFolder& m2)\r
-                                                     {\r
-                                                         return m1.first.compareIgnoreCase (m2.first) < 0;\r
-                                                     });\r
+    return {};\r
 }\r
 \r
-//==============================================================================\r
-struct ModuleScannerJob    : public ThreadPoolJob\r
+static File getPathToSpecifiedModule (Project& project, StringRef moduleID)\r
 {\r
-    ModuleScannerJob (const Array<File>& paths, std::function<void (const ModuleIDAndFolderList&)>&& callback)\r
-        : ThreadPoolJob ("ModuleScannerJob"),\r
-          pathsToScan (paths),\r
-          completionCallback (std::move (callback))\r
+    auto& modules = project.getModules();\r
+\r
+    if (! modules.shouldUseGlobalPath (moduleID))\r
     {\r
+        for (Project::ExporterIterator exporter (project); exporter.next();)\r
+        {\r
+            if (! exporter->mayCompileOnCurrentOS())\r
+                continue;\r
+\r
+            auto path = getModuleFolderFromPathIfItExists (exporter->getPathForModuleString (moduleID), moduleID, project);\r
+\r
+            if (path != File())\r
+                return path;\r
+        }\r
     }\r
 \r
-    JobStatus runJob() override\r
-    {\r
-        ModuleIDAndFolderList list;\r
+    return {};\r
+}\r
 \r
-        for (auto& p : pathsToScan)\r
-            addAllModulesInFolder (p, list);\r
+static Array<File> getAllPossibleModulePathsFromExporters (Project& project)\r
+{\r
+    StringArray paths;\r
 \r
-        if (! shouldExit())\r
+    for (Project::ExporterIterator exporter (project); exporter.next();)\r
+    {\r
+        auto& modules = project.getModules();\r
+        auto n = modules.getNumModules();\r
+\r
+        for (int i = 0; i < n; ++i)\r
         {\r
-            sort (list);\r
-            completionCallback (list);\r
+            auto id = modules.getModuleID (i);\r
+\r
+            if (modules.shouldUseGlobalPath (id))\r
+                continue;\r
+\r
+            auto path = exporter->getPathForModuleString (id);\r
+\r
+            if (path.isNotEmpty())\r
+                paths.addIfNotAlreadyThere (path);\r
         }\r
 \r
-        return jobHasFinished;\r
+        auto oldPath = exporter->getLegacyModulePath();\r
+\r
+        if (oldPath.isNotEmpty())\r
+            paths.addIfNotAlreadyThere (oldPath);\r
     }\r
 \r
-    Array<File> pathsToScan;\r
-    std::function<void (const ModuleIDAndFolderList&)> completionCallback;\r
-};\r
+    Array<File> files;\r
 \r
-AvailableModuleList::AvailableModuleList()\r
-{\r
-}\r
+    for (auto& path : paths)\r
+    {\r
+        auto f = project.resolveFilename (path);\r
 \r
-ThreadPoolJob* AvailableModuleList::createScannerJob (const Array<File>& paths)\r
-{\r
-    return new ModuleScannerJob (paths, [this] (ModuleIDAndFolderList scannedModuleList)\r
-                                        {\r
-                                            {\r
-                                                const ScopedLock swapLock (lock);\r
-                                                moduleList.swap (scannedModuleList);\r
-                                            }\r
+        if (f.isDirectory())\r
+        {\r
+            files.addIfNotAlreadyThere (f);\r
 \r
-                                            listeners.call ([] (Listener& l) { MessageManager::callAsync ([&] { l.availableModulesChanged(); }); });\r
-                                        });\r
-}\r
+            if (f.getChildFile ("modules").isDirectory())\r
+                files.addIfNotAlreadyThere (f.getChildFile ("modules"));\r
+        }\r
+    }\r
 \r
-void AvailableModuleList::removePendingAndAddJob (ThreadPoolJob* jobToAdd)\r
-{\r
-    scanPool.removeAllJobs (false, 100);\r
-    scanPool.addJob (jobToAdd, true);\r
+    return files;\r
 }\r
 \r
-void AvailableModuleList::scanPaths (const Array<File>& paths)\r
+Result ModuleList::scanProjectExporterModulePaths (Project& project)\r
 {\r
-    auto* job = createScannerJob (paths);\r
+    modules.clear();\r
+    Result result (Result::ok());\r
 \r
-    removePendingAndAddJob (job);\r
-    scanPool.waitForJobToFinish (job, -1);\r
-}\r
+    for (auto& m : getAllPossibleModulePathsFromExporters (project))\r
+    {\r
+        result = addAllModulesInFolder (m);\r
 \r
-void AvailableModuleList::scanPathsAsync (const Array<File>& paths)\r
-{\r
-    removePendingAndAddJob (createScannerJob (paths));\r
+        if (result.failed())\r
+            break;\r
+    }\r
+\r
+    sort();\r
+    return result;\r
 }\r
 \r
-ModuleIDAndFolderList AvailableModuleList::getAllModules() const\r
+void ModuleList::scanGlobalJuceModulePath()\r
 {\r
-    const ScopedLock readLock (lock);\r
+    modules.clear();\r
 \r
-    return moduleList;\r
-}\r
+    auto& settings = getAppSettings();\r
 \r
-ModuleIDAndFolder AvailableModuleList::getModuleWithID (const String& id) const\r
-{\r
-    const ScopedLock readLock (lock);\r
+    auto path = settings.getStoredPath (Ids::defaultJuceModulePath).toString();\r
 \r
-    for (auto& mod : moduleList)\r
-        if (mod.first == id)\r
-            return mod;\r
+    if (path.isNotEmpty())\r
+        addAllModulesInFolder ({ path });\r
 \r
-    return {};\r
+    sort();\r
 }\r
 \r
-void AvailableModuleList::removeDuplicates (const ModuleIDAndFolderList& other)\r
+void ModuleList::scanGlobalUserModulePath()\r
 {\r
-    const ScopedLock readLock (lock);\r
+    modules.clear();\r
 \r
-    for (auto& m : other)\r
-    {\r
-        auto pos = std::find (moduleList.begin(), moduleList.end(), m);\r
+    auto paths = StringArray::fromTokens (getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString(), ";", {});\r
 \r
-        if (pos != moduleList.end())\r
-            moduleList.erase (pos);\r
+    for (auto p : paths)\r
+    {\r
+        auto f = File::createFileWithoutCheckingPath (p.trim());\r
+        if (f.exists())\r
+            addAllModulesInFolder (f);\r
     }\r
+\r
+    sort();\r
 }\r
 \r
 //==============================================================================\r
@@ -218,7 +342,7 @@ LibraryModule::LibraryModule (const ModuleDescription& d)
 void LibraryModule::writeIncludes (ProjectSaver& projectSaver, OutputStream& out)\r
 {\r
     auto& project = projectSaver.project;\r
-    auto& modules = project.getEnabledModules();\r
+    auto& modules = project.getModules();\r
 \r
     auto id = getID();\r
 \r
@@ -286,7 +410,7 @@ void LibraryModule::addSettingsForModuleToExporter (ProjectExporter& exporter, P
 \r
     {\r
         Array<File> compiled;\r
-        auto& modules = project.getEnabledModules();\r
+        auto& modules = project.getModules();\r
         auto id = getID();\r
 \r
         auto localModuleFolder = modules.shouldCopyModuleFilesLocally (id).getValue() ? project.getLocalModuleFolder (id)\r
@@ -553,7 +677,7 @@ EnabledModuleList::EnabledModuleList (Project& p, const ValueTree& s)
 \r
 ModuleDescription EnabledModuleList::getModuleInfo (const String& moduleID)\r
 {\r
-    return ModuleDescription (project.getModuleWithID (moduleID).second);\r
+    return ModuleDescription (getModuleFolder (moduleID));\r
 }\r
 \r
 bool EnabledModuleList::isModuleEnabled (const String& moduleID) const\r
@@ -585,6 +709,52 @@ Value EnabledModuleList::shouldShowAllModuleFilesInProject (const String& module
                 .getPropertyAsValue (Ids::showAllCode, getUndoManager());\r
 }\r
 \r
+File EnabledModuleList::findUserModuleFolder (const String& possiblePaths, const String& moduleID)\r
+{\r
+    auto paths = StringArray::fromTokens (possiblePaths, ";", {});\r
+\r
+    for (auto p : paths)\r
+    {\r
+        auto f = File::createFileWithoutCheckingPath (p.trim());\r
+        if (f.exists())\r
+        {\r
+            auto moduleFolder = getModuleFolderFromPathIfItExists (f.getFullPathName(), moduleID, project);\r
+            if (moduleFolder != File())\r
+                return moduleFolder;\r
+        }\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
+File EnabledModuleList::getModuleFolder (const String& moduleID)\r
+{\r
+    if (shouldUseGlobalPath (moduleID))\r
+    {\r
+        if (isJUCEModule (moduleID))\r
+            return getModuleFolderFromPathIfItExists (getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString(), moduleID, project);\r
+\r
+        return findUserModuleFolder (getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString(), moduleID);\r
+    }\r
+\r
+    {\r
+        auto path = getPathToSpecifiedModule (project, moduleID);\r
+\r
+        if (path != File())\r
+            return path;\r
+    }\r
+\r
+    auto paths = getAllPossibleModulePathsFromExporters (project);\r
+    for (auto p : paths)\r
+    {\r
+        auto f = getModuleFolderFromPathIfItExists (p.getFullPathName(), moduleID, project);\r
+        if (f != File())\r
+            return f;\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
 struct ModuleTreeSorter\r
 {\r
     static int compareElements (const ValueTree& m1, const ValueTree& m2)\r
@@ -616,7 +786,7 @@ void EnabledModuleList::addModule (const File& moduleFolder, bool copyLocally, b
         if (! isModuleEnabled (moduleID))\r
         {\r
             ValueTree module (Ids::MODULE);\r
-            module.setProperty (Ids::ID, moduleID, getUndoManager());\r
+            module.setProperty (Ids::ID, moduleID, nullptr);\r
 \r
             state.appendChild (module, getUndoManager());\r
             sortAlphabetically();\r
@@ -631,9 +801,6 @@ void EnabledModuleList::addModule (const File& moduleFolder, bool copyLocally, b
             for (Project::ExporterIterator exporter (project); exporter.next();)\r
                 exporter->getPathForModuleValue (moduleID) = path.toUnixStyle();\r
 \r
-            if (! useGlobalPath)\r
-                project.rescanExporterPathModules (false);\r
-\r
             if (sendAnalyticsEvent)\r
             {\r
                 StringPairArray data;\r
@@ -673,7 +840,7 @@ StringArray EnabledModuleList::getAllModules() const
 \r
 static void getDependencies (Project& project, const String& moduleID, StringArray& dependencies)\r
 {\r
-    auto info = project.getEnabledModules().getModuleInfo (moduleID);\r
+    auto info = project.getModules().getModuleInfo (moduleID);\r
 \r
     for (auto uid : info.getDependencies())\r
     {\r
@@ -742,19 +909,33 @@ bool EnabledModuleList::areMostModulesCopiedLocally() const
 void EnabledModuleList::setLocalCopyModeForAllModules (bool copyLocally)\r
 {\r
     for (auto i = getNumModules(); --i >= 0;)\r
-        shouldCopyModuleFilesLocally (project.getEnabledModules().getModuleID (i)) = copyLocally;\r
+        shouldCopyModuleFilesLocally (project.getModules().getModuleID (i)) = copyLocally;\r
+}\r
+\r
+File EnabledModuleList::findGlobalModulesFolder()\r
+{\r
+    auto& settings = getAppSettings();\r
+    auto path = settings.getStoredPath (Ids::defaultJuceModulePath).toString();\r
+\r
+    if (settings.isGlobalPathValid ({}, Ids::defaultJuceModulePath, path))\r
+        return { path };\r
+\r
+    return {};\r
 }\r
 \r
 File EnabledModuleList::findDefaultModulesFolder (Project& project)\r
 {\r
-    File globalPath (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString());\r
+    auto globalPath = findGlobalModulesFolder();\r
 \r
-    if (globalPath.exists())\r
+    if (globalPath != File())\r
         return globalPath;\r
 \r
-    for (auto& exporterPathModule : project.getExporterPathsModuleList().getAllModules())\r
+    ModuleList available;\r
+    available.scanProjectExporterModulePaths (project);\r
+\r
+    for (auto i = available.modules.size(); --i >= 0;)\r
     {\r
-        auto f = exporterPathModule.second;\r
+        auto f = available.modules.getUnchecked(i)->getFolder();\r
 \r
         if (f.isDirectory())\r
             return f.getParentDirectory();\r
@@ -778,15 +959,27 @@ void EnabledModuleList::addModuleFromUserSelectedFile()
 \r
 void EnabledModuleList::addModuleInteractive (const String& moduleID)\r
 {\r
-    auto f = project.getModuleWithID (moduleID).second;\r
+    ModuleList list;\r
 \r
-    if (f != File())\r
+    list.scanGlobalJuceModulePath();\r
+    if (auto* info = list.getModuleWithID (moduleID))\r
     {\r
-        addModule (f, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true);\r
+        addModule (info->moduleFolder, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true);\r
         return;\r
     }\r
 \r
-    addModuleFromUserSelectedFile();\r
+    list.scanGlobalUserModulePath();\r
+    if (auto* info = list.getModuleWithID (moduleID))\r
+    {\r
+        addModule (info->moduleFolder, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true);\r
+        return;\r
+    }\r
+\r
+    list.scanProjectExporterModulePaths (project);\r
+    if (auto* info = list.getModuleWithID (moduleID))\r
+        addModule (info->moduleFolder, areMostModulesCopiedLocally(), false, true);\r
+    else\r
+        addModuleFromUserSelectedFile();\r
 }\r
 \r
 void EnabledModuleList::addModuleOfferingToCopy (const File& f, bool isFromUserSpecifiedFolder)\r
index ba216b335ab07253284ec97463877fd9343acea6..54d80d2d542ff0734629750f828bf83834c60984 100644 (file)
@@ -64,6 +64,28 @@ struct ModuleDescription
     URL url;\r
 };\r
 \r
+//==============================================================================\r
+struct ModuleList\r
+{\r
+    ModuleList();\r
+    ModuleList (const ModuleList&);\r
+    ModuleList& operator= (const ModuleList&);\r
+\r
+    const ModuleDescription* getModuleWithID (const String& moduleID) const;\r
+    StringArray getIDs() const;\r
+    void sort();\r
+\r
+    Result tryToAddModuleFromFolder (const File&);\r
+\r
+    Result addAllModulesInFolder (const File&);\r
+    Result addAllModulesInSubfoldersRecursively (const File&, int depth);\r
+    Result scanProjectExporterModulePaths (Project&);\r
+    void scanGlobalJuceModulePath();\r
+    void scanGlobalUserModulePath();\r
+\r
+    OwnedArray<ModuleDescription> modules;\r
+};\r
+\r
 //==============================================================================\r
 class LibraryModule\r
 {\r
@@ -110,53 +132,13 @@ private:
     void addBrowseableCode (ProjectExporter&, const Array<File>& compiled, const File& localModuleFolder) const;\r
 };\r
 \r
-//==============================================================================\r
-using ModuleIDAndFolder     = std::pair<String, File>;\r
-using ModuleIDAndFolderList = std::vector<ModuleIDAndFolder>;\r
-\r
-class AvailableModuleList\r
-{\r
-public:\r
-    AvailableModuleList();\r
-\r
-    void scanPaths      (const Array<File>&);\r
-    void scanPathsAsync (const Array<File>&);\r
-\r
-    ModuleIDAndFolderList getAllModules() const;\r
-    ModuleIDAndFolder getModuleWithID (const String&) const;\r
-\r
-    void removeDuplicates (const ModuleIDAndFolderList& other);\r
-\r
-    //==============================================================================\r
-    struct Listener\r
-    {\r
-        virtual ~Listener() {}\r
-\r
-        virtual void availableModulesChanged() = 0;\r
-    };\r
-\r
-    void addListener (Listener* listenerToAdd)          { listeners.add (listenerToAdd); }\r
-    void removeListener (Listener* listenerToRemove)    { listeners.remove (listenerToRemove); }\r
-\r
-private:\r
-    ThreadPoolJob* createScannerJob (const Array<File>&);\r
-    void removePendingAndAddJob (ThreadPoolJob*);\r
-\r
-    ThreadPool scanPool { 1 };\r
-\r
-    ModuleIDAndFolderList moduleList;\r
-    ListenerList<Listener> listeners;\r
-    CriticalSection lock;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AvailableModuleList)\r
-};\r
-\r
 //==============================================================================\r
 class EnabledModuleList\r
 {\r
 public:\r
     EnabledModuleList (Project&, const ValueTree&);\r
 \r
+    static File findGlobalModulesFolder();\r
     static File findDefaultModulesFolder (Project&);\r
 \r
     bool isModuleEnabled (const String& moduleID) const;\r
@@ -171,6 +153,7 @@ public:
     bool isAudioPluginModuleMissing() const;\r
 \r
     ModuleDescription getModuleInfo (const String& moduleID);\r
+    File getModuleFolder (const String& moduleID);\r
 \r
     void addModule (const File& moduleManifestFile, bool copyLocally, bool useGlobalPath, bool sendAnalyticsEvent);\r
     void addModuleInteractive (const String& moduleID);\r
@@ -198,5 +181,7 @@ public:
 private:\r
     UndoManager* getUndoManager() const     { return project.getUndoManagerFor (state); }\r
 \r
+    File findUserModuleFolder (const String& possiblePaths, const String& moduleID);\r
+\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnabledModuleList)\r
 };\r
index 457058e052d58992781ea2ea08ee5d025422b7db..ded2c5f44ac5504ad5276a2a6f6a52a6842c2edc 100644 (file)
@@ -52,7 +52,6 @@ Project::Project (const File& f)
     setFile (f);\r
 \r
     removeDefunctExporters();\r
-    exporterPathsModuleList.reset (new AvailableModuleList());\r
     updateOldModulePaths();\r
     updateOldStyleConfigList();\r
     setCppVersionFromOldExporterSettings();\r
@@ -65,7 +64,7 @@ Project::Project (const File& f)
 \r
     parsedPreprocessorDefs = parsePreprocessorDefs (preprocessorDefsValue.get());\r
 \r
-    getEnabledModules().sortAlphabetically();\r
+    getModules().sortAlphabetically();\r
 \r
     projectRoot.addListener (this);\r
 \r
@@ -88,20 +87,20 @@ void Project::setTitle (const String& newTitle)
 {\r
     projectNameValue = newTitle;\r
 \r
-    updateTitleDependencies();\r
+    updateTitle();\r
 }\r
 \r
-void Project::updateTitleDependencies()\r
+void Project::updateTitle()\r
 {\r
     auto projectName = getProjectNameString();\r
 \r
     getMainGroup().getNameValue() = projectName;\r
 \r
-    pluginNameValue.          setDefault (projectName);\r
-    pluginDescriptionValue.   setDefault (projectName);\r
-    bundleIdentifierValue.    setDefault (getDefaultBundleIdentifierString());\r
+    pluginNameValue.setDefault (projectName);\r
+    pluginDescriptionValue.setDefault (projectName);\r
+    bundleIdentifierValue.setDefault (getDefaultBundleIdentifierString());\r
     pluginAUExportPrefixValue.setDefault (CodeHelpers::makeValidIdentifier (projectName, false, true, false) + "AU");\r
-    pluginAAXIdentifierValue. setDefault (getDefaultAAXIdentifierString());\r
+    pluginAAXIdentifierValue.setDefault (getDefaultAAXIdentifierString());\r
 }\r
 \r
 String Project::getDocumentTitle()\r
@@ -109,13 +108,6 @@ String Project::getDocumentTitle()
     return getProjectNameString();\r
 }\r
 \r
-void Project::updateCompanyNameDependencies()\r
-{\r
-    bundleIdentifierValue.setDefault    (getDefaultBundleIdentifierString());\r
-    pluginAAXIdentifierValue.setDefault (getDefaultAAXIdentifierString());\r
-    pluginManufacturerValue.setDefault  (getDefaultPluginManufacturerString());\r
-}\r
-\r
 void Project::updateProjectSettings()\r
 {\r
     projectRoot.setProperty (Ids::jucerVersion, ProjectInfo::versionString, nullptr);\r
@@ -186,7 +178,7 @@ void Project::initialiseMainGroup()
     if (! projectRoot.getChildWithName (Ids::MAINGROUP).isValid())\r
     {\r
         Item mainGroup (*this, ValueTree (Ids::MAINGROUP), false);\r
-        projectRoot.addChild (mainGroup.state, 0, nullptr);\r
+        projectRoot.addChild (mainGroup.state, 0, 0);\r
     }\r
 \r
     getMainGroup().initialiseMissingProperties();\r
@@ -200,15 +192,15 @@ void Project::initialiseProjectValues()
     if (projectUIDValue.isUsingDefault())\r
         projectUIDValue = projectUIDValue.getDefault();\r
 \r
+    projectTypeValue.referTo         (projectRoot, Ids::projectType,      getUndoManager(), ProjectType_GUIApp::getTypeName());\r
+    versionValue.referTo             (projectRoot, Ids::version,          getUndoManager(), "1.0.0");\r
+    bundleIdentifierValue.referTo    (projectRoot, Ids::bundleIdentifier, getUndoManager(), getDefaultBundleIdentifierString());\r
+\r
     companyNameValue.referTo         (projectRoot, Ids::companyName,      getUndoManager());\r
     companyCopyrightValue.referTo    (projectRoot, Ids::companyCopyright, getUndoManager());\r
     companyWebsiteValue.referTo      (projectRoot, Ids::companyWebsite,   getUndoManager());\r
     companyEmailValue.referTo        (projectRoot, Ids::companyEmail,     getUndoManager());\r
 \r
-    projectTypeValue.referTo         (projectRoot, Ids::projectType,      getUndoManager(), ProjectType_GUIApp::getTypeName());\r
-    versionValue.referTo             (projectRoot, Ids::version,          getUndoManager(), "1.0.0");\r
-    bundleIdentifierValue.referTo    (projectRoot, Ids::bundleIdentifier, getUndoManager(), getDefaultBundleIdentifierString());\r
-\r
     displaySplashScreenValue.referTo (projectRoot, Ids::displaySplashScreen, getUndoManager(), ! ProjucerApplication::getApp().isPaidOrGPL());\r
     splashScreenColourValue.referTo  (projectRoot, Ids::splashScreenColour,  getUndoManager(), "Dark");\r
     reportAppUsageValue.referTo      (projectRoot, Ids::reportAppUsage,      getUndoManager());\r
@@ -243,12 +235,12 @@ void Project::initialiseProjectValues()
 void Project::initialiseAudioPluginValues()\r
 {\r
     pluginFormatsValue.referTo               (projectRoot, Ids::pluginFormats,              getUndoManager(),\r
-                                              Array<var> (Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString()), ",");\r
+                                              Array<var> (Ids::buildVST.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString()), ",");\r
     pluginCharacteristicsValue.referTo       (projectRoot, Ids::pluginCharacteristicsValue, getUndoManager(), Array<var> (), ",");\r
 \r
     pluginNameValue.referTo                  (projectRoot, Ids::pluginName,                 getUndoManager(), getProjectNameString());\r
     pluginDescriptionValue.referTo           (projectRoot, Ids::pluginDesc,                 getUndoManager(), getProjectNameString());\r
-    pluginManufacturerValue.referTo          (projectRoot, Ids::pluginManufacturer,         getUndoManager(), getDefaultPluginManufacturerString());\r
+    pluginManufacturerValue.referTo          (projectRoot, Ids::pluginManufacturer,         getUndoManager(), "yourcompany");\r
     pluginManufacturerCodeValue.referTo      (projectRoot, Ids::pluginManufacturerCode,     getUndoManager(), "Manu");\r
     pluginCodeValue.referTo                  (projectRoot, Ids::pluginCode,                 getUndoManager(), makeValid4CC (getProjectUIDString() + getProjectUIDString()));\r
     pluginChannelConfigsValue.referTo        (projectRoot, Ids::pluginChannelConfigs,       getUndoManager());\r
@@ -257,7 +249,6 @@ void Project::initialiseAudioPluginValues()
                                               CodeHelpers::makeValidIdentifier (getProjectNameString(), false, true, false) + "AU");\r
 \r
     pluginAUMainTypeValue.referTo            (projectRoot, Ids::pluginAUMainType,           getUndoManager(), getDefaultAUMainTypes(),    ",");\r
-    pluginAUSandboxSafeValue.referTo         (projectRoot, Ids::pluginAUIsSandboxSafe,      getUndoManager(), false);\r
     pluginVSTCategoryValue.referTo           (projectRoot, Ids::pluginVSTCategory,          getUndoManager(), getDefaultVSTCategories(),  ",");\r
     pluginVST3CategoryValue.referTo          (projectRoot, Ids::pluginVST3Category,         getUndoManager(), getDefaultVST3Categories(), ",");\r
     pluginRTASCategoryValue.referTo          (projectRoot, Ids::pluginRTASCategory,         getUndoManager(), getDefaultRTASCategories(), ",");\r
@@ -366,18 +357,7 @@ void Project::coalescePluginFormatValues()
 \r
     if (formatsToBuild.size() > 0)\r
     {\r
-        if (pluginFormatsValue.isUsingDefault())\r
-        {\r
-            pluginFormatsValue = formatsToBuild;\r
-        }\r
-        else\r
-        {\r
-            auto formatVar = pluginFormatsValue.get();\r
-\r
-            if (auto* arr = formatVar.getArray())\r
-                arr->addArray (formatsToBuild);\r
-        }\r
-\r
+        pluginFormatsValue = formatsToBuild;\r
         shouldWriteLegacyPluginFormatSettings = true;\r
     }\r
 }\r
@@ -507,35 +487,45 @@ static int getBuiltJuceVersion()
          + JUCE_BUILDNUMBER;\r
 }\r
 \r
-static bool isModuleNewerThanProjucer (const ModuleDescription& module)\r
+static bool isAnyModuleNewerThanProjucer (const OwnedArray<ModuleDescription>& modules)\r
 {\r
-    if (module.getID().startsWith ("juce_")\r
-        && getJuceVersion (module.getVersion()) > getBuiltJuceVersion())\r
-        return true;\r
+    for (auto i = modules.size(); --i >= 0;)\r
+    {\r
+        auto* m = modules.getUnchecked(i);\r
+\r
+        if (m->getID().startsWith ("juce_")\r
+              && getJuceVersion (m->getVersion()) > getBuiltJuceVersion())\r
+            return true;\r
+    }\r
 \r
     return false;\r
 }\r
 \r
 void Project::warnAboutOldProjucerVersion()\r
 {\r
-    for (auto& juceModule : ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules())\r
-    {\r
-        if (isModuleNewerThanProjucer ({ juceModule.second }))\r
-        {\r
-            // Projucer is out of date!\r
-            if (ProjucerApplication::getApp().isRunningCommandLine)\r
-                std::cout <<  "WARNING! This version of the Projucer is out-of-date!" << std::endl;\r
-            else\r
-                AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
-                                                  "Projucer",\r
-                                                  "This version of the Projucer is out-of-date!"\r
-                                                  "\n\n"\r
-                                                  "Always make sure that you're running the very latest version, "\r
-                                                  "preferably compiled directly from the JUCE repository that you're working with!");\r
-\r
-            return;\r
-        }\r
-    }\r
+    ModuleList available;\r
+\r
+    available.scanGlobalJuceModulePath();\r
+\r
+    if (! isAnyModuleNewerThanProjucer (available.modules))\r
+        available.scanGlobalUserModulePath();\r
+\r
+    if (! isAnyModuleNewerThanProjucer (available.modules))\r
+        available.scanProjectExporterModulePaths (*this);\r
+\r
+    if (! isAnyModuleNewerThanProjucer (available.modules))\r
+        return;\r
+\r
+    // Projucer is out of date!\r
+    if (ProjucerApplication::getApp().isRunningCommandLine)\r
+        std::cout <<  "WARNING! This version of the Projucer is out-of-date!" << std::endl;\r
+    else\r
+        AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
+                                          "Projucer",\r
+                                          "This version of the Projucer is out-of-date!"\r
+                                          "\n\n"\r
+                                          "Always make sure that you're running the very latest version, "\r
+                                          "preferably compiled directly from the JUCE repository that you're working with!");\r
 }\r
 \r
 //==============================================================================\r
@@ -561,7 +551,7 @@ static void forgetRecentFile (const File& file)
 //==============================================================================\r
 Result Project::loadDocument (const File& file)\r
 {\r
-    auto xml = parseXML (file);\r
+    std::unique_ptr<XmlElement> xml (XmlDocument::parse (file));\r
 \r
     if (xml == nullptr || ! xml->hasTagName (Ids::JUCERPROJECT.toString()))\r
         return Result::fail ("Not a valid Jucer project!");\r
@@ -573,7 +563,7 @@ Result Project::loadDocument (const File& file)
 \r
     registerRecentFile (file);\r
 \r
-    enabledModuleList.reset();\r
+    enabledModulesList.reset();\r
     projectRoot = newTree;\r
 \r
     initialiseProjectValues();\r
@@ -595,9 +585,6 @@ Result Project::loadDocument (const File& file)
 \r
     compileEngineSettings.reset (new CompileEngineSettings (projectRoot));\r
 \r
-    exporterPathsModuleList.reset (new AvailableModuleList());\r
-    rescanExporterPathModules (! ProjucerApplication::getApp().isRunningCommandLine);\r
-\r
     return Result::ok();\r
 }\r
 \r
@@ -619,13 +606,8 @@ Result Project::saveProject (const File& file, bool isCommandLineApp)
 \r
     updateProjectSettings();\r
 \r
-    if (! isCommandLineApp)\r
-    {\r
-        ProjucerApplication::getApp().openDocumentManager.saveAll();\r
-\r
-        if (! isTemporaryProject())\r
-            registerRecentFile (file);\r
-    }\r
+    if (! isCommandLineApp && ! isTemporaryProject())\r
+        registerRecentFile (file);\r
 \r
     const ScopedValueSetter<bool> vs (isSaving, true, false);\r
 \r
@@ -718,11 +700,7 @@ void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& prope
         }\r
         else if (property == Ids::name)\r
         {\r
-            updateTitleDependencies();\r
-        }\r
-        else if (property == Ids::companyName)\r
-        {\r
-            updateCompanyNameDependencies();\r
+            updateTitle();\r
         }\r
         else if (property == Ids::defines)\r
         {\r
@@ -844,8 +822,6 @@ bool Project::shouldBuildTargetType (ProjectType::Target::Type targetType) const
             return shouldBuildAUv3();\r
         case ProjectType::Target::StandalonePlugIn:\r
             return shouldBuildStandalonePlugin();\r
-        case ProjectType::Target::UnityPlugIn:\r
-            return shouldBuildUnityPlugin();\r
         case ProjectType::Target::AggregateTarget:\r
         case ProjectType::Target::SharedCodeTarget:\r
             return projectType.isAudioPlugin();\r
@@ -867,7 +843,6 @@ ProjectType::Target::Type Project::getTargetTypeFromFilePath (const File& file,
     else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST2"))       return ProjectType::Target::VSTPlugIn;\r
     else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST3"))       return ProjectType::Target::VST3PlugIn;\r
     else if (LibraryModule::CompileUnit::hasSuffix (file, "_Standalone")) return ProjectType::Target::StandalonePlugIn;\r
-    else if (LibraryModule::CompileUnit::hasSuffix (file, "_Unity"))      return ProjectType::Target::UnityPlugIn;\r
 \r
     return (returnSharedTargetIfNoValidSuffix ? ProjectType::Target::SharedCodeTarget : ProjectType::Target::unspecified);\r
 }\r
@@ -887,7 +862,6 @@ const char* ProjectType::Target::getName() const noexcept
         case AudioUnitv3PlugIn: return "AUv3 AppExtension";\r
         case AAXPlugIn:         return "AAX";\r
         case RTASPlugIn:        return "RTAS";\r
-        case UnityPlugIn:       return "Unity Plugin";\r
         case SharedCodeTarget:  return "Shared Code";\r
         case AggregateTarget:   return "All";\r
         default:                return "undefined";\r
@@ -909,7 +883,6 @@ ProjectType::Target::TargetFileType ProjectType::Target::getTargetFileType() con
         case AudioUnitv3PlugIn: return macOSAppex;\r
         case AAXPlugIn:         return pluginBundle;\r
         case RTASPlugIn:        return pluginBundle;\r
-        case UnityPlugIn:       return pluginBundle;\r
         case SharedCodeTarget:  return staticLibrary;\r
         default:\r
             break;\r
@@ -925,8 +898,7 @@ void Project::createPropertyEditors (PropertyListBuilder& props)
                "The name of the project.");\r
 \r
     props.add (new TextPropertyComponent (versionValue, "Project Version", 16, false),\r
-               "The project's version number. This should be in the format major.minor.point[.point] where you should omit the final "\r
-               "(optional) [.point] if you are targeting AU and AUv3 plug-ins as they only support three number versions.");\r
+               "The project's version number, This should be in the format major.minor.point[.point]");\r
 \r
     props.add (new TextPropertyComponent (companyNameValue, "Company Name", 256, false),\r
                "Your company name, which will be added to the properties of the binary where possible");\r
@@ -1044,13 +1016,10 @@ void Project::createPropertyEditors (PropertyListBuilder& props)
 void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props)\r
 {\r
     props.add (new MultiChoicePropertyComponent (pluginFormatsValue, "Plugin Formats",\r
-                                                 { "VST3", "AU", "AUv3", "RTAS", "AAX", "Standalone", "Unity", "Enable IAA", "VST (Legacy)" },\r
-                                                 { Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(),\r
-                                                   Ids::buildRTAS.toString(), Ids::buildAAX.toString(), Ids::buildStandalone.toString(), Ids::buildUnity.toString(),\r
-                                                   Ids::enableIAA.toString(), Ids::buildVST.toString() }),\r
-               "Plugin formats to build. If you have selected \"VST (Legacy)\" then you will need to ensure that you have a VST2 SDK "\r
-               "in your header search paths. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK "\r
-               "or JUCE version 5.3.2. You also need a VST2 license from Steinberg to distribute VST2 plug-ins.");\r
+                                                 { "VST", "VST3", "AU", "AUv3", "RTAS", "AAX", "Standalone", "Enable IAA" },\r
+                                                 { Ids::buildVST.toString(), Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(),\r
+                                                   Ids::buildRTAS.toString(), Ids::buildAAX.toString(), Ids::buildStandalone.toString(), Ids::enableIAA.toString() }),\r
+               "Plugin formats to build.");\r
     props.add (new MultiChoicePropertyComponent (pluginCharacteristicsValue, "Plugin Characteristics",\r
                                                  { "Plugin is a Synth", "Plugin MIDI Input", "Plugin MIDI Output", "MIDI Effect Plugin", "Plugin Editor Requires Keyboard Focus",\r
                                                    "Disable RTAS Bypass", "Disable AAX Bypass", "Disable RTAS Multi-Mono", "Disable AAX Multi-Mono" },\r
@@ -1058,6 +1027,7 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props)
                                                    Ids::pluginIsMidiEffectPlugin.toString(), Ids::pluginEditorRequiresKeys.toString(), Ids::pluginRTASDisableBypass.toString(),\r
                                                    Ids::pluginAAXDisableBypass.toString(), Ids::pluginRTASDisableMultiMono.toString(), Ids::pluginAAXDisableMultiMono.toString() }),\r
               "Some characteristics of your plugin such as whether it is a synth, produces MIDI messages, accepts MIDI messages etc.");\r
+\r
     props.add (new TextPropertyComponent (pluginNameValue, "Plugin Name", 128, false),\r
                "The name of your plugin (keep it short!)");\r
     props.add (new TextPropertyComponent (pluginDescriptionValue, "Plugin Description", 256, false),\r
@@ -1077,36 +1047,32 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props)
                "The value to use for the JucePlugin_AAXIdentifier setting");\r
     props.add (new TextPropertyComponent (pluginAUExportPrefixValue, "Plugin AU Export Prefix", 128, false),\r
                "A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token.");\r
+\r
     props.add (new MultiChoicePropertyComponent (pluginAUMainTypeValue, "Plugin AU Main Type", getAllAUMainTypeStrings(), getAllAUMainTypeVars(), 1),\r
                "AU main type.");\r
-    props.add (new ChoicePropertyComponent (pluginAUSandboxSafeValue, "Plugin AU is sandbox safe"),\r
-               "Check this box if your plug-in is sandbox safe. A sand-box safe plug-in is loaded in a restricted path and can only access it's own bundle resources and "\r
-               "the Music folder. Your plug-in must be able to deal with this. Newer versions of GarageBand require this to be enabled.");\r
 \r
     {\r
-        Array<var> vst3CategoryVars;\r
+        Array<var> vstCategoryVars;\r
+        for (auto s : getAllVSTCategoryStrings())\r
+            vstCategoryVars.add (s);\r
 \r
+        props.add (new MultiChoicePropertyComponent (pluginVSTCategoryValue, "Plugin VST Category", getAllVSTCategoryStrings(), vstCategoryVars, 1),\r
+                   "VST category.");\r
+    }\r
+\r
+    {\r
+        Array<var> vst3CategoryVars;\r
         for (auto s : getAllVST3CategoryStrings())\r
             vst3CategoryVars.add (s);\r
 \r
         props.add (new MultiChoicePropertyComponent (pluginVST3CategoryValue, "Plugin VST3 Category", getAllVST3CategoryStrings(), vst3CategoryVars),\r
-                   "VST3 category. Most hosts require either \"Fx\" or \"Instrument\" to be selected in order for the plugin to be recognised. "\r
-                   "If neither of these are selected, the appropriate one will be automatically added based on the \"Plugin is a synth\" option.");\r
+                   "VST3 category.");\r
     }\r
 \r
     props.add (new MultiChoicePropertyComponent (pluginRTASCategoryValue, "Plugin RTAS Category", getAllRTASCategoryStrings(), getAllRTASCategoryVars()),\r
                "RTAS category.");\r
     props.add (new MultiChoicePropertyComponent (pluginAAXCategoryValue, "Plugin AAX Category", getAllAAXCategoryStrings(), getAllAAXCategoryVars()),\r
                "AAX category.");\r
-\r
-    {\r
-        Array<var> vstCategoryVars;\r
-        for (auto s : getAllVSTCategoryStrings())\r
-            vstCategoryVars.add (s);\r
-\r
-        props.add (new MultiChoicePropertyComponent (pluginVSTCategoryValue, "Plugin VST (Legacy) Category", getAllVSTCategoryStrings(), vstCategoryVars, 1),\r
-                   "VST category.");\r
-    }\r
 }\r
 \r
 //==============================================================================\r
@@ -1126,7 +1092,7 @@ int Project::getVersionAsHexInteger() const
                + (segments[1].getIntValue() << 8)\r
                +  segments[2].getIntValue();\r
 \r
-    if (segments.size() > 3)\r
+    if (segments.size() >= 4)\r
         value = (value << 8) + segments[3].getIntValue();\r
 \r
     return value;\r
@@ -1597,23 +1563,6 @@ bool Project::Item::isIconCrossedOut() const
                    || getFile().hasFileExtension (headerFileExtensions));\r
 }\r
 \r
-bool Project::Item::needsSaving() const noexcept\r
-{\r
-    auto& odm = ProjucerApplication::getApp().openDocumentManager;\r
-\r
-    if (odm.anyFilesNeedSaving())\r
-    {\r
-        for (int i = 0; i < odm.getNumOpenDocuments(); ++i)\r
-        {\r
-            auto* doc = odm.getOpenDocument (i);\r
-            if (doc->needsSaving() && doc->getFile() == getFile())\r
-                return true;\r
-        }\r
-    }\r
-\r
-    return false;\r
-}\r
-\r
 //==============================================================================\r
 ValueTree Project::getConfigNode()\r
 {\r
@@ -1638,24 +1587,6 @@ bool Project::isConfigFlagEnabled (const String& name, bool defaultIsEnabled) co
 }\r
 \r
 //==============================================================================\r
-static String getCompanyNameOrDefault (StringRef str)\r
-{\r
-    if (str.isEmpty())\r
-        return "yourcompany";\r
-\r
-    return str;\r
-}\r
-\r
-String Project::getDefaultBundleIdentifierString() const\r
-{\r
-    return "com." + getCompanyNameOrDefault (getCompanyNameString()) + "." + CodeHelpers::makeValidIdentifier (getProjectNameString(), false, true, false);\r
-}\r
-\r
-String Project::getDefaultPluginManufacturerString() const\r
-{\r
-    return getCompanyNameOrDefault (getCompanyNameString());\r
-}\r
-\r
 String Project::getAUMainTypeString() const noexcept\r
 {\r
     auto v = pluginAUMainTypeValue.get();\r
@@ -1667,11 +1598,6 @@ String Project::getAUMainTypeString() const noexcept
     return {};\r
 }\r
 \r
-bool Project::isAUSandBoxSafe() const noexcept\r
-{\r
-    return pluginAUSandboxSafeValue.get();\r
-}\r
-\r
 String Project::getVSTCategoryString() const noexcept\r
 {\r
     auto v = pluginVSTCategoryValue.get();\r
@@ -1683,28 +1609,19 @@ String Project::getVSTCategoryString() const noexcept
     return {};\r
 }\r
 \r
-static String getVST3CategoryStringFromSelection (Array<var> selected, const Project& p) noexcept\r
+static String getVST3CategoryStringFromSelection (Array<var> selected) noexcept\r
 {\r
     StringArray categories;\r
 \r
     for (auto& category : selected)\r
         categories.add (category);\r
 \r
-    // One of these needs to be selected in order for the plug-in to be recognised in Cubase\r
-    if (! categories.contains ("Fx") && ! categories.contains ("Instrument"))\r
-    {\r
-        categories.insert (0, p.isPluginSynth() ? "Instrument"\r
-                                                : "Fx");\r
-    }\r
-    else\r
-    {\r
-        // "Fx" and "Instrument" should come first and if both are present prioritise "Fx"\r
-        if (categories.contains ("Instrument"))\r
-            categories.move (categories.indexOf ("Instrument"), 0);\r
+    // "Fx" and "Instrument" should come first and if both are present prioritise "Fx"\r
+    if (categories.contains ("Instrument"))\r
+        categories.move (categories.indexOf ("Instrument"), 0);\r
 \r
-        if (categories.contains ("Fx"))\r
-            categories.move (categories.indexOf ("Fx"), 0);\r
-    }\r
+    if (categories.contains ("Fx"))\r
+        categories.move (categories.indexOf ("Fx"), 0);\r
 \r
     return categories.joinIntoString ("|");\r
 }\r
@@ -1714,7 +1631,7 @@ String Project::getVST3CategoryString() const noexcept
     auto v = pluginVST3CategoryValue.get();\r
 \r
     if (auto* arr = v.getArray())\r
-        return getVST3CategoryStringFromSelection (*arr, *this);\r
+        return getVST3CategoryStringFromSelection (*arr);\r
 \r
     jassertfalse;\r
     return {};\r
@@ -1781,17 +1698,17 @@ String Project::getIAAPluginName()
 //==============================================================================\r
 bool Project::isAUPluginHost()\r
 {\r
-    return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_AU");\r
+    return getModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_AU");\r
 }\r
 \r
 bool Project::isVSTPluginHost()\r
 {\r
-    return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST");\r
+    return getModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST");\r
 }\r
 \r
 bool Project::isVST3PluginHost()\r
 {\r
-    return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
+    return getModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
 }\r
 \r
 //==============================================================================\r
@@ -1912,104 +1829,12 @@ Array<var> Project::getDefaultRTASCategories() const noexcept
 }\r
 \r
 //==============================================================================\r
-EnabledModuleList& Project::getEnabledModules()\r
-{\r
-    if (enabledModuleList == nullptr)\r
-        enabledModuleList.reset (new EnabledModuleList (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr)));\r
-\r
-    return *enabledModuleList;\r
-}\r
-\r
-static StringArray getModulePathsFromExporters (Project& project, bool onlyThisOS)\r
-{\r
-    StringArray paths;\r
-\r
-    for (Project::ExporterIterator exporter (project); exporter.next();)\r
-    {\r
-        if (onlyThisOS && ! exporter->mayCompileOnCurrentOS())\r
-            continue;\r
-\r
-        auto& modules = project.getEnabledModules();\r
-        auto n = modules.getNumModules();\r
-\r
-        for (int i = 0; i < n; ++i)\r
-        {\r
-            auto id = modules.getModuleID (i);\r
-\r
-            if (modules.shouldUseGlobalPath (id))\r
-                continue;\r
-\r
-            auto path = exporter->getPathForModuleString (id);\r
-\r
-            if (path.isNotEmpty())\r
-                paths.addIfNotAlreadyThere (path);\r
-        }\r
-\r
-        auto oldPath = exporter->getLegacyModulePath();\r
-\r
-        if (oldPath.isNotEmpty())\r
-            paths.addIfNotAlreadyThere (oldPath);\r
-    }\r
-\r
-    return paths;\r
-}\r
-\r
-static Array<File> getExporterModulePathsToScan (Project& project)\r
+EnabledModuleList& Project::getModules()\r
 {\r
-    auto exporterPaths = getModulePathsFromExporters (project, true);\r
-\r
-    if (exporterPaths.isEmpty())\r
-        exporterPaths = getModulePathsFromExporters (project, false);\r
-\r
-    Array<File> files;\r
-\r
-    for (auto& path : exporterPaths)\r
-    {\r
-        auto f = project.resolveFilename (path);\r
-\r
-        if (f.isDirectory())\r
-        {\r
-            files.addIfNotAlreadyThere (f);\r
-\r
-            if (f.getChildFile ("modules").isDirectory())\r
-                files.addIfNotAlreadyThere (f.getChildFile ("modules"));\r
-        }\r
-    }\r
-\r
-    return files;\r
-}\r
-\r
-AvailableModuleList& Project::getExporterPathsModuleList()\r
-{\r
-    return *exporterPathsModuleList;\r
-}\r
-\r
-void Project::rescanExporterPathModules (bool async)\r
-{\r
-    if (async)\r
-        exporterPathsModuleList->scanPathsAsync (getExporterModulePathsToScan (*this));\r
-    else\r
-        exporterPathsModuleList->scanPaths (getExporterModulePathsToScan (*this));\r
-}\r
-\r
-ModuleIDAndFolder Project::getModuleWithID (const String& id)\r
-{\r
-    if (! getEnabledModules().shouldUseGlobalPath (id))\r
-    {\r
-        const auto& mod = exporterPathsModuleList->getModuleWithID (id);\r
-\r
-        if (mod.second != File())\r
-            return mod;\r
-    }\r
-\r
-    const auto& list = (isJUCEModule (id) ? ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules()\r
-                                          : ProjucerApplication::getApp().getUserPathsModuleList().getAllModules());\r
-\r
-    for (auto& m : list)\r
-        if (m.first == id)\r
-            return m;\r
+    if (enabledModulesList == nullptr)\r
+        enabledModulesList.reset (new EnabledModuleList (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr)));\r
 \r
-    return exporterPathsModuleList->getModuleWithID (id);\r
+    return *enabledModulesList;\r
 }\r
 \r
 //==============================================================================\r
index b9414d449fb08ee0c7e745bfdd28c775f35c2846..361f028d8961d6defb49560665a8562c4ce69e71 100644 (file)
@@ -31,7 +31,6 @@
 class ProjectExporter;\r
 class LibraryModule;\r
 class EnabledModuleList;\r
-class AvailableModuleList;\r
 class ProjectContentComponent;\r
 class CompileEngineSettings;\r
 \r
@@ -104,9 +103,8 @@ public:
     void setProjectVersion (const String& newVersion)    { versionValue = newVersion; }\r
 \r
     String getBundleIdentifierString() const             { return bundleIdentifierValue.get(); }\r
-    String getDefaultBundleIdentifierString() const;\r
-    String getDefaultAAXIdentifierString() const         { return getDefaultBundleIdentifierString(); }\r
-    String getDefaultPluginManufacturerString() const;\r
+    String getDefaultBundleIdentifierString()            { return "com.yourcompany." + CodeHelpers::makeValidIdentifier (getProjectNameString(), false, true, false); }\r
+    String getDefaultAAXIdentifierString()               { return getDefaultBundleIdentifierString(); }\r
 \r
     String getCompanyNameString() const                  { return companyNameValue.get(); }\r
     String getCompanyCopyrightString() const             { return companyCopyrightValue.get(); }\r
@@ -160,7 +158,6 @@ public:
     bool shouldBuildRTAS() const                      { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildRTAS); }\r
     bool shouldBuildAAX() const                       { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildAAX); }\r
     bool shouldBuildStandalonePlugin() const          { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildStandalone); }\r
-    bool shouldBuildUnityPlugin() const               { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildUnity); }\r
     bool shouldEnableIAA() const                      { return checkMultiChoiceVar (pluginFormatsValue, Ids::enableIAA); }\r
 \r
     //==============================================================================\r
@@ -194,7 +191,6 @@ public:
     Array<var> getDefaultRTASCategories() const noexcept;\r
 \r
     String getAUMainTypeString() const noexcept;\r
-    bool isAUSandBoxSafe() const noexcept;\r
     String getVSTCategoryString() const noexcept;\r
     String getVST3CategoryString() const noexcept;\r
     int getAAXCategory() const noexcept;\r
@@ -203,15 +199,6 @@ public:
     String getIAATypeCode();\r
     String getIAAPluginName();\r
 \r
-    String getUnityScriptName() const    { return addUnityPluginPrefixIfNecessary (getProjectNameString()) + "_UnityScript.cs"; }\r
-    static String addUnityPluginPrefixIfNecessary (const String& name)\r
-    {\r
-        if (! name.startsWithIgnoreCase ("audioplugin"))\r
-            return "audioplugin_" + name;\r
-\r
-        return name;\r
-    }\r
-\r
     //==============================================================================\r
     bool isAUPluginHost();\r
     bool isVSTPluginHost();\r
@@ -303,8 +290,6 @@ public:
         Icon getIcon (bool isOpen = false) const;\r
         bool isIconCrossedOut() const;\r
 \r
-        bool needsSaving() const noexcept;\r
-\r
         Project& project;\r
         ValueTree state;\r
 \r
@@ -353,12 +338,7 @@ public:
     bool isConfigFlagEnabled (const String& name, bool defaultIsEnabled = false) const;\r
 \r
     //==============================================================================\r
-    EnabledModuleList& getEnabledModules();\r
-\r
-    AvailableModuleList& getExporterPathsModuleList();\r
-    void rescanExporterPathModules (bool async = false);\r
-\r
-    std::pair<String, File> getModuleWithID (const String&);\r
+    EnabledModuleList& getModules();\r
 \r
     //==============================================================================\r
     String getFileTemplate (const String& templateName);\r
@@ -415,12 +395,10 @@ private:
 \r
     ValueWithDefault pluginFormatsValue, pluginNameValue, pluginDescriptionValue, pluginManufacturerValue, pluginManufacturerCodeValue,\r
                      pluginCodeValue, pluginChannelConfigsValue, pluginCharacteristicsValue, pluginAUExportPrefixValue, pluginAAXIdentifierValue,\r
-                     pluginAUMainTypeValue, pluginAUSandboxSafeValue, pluginRTASCategoryValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue;\r
+                     pluginAUMainTypeValue, pluginRTASCategoryValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue;\r
 \r
     //==============================================================================\r
     std::unique_ptr<CompileEngineSettings> compileEngineSettings;\r
-    std::unique_ptr<EnabledModuleList> enabledModuleList;\r
-    std::unique_ptr<AvailableModuleList> exporterPathsModuleList;\r
 \r
     //==============================================================================\r
     bool shouldWriteLegacyPluginFormatSettings = false;\r
@@ -449,6 +427,7 @@ private:
 \r
     //==============================================================================\r
     friend class Item;\r
+    std::unique_ptr<EnabledModuleList> enabledModulesList;\r
     bool isSaving = false;\r
     Time modificationTime;\r
     StringPairArray parsedPreprocessorDefs;\r
@@ -463,8 +442,7 @@ private:
     void createAudioPluginPropertyEditors (PropertyListBuilder& props);\r
 \r
     //==============================================================================\r
-    void updateTitleDependencies();\r
-    void updateCompanyNameDependencies();\r
+    void updateTitle();\r
     void updateProjectSettings();\r
     ValueTree getConfigurations() const;\r
     ValueTree getConfigNode();\r
index 14c318a2622e5c1a3bc02cf3589d70433bd8fa98..fadf4ead673515cdb0edf99265fe10f9e96702f3 100644 (file)
@@ -67,7 +67,6 @@ public:
             AudioUnitPlugIn   = 14,\r
             AudioUnitv3PlugIn = 15,\r
             StandalonePlugIn  = 16,\r
-            UnityPlugIn       = 17,\r
 \r
             SharedCodeTarget  = 20, // internal\r
             AggregateTarget   = 21,\r
@@ -187,7 +186,6 @@ struct ProjectType_AudioPlugin  : public ProjectType
             case Target::AudioUnitPlugIn:\r
             case Target::AudioUnitv3PlugIn:\r
             case Target::StandalonePlugIn:\r
-            case Target::UnityPlugIn:\r
             case Target::SharedCodeTarget:\r
             case Target::AggregateTarget:\r
                 return true;\r
index b81bd63b8d468fd9ed2851ac317dae48678b1434..4e75af75d4c3af2092b68c26bfe14706b3c50d02 100644 (file)
@@ -92,6 +92,13 @@ public:
         return nullptr;\r
     }\r
 \r
+    //==============================================================================\r
+    void initialiseDependencyPathValues() override\r
+    {\r
+        sdkPath.referTo  (Value (new DependencyPathValueSource (getSetting (Ids::androidSDKPath), Ids::androidSDKPath, TargetOS::getThisOS())));\r
+        ndkPath.referTo  (Value (new DependencyPathValueSource (getSetting (Ids::androidNDKPath), Ids::androidNDKPath, TargetOS::getThisOS())));\r
+    }\r
+\r
     //==============================================================================\r
     ValueWithDefault androidJavaLibs, androidRepositories, androidDependencies, androidScreenOrientation, androidActivityClass,\r
                      androidActivitySubClassName, androidActivityBaseClassName, androidManifestCustomXmlElements, androidVersionCode,\r
@@ -137,9 +144,9 @@ public:
           androidKeyAliasPass                  (settings, Ids::androidKeyAliasPass,                  getUndoManager(), "android"),\r
           gradleVersion                        (settings, Ids::gradleVersion,                        getUndoManager(), "4.4"),\r
           gradleToolchain                      (settings, Ids::gradleToolchain,                      getUndoManager(), "clang"),\r
-          androidPluginVersion                 (settings, Ids::androidPluginVersion,                 getUndoManager(), "3.1.3"),\r
-          buildToolsVersion                    (settings, Ids::buildToolsVersion,                    getUndoManager(), "28.0.0"),\r
-          AndroidExecutable                    (getAppSettings().getStoredPath (Ids::androidStudioExePath, TargetOS::getThisOS()).get().toString())\r
+          androidPluginVersion                 (settings, Ids::androidPluginVersion,                 getUndoManager(), "3.1.1"),\r
+          buildToolsVersion                    (settings, Ids::buildToolsVersion,                    getUndoManager(), "27.0.3"),\r
+          AndroidExecutable (findAndroidExecutable())\r
     {\r
         name = getName();\r
 \r
@@ -149,10 +156,10 @@ public:
     //==============================================================================\r
     void createToolchainExporterProperties (PropertyListBuilder& props)\r
     {\r
-        props.add (new TextPropertyComponent (gradleVersion, "Gradle Version", 32, false),\r
+        props.add (new TextPropertyComponent (gradleVersion, "gradle version", 32, false),\r
                    "The version of gradle that is used to build this app (4.4 is fine for JUCE)");\r
 \r
-        props.add (new TextPropertyComponent (androidPluginVersion, "Android Plug-in Version", 32, false),\r
+        props.add (new TextPropertyComponent (androidPluginVersion, "android plug-in version", 32, false),\r
                    "The version of the android build plugin for gradle that is used to build this app");\r
 \r
         props.add (new ChoicePropertyComponent (gradleToolchain, "NDK Toolchain",\r
@@ -160,16 +167,16 @@ public:
                                                 { "clang", "gcc" }),\r
                    "The toolchain that gradle should invoke for NDK compilation (variable model.android.ndk.tooclhain in app/build.gradle)");\r
 \r
-        props.add (new TextPropertyComponent (buildToolsVersion, "Android Build Tools Version", 32, false),\r
+        props.add (new TextPropertyComponent (buildToolsVersion, "Android build tools version", 32, false),\r
                    "The Android build tools version that should use to build this app");\r
     }\r
 \r
     void createLibraryModuleExporterProperties (PropertyListBuilder& props)\r
     {\r
-        props.add (new TextPropertyComponent (androidStaticLibraries, "Import Static Library Modules", 8192, true),\r
+        props.add (new TextPropertyComponent (androidStaticLibraries, "Import static library modules", 8192, true),\r
                    "Comma or whitespace delimited list of static libraries (.a) defined in NDK_MODULE_PATH.");\r
 \r
-        props.add (new TextPropertyComponent (androidSharedLibraries, "Import Shared Library Modules", 8192, true),\r
+        props.add (new TextPropertyComponent (androidSharedLibraries, "Import shared library modules", 8192, true),\r
                    "Comma or whitespace delimited list of shared libraries (.so) defined in NDK_MODULE_PATH.");\r
     }\r
 \r
@@ -269,6 +276,38 @@ public:
         overwriteFileIfDifferentOrThrow (gradleProjectFolder.getChildFile (filePath), outStream);\r
     }\r
 \r
+    //==============================================================================\r
+    static File findAndroidExecutable()\r
+    {\r
+       #if JUCE_WINDOWS\r
+        File defaultInstallation ("C:\\Program Files\\Android\\Android Studio\\bin");\r
+\r
+        if (defaultInstallation.exists())\r
+        {\r
+            {\r
+                auto studio64 = defaultInstallation.getChildFile ("studio64.exe");\r
+\r
+                if (studio64.existsAsFile())\r
+                    return studio64;\r
+            }\r
+\r
+            {\r
+                auto studio = defaultInstallation.getChildFile ("studio.exe");\r
+\r
+                if (studio.existsAsFile())\r
+                    return studio;\r
+            }\r
+        }\r
+      #elif JUCE_MAC\r
+       File defaultInstallation ("/Applications/Android Studio.app");\r
+\r
+       if (defaultInstallation.exists())\r
+           return defaultInstallation;\r
+      #endif\r
+\r
+        return {};\r
+    }\r
+\r
 protected:\r
     //==============================================================================\r
     class AndroidBuildConfiguration  : public BuildConfiguration\r
@@ -276,7 +315,7 @@ protected:
     public:\r
         AndroidBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e)\r
             : BuildConfiguration (p, settings, e),\r
-              androidArchitectures               (config, Ids::androidArchitectures,               getUndoManager(), isDebug() ? "armeabi-v7a x86" : ""),\r
+              androidArchitectures               (config, Ids::androidArchitectures,               getUndoManager(), isDebug() ? "armeabi x86" : ""),\r
               androidBuildConfigRemoteNotifsConfigFile (config, Ids::androidBuildConfigRemoteNotifsConfigFile, getUndoManager()),\r
               androidAdditionalXmlValueResources (config, Ids::androidAdditionalXmlValueResources, getUndoManager()),\r
               androidAdditionalDrawableResources (config, Ids::androidAdditionalDrawableResources, getUndoManager()),\r
@@ -299,7 +338,7 @@ protected:
             addGCCOptimisationProperty (props);\r
 \r
             props.add (new TextPropertyComponent (androidArchitectures, "Architectures", 256, false),\r
-                       "A list of the ARM architectures to build (for a fat binary). Leave empty to build for all possible android architectures.");\r
+                       "A list of the ARM architectures to build (for a fat binary). Leave empty to build for all possible android archiftectures.");\r
 \r
             props.add (new TextPropertyComponent (androidBuildConfigRemoteNotifsConfigFile.getPropertyAsValue(), "Remote Notifications Config File", 2048, false),\r
                        "Path to google-services.json file. This will be the file provided by Firebase when creating a new app in Firebase console. "\r
@@ -320,7 +359,7 @@ protected:
                        "Paths to additional \"raw resource\" files that should be included in the app (one per line). "\r
                        "Resource file names must contain only lowercase a-z, 0-9 or underscore.");\r
 \r
-            props.add (new TextPropertyComponent (androidCustomStringXmlElements, "Custom String Resources", 8192, true),\r
+            props.add (new TextPropertyComponent (androidCustomStringXmlElements, "Custom string resources", 8192, true),\r
                        "Custom XML resources that will be added to string.xml as children of <resources> element. "\r
                        "Example: \n<string name=\"value\">text</string>\n"\r
                        "<string name2=\"value2\">text2</string>\n");\r
@@ -348,7 +387,7 @@ protected:
 \r
     BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override\r
     {\r
-        return *new AndroidBuildConfiguration (project, v, *this);\r
+        return new AndroidBuildConfiguration (project, v, *this);\r
     }\r
 \r
 private:\r
@@ -428,21 +467,8 @@ private:
                 mo << (first ? "IF" : "ELSEIF") << "(JUCE_BUILD_CONFIGURATION MATCHES \"" << cfg.getProductFlavourCMakeIdentifier() <<"\")" << newLine;\r
 \r
                 if (isLibrary())\r
-                {\r
                     mo << "    SET(BINARY_NAME \"" << getNativeModuleBinaryName (cfg) << "\")" << newLine;\r
 \r
-                    auto binaryLocation = cfg.getTargetBinaryRelativePathString();\r
-\r
-                    if (binaryLocation.isNotEmpty())\r
-                    {\r
-                        auto locationRelativeToCmake = RelativePath (binaryLocation, RelativePath::projectFolder)\r
-                                                        .rebased (getProject().getFile().getParentDirectory(),\r
-                                                                  file.getParentDirectory(), RelativePath::buildTargetFolder);\r
-\r
-                        mo << "    SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY \"" << "../../../../" << locationRelativeToCmake.toUnixStyle() << "\")" << newLine;\r
-                    }\r
-                }\r
-\r
                 writeCmakePathLines (mo, "    ", "link_directories(", libSearchPaths);\r
 \r
                 if (cfgDefines.size() > 0)\r
@@ -816,8 +842,8 @@ private:
     {\r
         String props;\r
 \r
-        props << "ndk.dir=" << sanitisePath (getAppSettings().getStoredPath (Ids::androidNDKPath, TargetOS::getThisOS()).get().toString()) << newLine\r
-              << "sdk.dir=" << sanitisePath (getAppSettings().getStoredPath (Ids::androidSDKPath, TargetOS::getThisOS()).get().toString()) << newLine;\r
+        props << "ndk.dir=" << sanitisePath (ndkPath.toString()) << newLine\r
+              << "sdk.dir=" << sanitisePath (sdkPath.toString()) << newLine;\r
 \r
         return props;\r
     }\r
@@ -835,32 +861,32 @@ private:
     //==============================================================================\r
     void createBaseExporterProperties (PropertyListBuilder& props)\r
     {\r
-        props.add (new TextPropertyComponent (androidJavaLibs, "Java Libraries to Include", 32768, true),\r
+        props.add (new TextPropertyComponent (androidJavaLibs, "Java libraries to include", 32768, true),\r
                    "Java libs (JAR files) (one per line). These will be copied to app/libs folder and \"implementation files\" "\r
                    "dependency will be automatically added to module \"dependencies\" section for each library, so do "\r
                    "not add the dependency yourself.");\r
 \r
-        props.add (new TextPropertyComponent (androidRepositories, "Module Repositories", 32768, true),\r
+        props.add (new TextPropertyComponent (androidRepositories, "Module repositories", 32768, true),\r
                    "Module repositories (one per line). These will be added to module-level gradle file repositories section. ");\r
 \r
-        props.add (new TextPropertyComponent (androidDependencies, "Module Dependencies", 32768, true),\r
+        props.add (new TextPropertyComponent (androidDependencies, "Module dependencies", 32768, true),\r
                    "Module dependencies (one per line). These will be added to module-level gradle file \"dependencies\" section. "\r
                    "If adding any java libs in \"Java libraries to include\" setting, do not add them here as "\r
                    "they will be added automatically.");\r
 \r
-        props.add (new ChoicePropertyComponent (androidScreenOrientation, "Screen Orientation",\r
+        props.add (new ChoicePropertyComponent (androidScreenOrientation, "Screen orientation",\r
                                                 { "Portrait and Landscape", "Portrait", "Landscape" },\r
                                                 { "unspecified",            "portrait", "landscape" }),\r
                    "The screen orientations that this app should support");\r
 \r
-        props.add (new TextPropertyComponent (androidActivityClass, "Android Activity Class Name", 256, false),\r
+        props.add (new TextPropertyComponent (androidActivityClass, "Android Activity class name", 256, false),\r
                    "The full java class name to use for the app's Activity class.");\r
 \r
-        props.add (new TextPropertyComponent (androidActivitySubClassName, "Android Activity Sub-Class Name", 256, false),\r
+        props.add (new TextPropertyComponent (androidActivitySubClassName, "Android Activity sub-class name", 256, false),\r
                    "If not empty, specifies the Android Activity class name stored in the app's manifest. "\r
                    "Use this if you would like to use your own Android Activity sub-class.");\r
 \r
-        props.add (new TextPropertyComponent (androidActivityBaseClassName, "Android Activity Base Class", 256, false),\r
+        props.add (new TextPropertyComponent (androidActivityBaseClassName, "Android Activity base class", 256, false),\r
                    "If not empty, specifies the base class to use for your activity. If custom base class is "\r
                    "specified, that base class should be a sub-class of android.app.Activity. When empty, Activity "\r
                    "(android.app.Activity) will be used as the base class. "\r
@@ -869,7 +895,13 @@ private:
         props.add (new TextPropertyComponent (androidVersionCode, "Android Version Code", 32, false),\r
                    "An integer value that represents the version of the application code, relative to other versions.");\r
 \r
-        props.add (new TextPropertyComponent (androidMinimumSDK, "Minimum SDK Version", 32, false),\r
+        props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), sdkPath, "Android SDK Path"),\r
+                   "The path to the Android SDK folder on the target build machine");\r
+\r
+        props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), ndkPath, "Android NDK Path"),\r
+                   "The path to the Android NDK folder on the target build machine");\r
+\r
+        props.add (new TextPropertyComponent (androidMinimumSDK, "Minimum SDK version", 32, false),\r
                    "The number of the minimum version of the Android SDK that the app requires");\r
 \r
         props.add (new TextPropertyComponent (androidExtraAssetsFolder, "Extra Android Assets", 256, false),\r
@@ -879,9 +911,9 @@ private:
     //==============================================================================\r
     void createManifestExporterProperties (PropertyListBuilder& props)\r
     {\r
-        props.add (new TextPropertyComponent (androidOboeRepositoryPath, "Oboe Repository Path", 2048, false),\r
+        props.add (new TextPropertyComponent (androidOboeRepositoryPath, "Oboe repository path", 2048, false),\r
                    "Path to the root of Oboe repository. Make sure to point Oboe repository to "\r
-                   "commit with SHA c5c3cc17f78974bf005bf33a2de1a093ac55cc07 before building.");\r
+                   "commit with SHA 44c6b6ea9c8fa9b5b74cbd60f355068b57b50b37 before building.");\r
 \r
         props.add (new ChoicePropertyComponent (androidInternetNeeded, "Internet Access"),\r
                    "If enabled, this will set the android.permission.INTERNET flag in the manifest.");\r
@@ -892,13 +924,13 @@ private:
         props.add (new ChoicePropertyComponent (androidCameraNeeded, "Camera Required"),\r
                    "If enabled, this will set the android.permission.CAMERA flag in the manifest.");\r
 \r
-        props.add (new ChoicePropertyComponent (androidBluetoothNeeded, "Bluetooth Permissions Required"),\r
+        props.add (new ChoicePropertyComponent (androidBluetoothNeeded, "Bluetooth permissions Required"),\r
                    "If enabled, this will set the android.permission.BLUETOOTH and  android.permission.BLUETOOTH_ADMIN flag in the manifest. This is required for Bluetooth MIDI on Android.");\r
 \r
-        props.add (new ChoicePropertyComponent (androidExternalReadPermission, "Read From External Storage"),\r
+        props.add (new ChoicePropertyComponent (androidExternalReadPermission, "Read from external storage"),\r
                    "If enabled, this will set the android.permission.READ_EXTERNAL_STORAGE flag in the manifest.");\r
 \r
-        props.add (new ChoicePropertyComponent (androidExternalWritePermission, "Write to External Storage"),\r
+        props.add (new ChoicePropertyComponent (androidExternalWritePermission, "Write to external storage"),\r
                    "If enabled, this will set the android.permission.WRITE_EXTERNAL_STORAGE flag in the manifest.");\r
 \r
         props.add (new ChoicePropertyComponent (androidInAppBillingPermission, "In-App Billing"),\r
@@ -910,7 +942,7 @@ private:
         props.add (new ChoicePropertyComponent (androidEnableContentSharing, "Content Sharing"),\r
                    "If enabled, your app will be able to share content with other apps.");\r
 \r
-        props.add (new TextPropertyComponent (androidOtherPermissions, "Custom Permissions", 2048, false),\r
+        props.add (new TextPropertyComponent (androidOtherPermissions, "Custom permissions", 2048, false),\r
                    "A space-separated list of other permission flags that should be added to the manifest.");\r
 \r
         props.add (new ChoicePropertyComponent (androidEnableRemoteNotifications, "Remote Notifications"),\r
@@ -920,7 +952,7 @@ private:
         props.add (new TextPropertyComponent (androidRemoteNotificationsConfigFile.getPropertyAsValue(), "Remote Notifications Config File", 2048, false),\r
                    "Path to google-services.json file. This will be the file provided by Firebase when creating a new app in Firebase console.");\r
 \r
-        props.add (new TextPropertyComponent (androidManifestCustomXmlElements, "Custom Manifest XML Content", 8192, true),\r
+        props.add (new TextPropertyComponent (androidManifestCustomXmlElements, "Custom manifest XML content", 8192, true),\r
                    "You can specify custom AndroidManifest.xml content overriding the default one generated by Projucer. "\r
                    "Projucer will automatically create any missing and required XML elements and attributes "\r
                    "and merge them into your custom content.");\r
@@ -1018,7 +1050,6 @@ private:
         auto midiCode = getMidiCode (javaSourceFolder, className);\r
         auto webViewCode = getWebViewCode (javaSourceFolder);\r
         auto cameraCode = getCameraCode (javaSourceFolder);\r
-        auto videoCode = getVideoCode (javaSourceFolder);\r
 \r
         auto javaSourceFile = javaSourceFolder.getChildFile ("JuceAppActivity.java");\r
         auto javaSourceLines = StringArray::fromLines (javaSourceFile.loadFileAsString());\r
@@ -1044,10 +1075,6 @@ private:
                     newFile << cameraCode.imports;\r
                 else if (line.contains ("$$JuceAndroidCameraCode$$"))\r
                     newFile << cameraCode.main;\r
-                else if (line.contains ("$$JuceAndroidVideoImports$$"))\r
-                    newFile << videoCode.imports;\r
-                else if (line.contains ("$$JuceAndroidVideoCode$$"))\r
-                    newFile << videoCode.main;\r
                 else\r
                     newFile << line.replace ("$$JuceAppActivityBaseClass$$", androidActivityBaseClassName.get().toString())\r
                                    .replace ("JuceAppActivity", className)\r
@@ -1176,12 +1203,13 @@ private:
         String juceCameraImports, juceCameraCode;\r
 \r
         if (static_cast<int> (androidMinimumSDK.get()) >= 21)\r
-        {\r
             juceCameraImports << "import android.hardware.camera2.*;" << newLine;\r
 \r
-            auto javaCameraFile = javaSourceFolder.getChildFile ("AndroidCamera.java");\r
-            auto juceCameraCodeAll = javaCameraFile.loadFileAsString();\r
+        auto javaCameraFile = javaSourceFolder.getChildFile ("AndroidCamera.java");\r
+        auto juceCameraCodeAll = javaCameraFile.loadFileAsString();\r
 \r
+        if (static_cast<int> (androidMinimumSDK.get()) >= 21)\r
+        {\r
             juceCameraCode << juceCameraCodeAll.fromFirstOccurrenceOf ("$$CameraApi21", false, false)\r
                                                .upToFirstOccurrenceOf ("CameraApi21$$", false, false);\r
         }\r
@@ -1189,32 +1217,6 @@ private:
         return { juceCameraImports, juceCameraCode };\r
     }\r
 \r
-    struct VideoCode\r
-    {\r
-        String imports;\r
-        String main;\r
-    };\r
-\r
-    VideoCode getVideoCode (const File& javaSourceFolder) const\r
-    {\r
-        String juceVideoImports, juceVideoCode;\r
-\r
-        if (static_cast<int> (androidMinimumSDK.get()) >= 21)\r
-        {\r
-            juceVideoImports << "import android.database.ContentObserver;" << newLine;\r
-            juceVideoImports << "import android.media.session.*;" << newLine;\r
-            juceVideoImports << "import android.media.MediaMetadata;" << newLine;\r
-\r
-            auto javaVideoFile = javaSourceFolder.getChildFile ("AndroidVideo.java");\r
-            auto juceVideoCodeAll = javaVideoFile.loadFileAsString();\r
-\r
-            juceVideoCode << juceVideoCodeAll.fromFirstOccurrenceOf ("$$VideoApi21", false, false)\r
-                                             .upToFirstOccurrenceOf ("VideoApi21$$", false, false);\r
-        }\r
-\r
-        return { juceVideoImports, juceVideoCode };\r
-    }\r
-\r
     void copyAdditionalJavaFiles (const File& sourceFolder, const File& targetFolder) const\r
     {\r
         auto inAppBillingJavaFileName = String ("IInAppBillingService.java");\r
@@ -1404,17 +1406,12 @@ private:
             customStringsXmlContent << cfg.getCustomStringsXml();\r
             customStringsXmlContent << "\n</resources>";\r
 \r
-            if (auto strings = parseXML (customStringsXmlContent))\r
-            {\r
-                String dir     = cfg.isDebug() ? "debug" : "release";\r
-                String subPath = "app/src/" + dir + "/res/values/string.xml";\r
+            std::unique_ptr<XmlElement> strings (XmlDocument::parse (customStringsXmlContent));\r
 \r
-                writeXmlOrThrow (*strings, folder.getChildFile (subPath), "utf-8", 100, true);\r
-            }\r
-            else\r
-            {\r
-                jassertfalse; // needs handling?\r
-            }\r
+            String dir     = cfg.isDebug() ? "debug" : "release";\r
+            String subPath = "app/src/" + dir + "/res/values/string.xml";\r
+\r
+            writeXmlOrThrow (*strings, folder.getChildFile (subPath), "utf-8", 100, true);\r
         }\r
     }\r
 \r
@@ -1710,6 +1707,7 @@ private:
         auto* manifest = createManifestElement();\r
 \r
         createSupportsScreensElement (*manifest);\r
+        createUsesSdkElement         (*manifest);\r
         createPermissionElements     (*manifest);\r
         createOpenGlFeatureElement   (*manifest);\r
 \r
@@ -1757,6 +1755,13 @@ private:
         }\r
     }\r
 \r
+    void createUsesSdkElement (XmlElement& manifest) const\r
+    {\r
+        auto* sdk = getOrCreateChildWithName (manifest, "uses-sdk");\r
+        setAttributeIfNotPresent (*sdk, "android:minSdkVersion", androidMinimumSDK.get());\r
+        setAttributeIfNotPresent (*sdk, "android:targetSdkVersion", androidMinimumSDK.get());\r
+    }\r
+\r
     void createPermissionElements (XmlElement& manifest) const\r
     {\r
         auto permissions = getPermissionsRequired();\r
@@ -1772,7 +1777,7 @@ private:
 \r
     void createOpenGlFeatureElement (XmlElement& manifest) const\r
     {\r
-        if (project.getEnabledModules().isModuleEnabled ("juce_opengl"))\r
+        if (project.getModules().isModuleEnabled ("juce_opengl"))\r
         {\r
             XmlElement* glVersion = nullptr;\r
 \r
@@ -1999,6 +2004,7 @@ private:
     }\r
 \r
     //==============================================================================\r
+    Value sdkPath, ndkPath;\r
     const File AndroidExecutable;\r
 \r
     JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter)\r
index 1c5136952de0329a252f656d29fd06f52a9f5b30..a79f4e9d4e354dbf406403e373a754eca25f2530 100644 (file)
@@ -49,7 +49,7 @@ protected:
 \r
     BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override\r
     {\r
-        return *new CLionBuildConfiguration (project, tree, *this);\r
+        return new CLionBuildConfiguration (project, tree, *this);\r
     }\r
 \r
 public:\r
@@ -101,6 +101,7 @@ public:
     bool supportsTargetType (ProjectType::Target::Type) const override   { return true; }\r
 \r
     void addPlatformSpecificSettingsForProjectType (const ProjectType&) override {}\r
+    void initialiseDependencyPathValues() override {}\r
 \r
     //==============================================================================\r
     bool canLaunchProject() override\r
@@ -116,14 +117,14 @@ public:
        #endif\r
 \r
         if (getProject().getExporters().getChildWithName (exporterName).isValid())\r
-            return getCLionExecutableOrApp().exists();\r
+            return getCLionExecutable().existsAsFile();\r
 \r
         return false;\r
     }\r
 \r
     bool launchProject() override\r
     {\r
-        return getCLionExecutableOrApp().startAsProcess (getTargetFolder().getFullPathName().quoted());\r
+        return getCLionExecutable().startAsProcess (getTargetFolder().getFullPathName().quoted());\r
     }\r
 \r
     String getDescription() override\r
@@ -184,11 +185,6 @@ public:
 \r
         // We'll append to this later.\r
         overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("CMakeLists.txt"), out);\r
-\r
-        // CMake has stopped adding PkgInfo files to bundles, so we need to do it manually\r
-        MemoryOutputStream pkgInfoOut;\r
-        pkgInfoOut << "BNDL????";\r
-        overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("PkgInfo"), out);\r
     }\r
 \r
     void writeCMakeListsExporterSection (ProjectExporter* exporter) const\r
@@ -228,21 +224,19 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    static File getCLionExecutableOrApp()\r
+    static File getCLionExecutable()\r
     {\r
-        File clionExeOrApp (getAppSettings()\r
-                            .getStoredPath (Ids::clionExePath, TargetOS::getThisOS()).get()\r
-                            .toString()\r
-                            .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName()));\r
+        File clionExe (getAppSettings()\r
+                       .getStoredPath (Ids::clionExePath)\r
+                       .toString()\r
+                       .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName()));\r
 \r
        #if JUCE_MAC\r
-        if (clionExeOrApp.getFullPathName().endsWith ("/Contents/MacOS/clion"))\r
-            clionExeOrApp = clionExeOrApp.getParentDirectory()\r
-                                         .getParentDirectory()\r
-                                         .getParentDirectory();\r
+        if (clionExe.getFileName().endsWith (".app"))\r
+            clionExe = clionExe.getChildFile ("Contents/MacOS/clion");\r
        #endif\r
 \r
-        return clionExeOrApp;\r
+        return clionExe;\r
     }\r
 \r
     //==============================================================================\r
@@ -368,17 +362,8 @@ private:
             for (auto& fileInfo : fileInfoList)\r
                 out << "    " << fileInfo.first.quoted() << newLine;\r
 \r
-            auto isCMakeBundle = exporter.isXcode() && target->getTargetFileType() == ProjectType::Target::TargetFileType::pluginBundle;\r
-            String pkgInfoPath  = File (getTargetFolder().getChildFile ("PkgInfo")).getFullPathName().quoted();\r
-\r
-            if (isCMakeBundle)\r
-                out << "    " << pkgInfoPath << newLine;\r
-\r
             out << ")" << newLine << newLine;\r
 \r
-            if (isCMakeBundle)\r
-                out << "set_source_files_properties (" << pkgInfoPath << " PROPERTIES MACOSX_PACKAGE_LOCATION .)" << newLine;\r
-\r
             for (auto& fileInfo : fileInfoList)\r
                 if (! fileInfo.second)\r
                     out << "set_source_files_properties (" << fileInfo.first.quoted() << " PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine;\r
index a3ca3500c2d8eadec6c1262dd012ac72fffb5f45..1da30c694f7859be8c8d6b6e083a73f724192188 100644 (file)
@@ -180,6 +180,9 @@ public:
         jassert (targets.size() > 0);\r
     }\r
 \r
+    //==============================================================================\r
+    void initialiseDependencyPathValues() override  {}\r
+\r
 private:\r
     ValueWithDefault targetPlatformValue;\r
 \r
@@ -232,7 +235,7 @@ private:
 \r
     BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override\r
     {\r
-        return *new CodeBlocksBuildConfiguration (project, tree, *this);\r
+        return new CodeBlocksBuildConfiguration (project, tree, *this);\r
     }\r
 \r
     //==============================================================================\r
@@ -309,7 +312,7 @@ private:
 \r
         static String guiExtrasModule ("juce_gui_extra");\r
 \r
-        if (project.getEnabledModules().isModuleEnabled (guiExtrasModule)\r
+        if (project.getModules().isModuleEnabled (guiExtrasModule)\r
             && project.isConfigFlagEnabled ("JUCE_WEB_BROWSER", true))\r
         {\r
             result.add ("webkit2gtk-4.0");\r
index d91c934d87214c66fcb801dcab46ba075bcf8bb9..941fc4b572c5cd005749cd2b10a157948ce3a925 100644 (file)
@@ -77,8 +77,29 @@ public:
 \r
         props.add (new TextPropertyComponent (targetPlatformVersion, "Windows Target Platform", 20, false),\r
                    String ("Specifies the version of the Windows SDK that will be used when building this project. ")\r
-                   + (isWindows10SDK ? "Leave this field empty to use the latest Windows 10 SDK installed on the build machine."\r
-                                     : "The default value for this exporter is " + getDefaultWindowsTargetPlatformVersion()));\r
+                   + (isWindows10SDK ? "You can see which SDKs you have installed on your machine by going to \"Program Files (x86)\\Windows Kits\\10\\Lib\". " : "")\r
+                   + "The default value for this exporter is " + getDefaultWindowsTargetPlatformVersion());\r
+    }\r
+\r
+    void addPlatformToolsetToPropertyGroup (XmlElement& p) const\r
+    {\r
+        forEachXmlChildElementWithTagName (p, e, "PropertyGroup")\r
+        e->createNewChildElement ("PlatformToolset")->addTextElement (getPlatformToolset());\r
+    }\r
+\r
+    void addWindowsTargetPlatformVersionToPropertyGroup (XmlElement& p) const\r
+    {\r
+        forEachXmlChildElementWithTagName (p, e, "PropertyGroup")\r
+        e->createNewChildElement ("WindowsTargetPlatformVersion")->addTextElement (getWindowsTargetPlatformVersion());\r
+    }\r
+\r
+    void addIPPSettingToPropertyGroup (XmlElement& p) const\r
+    {\r
+        auto ippLibrary = getIPPLibrary();\r
+\r
+        if (ippLibrary.isNotEmpty())\r
+            forEachXmlChildElementWithTagName (p, e, "PropertyGroup")\r
+            e->createNewChildElement ("UseIntelIPP")->addTextElement (ippLibrary);\r
     }\r
 \r
     void create (const OwnedArray<LibraryModule>&) const override\r
@@ -100,17 +121,17 @@ public:
     //==============================================================================\r
     void initialiseDependencyPathValues() override\r
     {\r
-        vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr },\r
-                                        getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::windows), TargetOS::windows);\r
+        vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder),\r
+                                                                Ids::vst3Path,\r
+                                                                TargetOS::windows)));\r
 \r
-        vst3PathValueWrapper.init ({ settings, Ids::vst3Folder, nullptr },\r
-                                   getAppSettings().getStoredPath (Ids::vst3Path, TargetOS::windows), TargetOS::windows);\r
+        aaxPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::aaxFolder),\r
+                                                               Ids::aaxPath,\r
+                                                               TargetOS::windows)));\r
 \r
-        aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr },\r
-                                  getAppSettings().getStoredPath (Ids::aaxPath,  TargetOS::windows), TargetOS::windows);\r
-\r
-        rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr },\r
-                                   getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::windows), TargetOS::windows);\r
+        rtasPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::rtasFolder),\r
+                                                                Ids::rtasPath,\r
+                                                                TargetOS::windows)));\r
     }\r
 \r
     //==============================================================================\r
@@ -120,26 +141,24 @@ public:
     public:\r
         MSVCBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e)\r
             : BuildConfiguration (p, settings, e),\r
-              warningLevelValue              (config, Ids::winWarningLevel,            getUndoManager(), 4),\r
-              warningsAreErrorsValue         (config, Ids::warningsAreErrors,          getUndoManager(), false),\r
-              prebuildCommandValue           (config, Ids::prebuildCommand,            getUndoManager()),\r
-              postbuildCommandValue          (config, Ids::postbuildCommand,           getUndoManager()),\r
-              generateDebugSymbolsValue      (config, Ids::alwaysGenerateDebugSymbols, getUndoManager(), false),\r
-              generateManifestValue          (config, Ids::generateManifest,           getUndoManager(), true),\r
-              enableIncrementalLinkingValue  (config, Ids::enableIncrementalLinking,   getUndoManager(), false),\r
-              useRuntimeLibDLLValue          (config, Ids::useRuntimeLibDLL,           getUndoManager(), true),\r
-              multiProcessorCompilationValue (config, Ids::multiProcessorCompilation,  getUndoManager(), true),\r
-              intermediatesPathValue         (config, Ids::intermediatesPath,          getUndoManager()),\r
-              characterSetValue              (config, Ids::characterSet,               getUndoManager()),\r
-              architectureTypeValue          (config, Ids::winArchitecture,            getUndoManager(), get64BitArchName()),\r
-              fastMathValue                  (config, Ids::fastMath,                   getUndoManager()),\r
-              debugInformationFormatValue    (config, Ids::debugInformationFormat,     getUndoManager(), isDebug() ? "ProgramDatabase" : "None"),\r
-              pluginBinaryCopyStepValue      (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), false),\r
-              vstBinaryLocation              (config, Ids::vstBinaryLocation,          getUndoManager()),\r
-              vst3BinaryLocation             (config, Ids::vst3BinaryLocation,         getUndoManager()),\r
-              rtasBinaryLocation             (config, Ids::rtasBinaryLocation,         getUndoManager()),\r
-              aaxBinaryLocation              (config, Ids::aaxBinaryLocation,          getUndoManager()),\r
-              unityPluginBinaryLocation      (config, Ids::unityPluginBinaryLocation,  getUndoManager(), {})\r
+              warningLevelValue             (config, Ids::winWarningLevel,            getUndoManager(), 4),\r
+              warningsAreErrorsValue        (config, Ids::warningsAreErrors,          getUndoManager(), false),\r
+              prebuildCommandValue          (config, Ids::prebuildCommand,            getUndoManager()),\r
+              postbuildCommandValue         (config, Ids::postbuildCommand,           getUndoManager()),\r
+              generateDebugSymbolsValue     (config, Ids::alwaysGenerateDebugSymbols, getUndoManager(), false),\r
+              generateManifestValue         (config, Ids::generateManifest,           getUndoManager(), true),\r
+              enableIncrementalLinkingValue (config, Ids::enableIncrementalLinking,   getUndoManager(), false),\r
+              useRuntimeLibDLLValue         (config, Ids::useRuntimeLibDLL,           getUndoManager(), true),\r
+              intermediatesPathValue        (config, Ids::intermediatesPath,          getUndoManager()),\r
+              characterSetValue             (config, Ids::characterSet,               getUndoManager()),\r
+              architectureTypeValue         (config, Ids::winArchitecture,            getUndoManager(), get64BitArchName()),\r
+              fastMathValue                 (config, Ids::fastMath,                   getUndoManager()),\r
+              debugInformationFormatValue   (config, Ids::debugInformationFormat,     getUndoManager(), isDebug() ? "ProgramDatabase" : "None"),\r
+              pluginBinaryCopyStepValue     (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), false),\r
+              vstBinaryLocation             (config, Ids::vstBinaryLocation,          getUndoManager()),\r
+              vst3BinaryLocation            (config, Ids::vst3BinaryLocation,         getUndoManager()),\r
+              rtasBinaryLocation            (config, Ids::rtasBinaryLocation,         getUndoManager()),\r
+              aaxBinaryLocation             (config, Ids::aaxBinaryLocation,          getUndoManager())\r
         {\r
             if (! isDebug())\r
                 updateOldLTOSetting();\r
@@ -157,36 +176,43 @@ public:
 \r
         String getPrebuildCommandString() const           { return prebuildCommandValue.get(); }\r
         String getPostbuildCommandString() const          { return postbuildCommandValue.get(); }\r
-        String getVSTBinaryLocationString() const         { return vstBinaryLocation.get(); }\r
-        String getVST3BinaryLocationString() const        { return vst3BinaryLocation.get(); }\r
-        String getRTASBinaryLocationString() const        { return rtasBinaryLocation.get();}\r
-        String getAAXBinaryLocationString() const         { return aaxBinaryLocation.get();}\r
-        String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); }\r
-        String getIntermediatesPathString() const         { return intermediatesPathValue.get(); }\r
-        String getCharacterSetString() const              { return characterSetValue.get(); }\r
-        String get64BitArchName() const                   { return "x64"; }\r
-        String get32BitArchName() const                   { return "Win32"; }\r
-        String getArchitectureString() const              { return architectureTypeValue.get(); }\r
-        String getDebugInformationFormatString() const    { return debugInformationFormatValue.get(); }\r
 \r
         bool shouldGenerateDebugSymbols() const           { return generateDebugSymbolsValue.get(); }\r
         bool shouldGenerateManifest() const               { return generateManifestValue.get(); }\r
+\r
         bool shouldLinkIncremental() const                { return enableIncrementalLinkingValue.get(); }\r
+\r
         bool isUsingRuntimeLibDLL() const                 { return useRuntimeLibDLLValue.get(); }\r
-        bool shouldUseMultiProcessorCompilation() const   { return multiProcessorCompilationValue.get(); }\r
+\r
+        String getIntermediatesPathString() const         { return intermediatesPathValue.get(); }\r
+\r
+        String getCharacterSetString() const              { return characterSetValue.get(); }\r
+\r
+        String get64BitArchName() const                   { return "x64"; }\r
+        String get32BitArchName() const                   { return "Win32"; }\r
+        String getArchitectureString() const              { return architectureTypeValue.get(); }\r
         bool is64Bit() const                              { return getArchitectureString() == get64BitArchName(); }\r
+\r
         bool isFastMathEnabled() const                    { return fastMathValue.get(); }\r
+\r
+        String getDebugInformationFormatString() const    { return debugInformationFormatValue.get(); }\r
+\r
         bool isPluginBinaryCopyStepEnabled() const        { return pluginBinaryCopyStepValue.get(); }\r
 \r
+        String getVSTBinaryLocationString() const         { return vstBinaryLocation.get(); }\r
+        String getVST3BinaryLocationString() const        { return vst3BinaryLocation.get(); }\r
+        String getRTASBinaryLocationString() const        { return rtasBinaryLocation.get();}\r
+        String getAAXBinaryLocationString() const         { return aaxBinaryLocation.get();}\r
+\r
         //==============================================================================\r
         String createMSVCConfigName() const\r
         {\r
             return getName() + "|" + (is64Bit() ? "x64" : "Win32");\r
         }\r
 \r
-        String getOutputFilename (const String& suffix, bool forceSuffix, bool forceUnityPrefix) const\r
+        String getOutputFilename (const String& suffix, bool forceSuffix) const\r
         {\r
-            auto target = File::createLegalFileName (getTargetBinaryNameString (forceUnityPrefix).trim());\r
+            auto target = File::createLegalFileName (getTargetBinaryNameString().trim());\r
 \r
             if (forceSuffix || ! target.containsChar ('.'))\r
                 return target.upToLastOccurrenceOf (".", false, false) + suffix;\r
@@ -241,12 +267,6 @@ public:
                        "C++ runtime installed. However, if you are linking libraries from different sources you must select the same type of runtime "\r
                        "used by the libraries.");\r
 \r
-            props.add (new ChoicePropertyComponent (multiProcessorCompilationValue, "Multi-Processor Compilation",\r
-                                                    { "Enabled", "Disabled" },\r
-                                                    { true,      false }),\r
-                       "Allows the compiler to use of all the available processors, which can reduce compilation time. "\r
-                       "This is enabled by default and should only be disabled if you know what you are doing.");\r
-\r
             props.add (new ChoicePropertyComponent (enableIncrementalLinkingValue, "Incremental Linking"),\r
                        "Enable to avoid linking from scratch for every new build. "\r
                        "Disable to ensure that your final release build does not contain padding or thunks.");\r
@@ -285,11 +305,10 @@ public:
 \r
     private:\r
         ValueWithDefault warningLevelValue, warningsAreErrorsValue, prebuildCommandValue, postbuildCommandValue, generateDebugSymbolsValue,\r
-                         generateManifestValue, enableIncrementalLinkingValue, useRuntimeLibDLLValue, multiProcessorCompilationValue,\r
-                         intermediatesPathValue, characterSetValue, architectureTypeValue, fastMathValue, debugInformationFormatValue,\r
-                         pluginBinaryCopyStepValue;\r
+                         generateManifestValue, enableIncrementalLinkingValue, useRuntimeLibDLLValue, intermediatesPathValue,\r
+                         characterSetValue, architectureTypeValue, fastMathValue, debugInformationFormatValue, pluginBinaryCopyStepValue;\r
 \r
-        ValueWithDefault vstBinaryLocation, vst3BinaryLocation, rtasBinaryLocation, aaxBinaryLocation, unityPluginBinaryLocation;\r
+        ValueWithDefault vstBinaryLocation, vst3BinaryLocation, rtasBinaryLocation, aaxBinaryLocation;\r
 \r
         Value architectureValueToListenTo;\r
 \r
@@ -302,13 +321,18 @@ public:
 \r
         void addVisualStudioPluginInstallPathProperties (PropertyListBuilder& props)\r
         {\r
-            auto isBuildingAnyPlugins = (project.shouldBuildVST()  || project.shouldBuildVST3() || project.shouldBuildRTAS()\r
-                                          || project.shouldBuildAAX() || project.shouldBuildUnityPlugin());\r
+            auto isBuildingAnyPlugins = (project.shouldBuildVST()  || project.shouldBuildVST3()\r
+                                      || project.shouldBuildRTAS() || project.shouldBuildAAX());\r
 \r
             if (isBuildingAnyPlugins)\r
                 props.add (new ChoicePropertyComponent (pluginBinaryCopyStepValue, "Enable Plugin Copy Step"),\r
                            "Enable this to copy plugin binaries to a specified folder after building.");\r
 \r
+            if (project.shouldBuildVST())\r
+                props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepValue, "VST Binary Location",\r
+                                                                    1024, false),\r
+                           "The folder in which the compiled VST binary should be placed.");\r
+\r
             if (project.shouldBuildVST3())\r
                 props.add (new TextPropertyComponentWithEnablement (vst3BinaryLocation, pluginBinaryCopyStepValue, "VST3 Binary Location",\r
                                                                     1024, false),\r
@@ -324,16 +348,6 @@ public:
                                                                     1024, false),\r
                            "The folder in which the compiled AAX binary should be placed.");\r
 \r
-            if (project.shouldBuildUnityPlugin())\r
-                props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepValue, "Unity Binary Location",\r
-                                                                    1024, false),\r
-                           "The folder in which the compiled Unity plugin binary and associated C# GUI script should be placed.");\r
-\r
-            if (project.shouldBuildVST())\r
-                props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepValue, "VST (Legacy) Binary Location",\r
-                                                                    1024, false),\r
-                           "The folder in which the compiled lehacy VST binary should be placed.");\r
-\r
         }\r
 \r
         void setPluginBinaryCopyLocationDefaults()\r
@@ -424,14 +438,8 @@ public:
                 if (config.shouldLinkIncremental())\r
                     e->createNewChildElement ("LinkIncremental")->addTextElement ("true");\r
 \r
-                e->createNewChildElement ("PlatformToolset")->addTextElement (owner.getPlatformToolset());\r
-\r
-                addWindowsTargetPlatformToConfig (*e);\r
-\r
-                auto ippLibrary = owner.getIPPLibrary();\r
-\r
-                if (ippLibrary.isNotEmpty())\r
-                    e->createNewChildElement ("UseIntelIPP")->addTextElement (ippLibrary);\r
+                if (config.is64Bit())\r
+                    e->createNewChildElement ("PlatformToolset")->addTextElement (getOwner().getPlatformToolset());\r
             }\r
 \r
             {\r
@@ -453,6 +461,11 @@ public:
                 p->setAttribute ("Label", "LocalAppDataPlatform");\r
             }\r
 \r
+            {\r
+                auto* e = projectXml.createNewChildElement ("PropertyGroup");\r
+                e->setAttribute ("Label", "UserMacros");\r
+            }\r
+\r
             {\r
                 auto* props = projectXml.createNewChildElement ("PropertyGroup");\r
                 props->createNewChildElement ("_ProjectFileVersion")->addTextElement ("10.0.30319.1");\r
@@ -484,7 +497,7 @@ public:
                     {\r
                         auto* targetName = props->createNewChildElement ("TargetName");\r
                         setConditionAttribute (*targetName, config);\r
-                        targetName->addTextElement (config.getOutputFilename ("", false, type == UnityPlugIn));\r
+                        targetName->addTextElement (config.getOutputFilename ("", false));\r
                     }\r
 \r
                     {\r
@@ -545,8 +558,9 @@ public:
                     cl->createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";"));\r
                     cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)");\r
 \r
-                    cl->createNewChildElement ("RuntimeLibrary")->addTextElement (config.isUsingRuntimeLibDLL() ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL")\r
-                                                                                                                : (isDebug ? "MultiThreadedDebug"    : "MultiThreaded"));\r
+                    bool runtimeDLL = config.isUsingRuntimeLibDLL();\r
+                    cl->createNewChildElement ("RuntimeLibrary")->addTextElement (runtimeDLL ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL")\r
+                                                                                  : (isDebug ? "MultiThreadedDebug"    : "MultiThreaded"));\r
                     cl->createNewChildElement ("RuntimeTypeInfo")->addTextElement ("true");\r
                     cl->createNewChildElement ("PrecompiledHeader");\r
                     cl->createNewChildElement ("AssemblerListingLocation")->addTextElement ("$(IntDir)\\");\r
@@ -554,7 +568,7 @@ public:
                     cl->createNewChildElement ("ProgramDataBaseFileName")->addTextElement ("$(IntDir)\\");\r
                     cl->createNewChildElement ("WarningLevel")->addTextElement ("Level" + String (config.getWarningLevel()));\r
                     cl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true");\r
-                    cl->createNewChildElement ("MultiProcessorCompilation")->addTextElement (config.shouldUseMultiProcessorCompilation() ? "true" : "false");\r
+                    cl->createNewChildElement ("MultiProcessorCompilation")->addTextElement ("true");\r
 \r
                     if (config.isFastMathEnabled())\r
                         cl->createNewChildElement ("FloatingPointModel")->addTextElement ("Fast");\r
@@ -594,12 +608,12 @@ public:
 \r
                 {\r
                     auto* link = group->createNewChildElement ("Link");\r
-                    link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config, type == UnityPlugIn));\r
+                    link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config));\r
                     link->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true");\r
                     link->createNewChildElement ("IgnoreSpecificDefaultLibraries")->addTextElement (isDebug ? "libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)"\r
                                                                                                             : "%(IgnoreSpecificDefaultLibraries)");\r
                     link->createNewChildElement ("GenerateDebugInformation")->addTextElement ((isDebug || config.shouldGenerateDebugSymbols()) ? "true" : "false");\r
-                    link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true, type == UnityPlugIn)));\r
+                    link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true)));\r
                     link->createNewChildElement ("SubSystem")->addTextElement (type == ConsoleApp ? "Console" : "Windows");\r
 \r
                     if (! config.is64Bit())\r
@@ -640,7 +654,7 @@ public:
                 {\r
                     auto* bsc = group->createNewChildElement ("Bscmake");\r
                     bsc->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true");\r
-                    bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true, type == UnityPlugIn)));\r
+                    bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true)));\r
                 }\r
 \r
                 if (type != SharedCodeTarget)\r
@@ -723,6 +737,10 @@ public:
                 auto* e = projectXml.createNewChildElement ("ImportGroup");\r
                 e->setAttribute ("Label", "ExtensionTargets");\r
             }\r
+\r
+            getOwner().addPlatformToolsetToPropertyGroup (projectXml);\r
+            getOwner().addWindowsTargetPlatformVersionToPropertyGroup (projectXml);\r
+            getOwner().addIPPSettingToPropertyGroup (projectXml);\r
         }\r
 \r
         String getProjectType() const\r
@@ -1040,7 +1058,7 @@ public:
         //==============================================================================\r
         RelativePath getAAXIconFile() const\r
         {\r
-            RelativePath aaxSDK (owner.getAAXPathString(), RelativePath::projectFolder);\r
+            RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder);\r
             RelativePath projectIcon ("icon.ico", RelativePath::buildTargetFolder);\r
 \r
             if (getOwner().getTargetFolder().getChildFile ("icon.ico").existsAsFile())\r
@@ -1055,18 +1073,18 @@ public:
         {\r
             if (type == AAXPlugIn)\r
             {\r
-                RelativePath aaxSDK (owner.getAAXPathString(), RelativePath::projectFolder);\r
+                RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder);\r
                 RelativePath aaxLibsFolder = aaxSDK.getChildFile ("Libs");\r
                 RelativePath bundleScript  = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat");\r
                 RelativePath iconFilePath  = getAAXIconFile();\r
 \r
-                auto outputFilename = config.getOutputFilename (".aaxplugin", true, false);\r
+                auto outputFilename = config.getOutputFilename (".aaxplugin", true);\r
                 auto bundleDir      = getOwner().getOutDirFile (config, outputFilename);\r
                 auto bundleContents = bundleDir + "\\Contents";\r
                 auto archDir        = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32");\r
                 auto executable     = archDir + String ("\\") + outputFilename;\r
 \r
-                auto pkgScript = String ("copy /Y ") + getOutputFilePath (config, false).quoted() + String (" ") + executable.quoted() + String ("\r\ncall ")\r
+                auto pkgScript = String ("copy /Y ") + getOutputFilePath (config).quoted() + String (" ") + executable.quoted() + String ("\r\ncall ")\r
                                      + createRebasedPath (bundleScript) + String (" ") + archDir.quoted() + String (" ") + createRebasedPath (iconFilePath);\r
 \r
                 if (config.isPluginBinaryCopyStepEnabled())\r
@@ -1075,24 +1093,6 @@ public:
 \r
                 return pkgScript;\r
             }\r
-            else if (type == UnityPlugIn)\r
-            {\r
-                RelativePath scriptPath (config.project.getGeneratedCodeFolder().getChildFile (config.project.getUnityScriptName()),\r
-                                         getOwner().getTargetFolder(),\r
-                                         RelativePath::projectFolder);\r
-\r
-                auto pkgScript = String ("copy /Y ") + scriptPath.toWindowsStyle().quoted() + " \"$(OutDir)\"";\r
-\r
-                if (config.isPluginBinaryCopyStepEnabled())\r
-                {\r
-                    auto copyLocation = config.getUnityPluginBinaryLocationString();\r
-\r
-                    pkgScript += "\r\ncopy /Y \"$(OutDir)$(TargetFileName)\" " +  String (copyLocation + "\\$(TargetFileName)").quoted();\r
-                    pkgScript += "\r\ncopy /Y " + String ("$(OutDir)" + config.project.getUnityScriptName()).quoted() + " " + String (copyLocation + "\\" + config.project.getUnityScriptName()).quoted();\r
-                }\r
-\r
-                return pkgScript;\r
-            }\r
             else if (config.isPluginBinaryCopyStepEnabled())\r
             {\r
                 auto copyScript = String ("copy /Y \"$(OutDir)$(TargetFileName)\"") + String (" \"$COPYDIR$\\$(TargetFileName)\"");\r
@@ -1111,7 +1111,7 @@ public:
             {\r
                 String script;\r
 \r
-                auto bundleDir      = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false, false));\r
+                auto bundleDir      = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false));\r
                 auto bundleContents = bundleDir + "\\Contents";\r
                 auto archDir        = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32");\r
 \r
@@ -1146,13 +1146,13 @@ public:
             {\r
             case AAXPlugIn:\r
                 {\r
-                    auto aaxLibsFolder = RelativePath (owner.getAAXPathString(), RelativePath::projectFolder).getChildFile ("Libs");\r
+                    auto aaxLibsFolder = RelativePath (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder).getChildFile ("Libs");\r
                     defines.set ("JucePlugin_AAXLibs_path", createRebasedPath (aaxLibsFolder));\r
                 }\r
                 break;\r
             case RTASPlugIn:\r
                 {\r
-                    RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+                    RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder);\r
                     defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag")));\r
                 }\r
                 break;\r
@@ -1174,7 +1174,7 @@ public:
             StringArray searchPaths;\r
             if (type == RTASPlugIn)\r
             {\r
-                RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+                RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder);\r
 \r
                 static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses",\r
                                            "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses",\r
@@ -1210,14 +1210,14 @@ public:
             return searchPaths;\r
         }\r
 \r
-        String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const\r
+        String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config) const\r
         {\r
-            return config.getOutputFilename (getTargetSuffix(), true, forceUnityPrefix);\r
+            return config.getOutputFilename (getTargetSuffix(), true);\r
         }\r
 \r
-        String getOutputFilePath (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const\r
+        String getOutputFilePath (const MSVCBuildConfiguration& config) const\r
         {\r
-            return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config, forceUnityPrefix));\r
+            return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config));\r
         }\r
 \r
         StringArray getLibrarySearchPaths (const BuildConfiguration& config) const\r
@@ -1244,7 +1244,7 @@ public:
 \r
             if (type != SharedCodeTarget)\r
                 if (auto* shared = getOwner().getSharedCodeTarget())\r
-                    libraries.add (shared->getBinaryNameWithSuffix (config, false));\r
+                    libraries.add (shared->getBinaryNameWithSuffix (config));\r
 \r
             return libraries.joinIntoString (";");\r
         }\r
@@ -1288,23 +1288,6 @@ public:
 \r
         String createRebasedPath (const RelativePath& path) const    {  return getOwner().createRebasedPath (path); }\r
 \r
-        void addWindowsTargetPlatformToConfig (XmlElement& e) const\r
-        {\r
-            auto target = owner.getWindowsTargetPlatformVersion();\r
-\r
-            if (target == "Latest")\r
-            {\r
-                auto* child = e.createNewChildElement ("WindowsTargetPlatformVersion");\r
-\r
-                child->setAttribute ("Condition", "'$(WindowsTargetPlatformVersion)' == ''");\r
-                child->addTextElement ("$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))");\r
-            }\r
-            else\r
-            {\r
-                e.createNewChildElement ("WindowsTargetPlatformVersion")->addTextElement (target);\r
-            }\r
-        }\r
-\r
     protected:\r
         const MSVCProjectExporterBase& owner;\r
         String projectGuid;\r
@@ -1342,7 +1325,6 @@ public:
         case ProjectType::Target::VST3PlugIn:\r
         case ProjectType::Target::AAXPlugIn:\r
         case ProjectType::Target::RTASPlugIn:\r
-        case ProjectType::Target::UnityPlugIn:\r
         case ProjectType::Target::DynamicLibrary:\r
             return true;\r
         default:\r
@@ -1362,6 +1344,8 @@ public:
     }\r
 \r
     //==============================================================================\r
+    const String& getProjectName() const         { return projectName; }\r
+\r
     bool launchProject() override\r
     {\r
        #if JUCE_WINDOWS\r
@@ -1509,7 +1493,7 @@ protected:
 \r
     BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override\r
     {\r
-        return *new MSVCBuildConfiguration (project, v, *this);\r
+        return new MSVCBuildConfiguration (project, v, *this);\r
     }\r
 \r
     StringArray getHeaderSearchPaths (const BuildConfiguration& config) const\r
@@ -1822,7 +1806,7 @@ protected:
 \r
     static bool shouldUseStdCall (const RelativePath& path)\r
     {\r
-        return path.getFileNameWithoutExtension().startsWithIgnoreCase ("include_juce_audio_plugin_client_RTAS_");\r
+        return path.getFileNameWithoutExtension().startsWithIgnoreCase ("juce_audio_plugin_client_RTAS_");\r
     }\r
 \r
     StringArray getModuleLibs() const\r
@@ -1948,7 +1932,7 @@ public:
     String getSolutionComment() const override                       { return "# Visual Studio 2017"; }\r
     String getToolsVersion() const override                          { return "15.0"; }\r
     String getDefaultToolset() const override                        { return "v141"; }\r
-    String getDefaultWindowsTargetPlatformVersion() const override   { return "Latest"; }\r
+    String getDefaultWindowsTargetPlatformVersion() const override   { return "10.0.16299.0"; }\r
 \r
     static MSVCProjectExporterVC2017* createForSettings (Project& project, const ValueTree& settings)\r
     {\r
index c0e8e58a99248e32ecc7e9f1231d524e5c28b241..3ea5f6bce93a37a609ba4b5cb5b56cb1b64ec038 100644 (file)
@@ -78,7 +78,7 @@ protected:
 \r
     BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override\r
     {\r
-        return *new MakeBuildConfiguration (project, tree, *this);\r
+        return new MakeBuildConfiguration (project, tree, *this);\r
     }\r
 \r
 public:\r
@@ -179,7 +179,6 @@ public:
             switch (type)\r
             {\r
                 case VSTPlugIn:\r
-                case UnityPlugIn:\r
                 case DynamicLibrary:        return ".so";\r
                 case SharedCodeTarget:\r
                 case StaticLibrary:         return ".a";\r
@@ -265,50 +264,25 @@ public:
             return String (getName()).upToFirstOccurrenceOf (" ", false, false);\r
         }\r
 \r
-        void writeTargetLine (OutputStream& out, const StringArray& packages)\r
+        void writeTargetLine (OutputStream& out, const bool useLinuxPackages)\r
         {\r
             jassert (type != AggregateTarget);\r
 \r
             out << getBuildProduct() << " : "\r
+                << ((useLinuxPackages) ? "check-pkg-config " : "")\r
                 << "$(OBJECTS_" << getTargetVarName() << ") $(RESOURCES)";\r
 \r
             if (type != SharedCodeTarget && owner.shouldBuildTargetType (SharedCodeTarget))\r
                 out << " $(JUCE_OUTDIR)/$(JUCE_TARGET_SHARED_CODE)";\r
 \r
-            out << newLine;\r
-\r
-            if (! packages.isEmpty())\r
-            {\r
-                out << "\t@command -v pkg-config >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine\r
-                    << "\t@pkg-config --print-errors";\r
-\r
-                for (auto& pkg : packages)\r
-                    out << " " << pkg;\r
-\r
-                out << newLine;\r
-            }\r
-\r
-            out << "\t@echo Linking \"" << owner.projectName << " - " << getName() << "\"" << newLine\r
+            out << newLine << "\t@echo Linking \"" << owner.projectName << " - " << getName() << "\"" << newLine\r
                 << "\t-$(V_AT)mkdir -p $(JUCE_BINDIR)" << newLine\r
                 << "\t-$(V_AT)mkdir -p $(JUCE_LIBDIR)" << newLine\r
                 << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)" << newLine;\r
 \r
-            if (type == UnityPlugIn)\r
-            {\r
-                auto scriptName = owner.getProject().getUnityScriptName();\r
-\r
-                RelativePath scriptPath (owner.getProject().getGeneratedCodeFolder().getChildFile (scriptName),\r
-                                         owner.getTargetFolder(),\r
-                                         RelativePath::projectFolder);\r
-\r
-                out << "\t-$(V_AT)cp " + scriptPath.toUnixStyle() + " $(JUCE_OUTDIR)/" + scriptName << newLine;\r
-            }\r
-\r
             if (owner.projectType.isStaticLibrary() || type == SharedCodeTarget)\r
-            {\r
                 out << "\t$(V_AT)$(AR) -rcs " << getBuildProduct()\r
                     << " $(OBJECTS_" << getTargetVarName() << ")" << newLine;\r
-            }\r
             else\r
             {\r
                 out << "\t$(V_AT)$(CXX) -o " << getBuildProduct()\r
@@ -388,7 +362,6 @@ public:
             case ProjectType::Target::VSTPlugIn:\r
             case ProjectType::Target::StandalonePlugIn:\r
             case ProjectType::Target::DynamicLibrary:\r
-            case ProjectType::Target::UnityPlugIn:\r
                 return true;\r
             default:\r
                 break;\r
@@ -446,6 +419,9 @@ public:
         jassert (targets.size() > 0);\r
     }\r
 \r
+    //==============================================================================\r
+    void initialiseDependencyPathValues() override  {}\r
+\r
 private:\r
     ValueWithDefault extraPkgConfigValue;\r
 \r
@@ -485,10 +461,6 @@ private:
             packages.add ("gtk+-x11-3.0");\r
         }\r
 \r
-        // don't add libcurl if curl symbols are loaded at runtime\r
-        if (! isLoadCurlSymbolsLazilyEnabled())\r
-            packages.add ("libcurl");\r
-\r
         packages.removeDuplicates (false);\r
 \r
         return packages;\r
@@ -625,18 +597,10 @@ private:
     {\r
         static String guiExtrasModule ("juce_gui_extra");\r
 \r
-        return (project.getEnabledModules().isModuleEnabled (guiExtrasModule)\r
+        return (project.getModules().isModuleEnabled (guiExtrasModule)\r
                 && project.isConfigFlagEnabled ("JUCE_WEB_BROWSER", true));\r
     }\r
 \r
-    bool isLoadCurlSymbolsLazilyEnabled() const\r
-    {\r
-        static String juceCoreModule ("juce_core");\r
-\r
-        return (project.getEnabledModules().isModuleEnabled (juceCoreModule)\r
-                && project.isConfigFlagEnabled ("JUCE_LOAD_CURL_SYMBOLS_LAZILY", false));\r
-    }\r
-\r
     //==============================================================================\r
     void writeDefineFlags (OutputStream& out, const MakeBuildConfiguration& config) const\r
     {\r
@@ -698,7 +662,7 @@ private:
         out << " $(LDFLAGS)" << newLine;\r
     }\r
 \r
-    void writeTargetLines (OutputStream& out, const StringArray& packages) const\r
+    void writeTargetLines (OutputStream& out, const bool useLinuxPackages) const\r
     {\r
         auto n = targets.size();\r
 \r
@@ -735,7 +699,7 @@ private:
                     if (! getProject().getProjectType().isAudioPlugin())\r
                         out << "all : " << target->getBuildProduct() << newLine << newLine;\r
 \r
-                    target->writeTargetLine (out, packages);\r
+                    target->writeTargetLine (out, useLinuxPackages);\r
                 }\r
             }\r
         }\r
@@ -864,10 +828,28 @@ private:
 \r
         out << getPhonyTargetLine() << newLine << newLine;\r
 \r
-        writeTargetLines (out, getPackages());\r
+        auto packages = getPackages();\r
+\r
+        writeTargetLines (out, ! packages.isEmpty());\r
 \r
         for (auto target : targets)\r
-            target->addFiles (out);out << "clean:" << newLine\r
+            target->addFiles (out);\r
+\r
+        if (! packages.isEmpty())\r
+        {\r
+            out << "check-pkg-config:" << newLine\r
+                << "\t@command -v pkg-config >/dev/null 2>&1 || "\r
+                "{ echo >&2 \"pkg-config not installed. Please, install it.\"; "\r
+                "exit 1; }" << newLine\r
+                << "\t@pkg-config --print-errors";\r
+\r
+            for (auto& pkg : packages)\r
+                out << " " << pkg;\r
+\r
+            out << newLine << newLine;\r
+        }\r
+\r
+        out << "clean:" << newLine\r
             << "\t@echo Cleaning " << projectName << newLine\r
             << "\t$(V_AT)$(CLEANCMD)" << newLine\r
             << newLine;\r
@@ -898,7 +880,7 @@ private:
     {\r
         MemoryOutputStream phonyTargetLine;\r
 \r
-        phonyTargetLine << ".PHONY: clean all strip";\r
+        phonyTargetLine << ".PHONY: clean all";\r
 \r
         if (! getProject().getProjectType().isAudioPlugin())\r
             return phonyTargetLine.toString();\r
index cb1ba705d3ed50b01a56377cce46816306671bdc..26f767b161a6ea3b0611f153a49980132c96de89 100644 (file)
@@ -26,7 +26,6 @@
 \r
 #pragma once\r
 \r
-#include "jucer_XcodeProjectParser.h"\r
 \r
 //==============================================================================\r
 namespace\r
@@ -35,7 +34,7 @@ namespace
     const char* const iosVersionDefault         = "9.3";\r
 \r
     const int oldestSDKVersion  = 7;\r
-    const int currentSDKVersion = 14;\r
+    const int currentSDKVersion = 13;\r
     const int minimumAUv3SDKVersion = 11;\r
 \r
     const char* const osxArch_Default           = "default";\r
@@ -62,11 +61,7 @@ public:
           customPListValue                             (settings, Ids::customPList,                             getUndoManager()),\r
           pListPrefixHeaderValue                       (settings, Ids::pListPrefixHeader,                       getUndoManager()),\r
           pListPreprocessValue                         (settings, Ids::pListPreprocess,                         getUndoManager()),\r
-          subprojectsValue                             (settings, Ids::xcodeSubprojects,                        getUndoManager()),\r
           extraFrameworksValue                         (settings, Ids::extraFrameworks,                         getUndoManager()),\r
-          frameworkSearchPathsValue                    (settings, Ids::frameworkSearchPaths,                    getUndoManager()),\r
-          extraCustomFrameworksValue                   (settings, Ids::extraCustomFrameworks,                   getUndoManager()),\r
-          embeddedFrameworksValue                      (settings, Ids::embeddedFrameworks,                      getUndoManager()),\r
           postbuildCommandValue                        (settings, Ids::postbuildCommand,                        getUndoManager()),\r
           prebuildCommandValue                         (settings, Ids::prebuildCommand,                         getUndoManager()),\r
           duplicateAppExResourcesFolderValue           (settings, Ids::duplicateAppExResourcesFolder,           getUndoManager(), true),\r
@@ -77,10 +72,10 @@ public:
           customXcassetsFolderValue                    (settings, Ids::customXcassetsFolder,                    getUndoManager()),\r
           microphonePermissionNeededValue              (settings, Ids::microphonePermissionNeeded,              getUndoManager()),\r
           microphonePermissionsTextValue               (settings, Ids::microphonePermissionsText,               getUndoManager(),\r
-                                                        "This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone."),\r
+                                                        "This is an audio app which requires audio input. If you do not have a USB audio interface connected it will use the microphone."),\r
           cameraPermissionNeededValue                  (settings, Ids::cameraPermissionNeeded,                  getUndoManager()),\r
           cameraPermissionTextValue                    (settings, Ids::cameraPermissionText,                    getUndoManager(),\r
-                                                        "This app requires access to the camera to function correctly."),\r
+                                                        "This app requires camera usage to function properly."),\r
           uiFileSharingEnabledValue                    (settings, Ids::UIFileSharingEnabled,                    getUndoManager()),\r
           uiSupportsDocumentBrowserValue               (settings, Ids::UISupportsDocumentBrowser,               getUndoManager()),\r
           uiStatusBarHiddenValue                       (settings, Ids::UIStatusBarHidden,                       getUndoManager()),\r
@@ -114,12 +109,7 @@ public:
     String getPListPrefixHeaderString() const        { return pListPrefixHeaderValue.get(); }\r
     bool isPListPreprocessEnabled() const            { return pListPreprocessValue.get(); }\r
 \r
-    String getSubprojectsString() const              { return subprojectsValue.get(); }\r
-\r
     String getExtraFrameworksString() const          { return extraFrameworksValue.get(); }\r
-    String getFrameworkSearchPathsString() const     { return frameworkSearchPathsValue.get(); }\r
-    String getExtraCustomFrameworksString() const    { return extraCustomFrameworksValue.get(); }\r
-    String getEmbeddedFrameworksString() const       { return embeddedFrameworksValue.get(); }\r
 \r
     String getPostBuildScript() const                { return postbuildCommandValue.get(); }\r
     String getPreBuildScript() const                 { return prebuildCommandValue.get(); }\r
@@ -189,7 +179,6 @@ public:
             case ProjectType::Target::RTASPlugIn:\r
             case ProjectType::Target::AudioUnitPlugIn:\r
             case ProjectType::Target::DynamicLibrary:\r
-            case ProjectType::Target::UnityPlugIn:\r
                 return ! iOS;\r
             default:\r
                 break;\r
@@ -245,6 +234,22 @@ public:
 \r
             props.add (new ChoicePropertyComponent (uiStatusBarHiddenValue, "Status Bar Hidden"),\r
                        "Enable this to disable the status bar in your app.");\r
+\r
+            props.add (new ChoicePropertyComponent (microphonePermissionNeededValue, "Microphone Access"),\r
+                       "Enable this to allow your app to use the microphone. "\r
+                       "The user of your app will be prompted to grant microphone access permissions.");\r
+\r
+            props.add (new TextPropertyComponentWithEnablement (microphonePermissionsTextValue, microphonePermissionNeededValue,\r
+                                                                "Microphone Access Text", 1024, false),\r
+                       "A short description of why your app requires microphone access.");\r
+\r
+            props.add (new ChoicePropertyComponent (cameraPermissionNeededValue, "Camera Access"),\r
+                       "Enable this to allow your app to use the camera. "\r
+                       "The user of your app will be prompted to grant camera access permissions.");\r
+\r
+            props.add (new TextPropertyComponentWithEnablement (cameraPermissionTextValue, cameraPermissionNeededValue,\r
+                                                                "Camera Access Text", 1024, false),\r
+                       "A short description of why your app requires camera access.");\r
         }\r
         else if (projectType.isGUIApplication())\r
         {\r
@@ -253,22 +258,6 @@ public:
                        "Using a leading '.' is optional, and the extensions are not case-sensitive.");\r
         }\r
 \r
-        props.add (new ChoicePropertyComponent (microphonePermissionNeededValue, "Microphone Access"),\r
-                   "Enable this to allow your app to use the microphone. "\r
-                   "The user of your app will be prompted to grant microphone access permissions.");\r
-\r
-        props.add (new TextPropertyComponentWithEnablement (microphonePermissionsTextValue, microphonePermissionNeededValue,\r
-                                                            "Microphone Access Text", 1024, false),\r
-                   "A short description of why your app requires microphone access.");\r
-\r
-        props.add (new ChoicePropertyComponent (cameraPermissionNeededValue, "Camera Access"),\r
-                   "Enable this to allow your app to use the camera. "\r
-                   "The user of your app will be prompted to grant camera access permissions.");\r
-\r
-        props.add (new TextPropertyComponentWithEnablement (cameraPermissionTextValue, cameraPermissionNeededValue,\r
-                                                            "Camera Access Text", 1024, false),\r
-                   "A short description of why your app requires camera access.");\r
-\r
         props.add (new ChoicePropertyComponent (iosInAppPurchasesValue, "In-App Purchases Capability"),\r
                    "Enable this to grant your app the capability for in-app purchases. "\r
                    "This option requires that you specify a valid Development Team ID.");\r
@@ -304,28 +293,9 @@ public:
         props.add (new TextPropertyComponent (pListPrefixHeaderValue, "PList Prefix Header", 512, false),\r
                    "Header file containing definitions used in plist file (see PList Preprocess).");\r
 \r
-        props.add (new TextPropertyComponent (extraFrameworksValue, "Extra System Frameworks", 2048, false),\r
-                   "A comma-separated list of extra system frameworks that should be added to the build. "\r
-                   "(Don't include the .framework extension in the name)"\r
-                   " The frameworks are expected to be located in /System/Library/Frameworks");\r
-\r
-        props.add (new TextPropertyComponent (frameworkSearchPathsValue, "Framework Search Paths", 8192, true),\r
-                   "A set of paths to search for custom frameworks (one per line).");\r
-\r
-        props.add (new TextPropertyComponent (extraCustomFrameworksValue, "Extra Custom Frameworks", 8192, true),\r
-                   "Paths to custom frameworks that should be added to the build (one per line). "\r
-                   "You will probably need to add an entry to the Framework Search Paths for each unique directory.");\r
-\r
-        props.add (new TextPropertyComponent (embeddedFrameworksValue, "Embedded Frameworks", 8192, true),\r
-                   "Paths to frameworks to be embedded with the app (one per line). "\r
-                   "If you are adding a framework here then you do not need to specify it in Extra Custom Frameworks too. "\r
-                   "You will probably need to add an entry to the Framework Search Paths for each unique directory.");\r
-\r
-        props.add (new TextPropertyComponent (subprojectsValue, "Xcode Subprojects", 8192, true),\r
-                   "Paths to Xcode projects that should be added to the build (one per line). "\r
-                   "The names of the required build products can be specified after a colon, comma seperated, "\r
-                   "e.g. \"path/to/MySubProject.xcodeproj: MySubProject, OtherTarget\". "\r
-                   "If no build products are specified, all build products associated with a subproject will be added.");\r
+        props.add (new TextPropertyComponent (extraFrameworksValue, "Extra Frameworks", 2048, false),\r
+                   "A comma-separated list of extra frameworks that should be added to the build. "\r
+                   "(Don't include the .framework extension in the name)");\r
 \r
         props.add (new TextPropertyComponent (prebuildCommandValue, "Pre-Build Shell Script", 32768, true),\r
                    "Some shell-script that will be run before a build starts.");\r
@@ -445,17 +415,9 @@ public:
     //==============================================================================\r
     void initialiseDependencyPathValues() override\r
     {\r
-        vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr },\r
-                                        getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::osx), TargetOS::osx);\r
-\r
-        vst3PathValueWrapper.init ({ settings, Ids::vst3Folder, nullptr },\r
-                                   getAppSettings().getStoredPath (Ids::vst3Path, TargetOS::osx), TargetOS::osx);\r
-\r
-        aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr },\r
-                                  getAppSettings().getStoredPath (Ids::aaxPath,  TargetOS::osx), TargetOS::osx);\r
-\r
-        rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr },\r
-                                   getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::osx), TargetOS::osx);\r
+        vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder), Ids::vst3Path, TargetOS::osx)));\r
+        aaxPath. referTo (Value (new DependencyPathValueSource (getSetting (Ids::aaxFolder),  Ids::aaxPath,  TargetOS::osx)));\r
+        rtasPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::rtasFolder), Ids::rtasPath, TargetOS::osx)));\r
     }\r
 \r
 protected:\r
@@ -480,8 +442,7 @@ protected:
               vst3BinaryLocation           (config, Ids::vst3BinaryLocation,           getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/VST3/"),\r
               auBinaryLocation             (config, Ids::auBinaryLocation,             getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/Components/"),\r
               rtasBinaryLocation           (config, Ids::rtasBinaryLocation,           getUndoManager(), "/Library/Application Support/Digidesign/Plug-Ins/"),\r
-              aaxBinaryLocation            (config, Ids::aaxBinaryLocation,            getUndoManager(), "/Library/Application Support/Avid/Audio/Plug-Ins/"),\r
-              unityPluginBinaryLocation    (config, Ids::unityPluginBinaryLocation,    getUndoManager())\r
+              aaxBinaryLocation            (config, Ids::aaxBinaryLocation,            getUndoManager(), "/Library/Application Support/Avid/Audio/Plug-Ins/")\r
         {\r
             updateOldPluginBinaryLocations();\r
             updateOldSDKDefaults();\r
@@ -500,10 +461,10 @@ protected:
                 props.add (new ChoicePropertyComponent (iosDeploymentTarget, "iOS Deployment Target",\r
                                                         { "7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "8.4",\r
                                                           "9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3",\r
-                                                          "11.0", "12.0" },\r
+                                                          "11.0" },\r
                                                         { "7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "8.4",\r
                                                           "9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3",\r
-                                                          "11.0", "12.0" }),\r
+                                                          "11.0" }),\r
                            "The minimum version of iOS that the target binary will run on.");\r
             }\r
             else\r
@@ -578,7 +539,6 @@ protected:
         String getAUBinaryLocationString() const                { return auBinaryLocation.get(); }\r
         String getRTASBinaryLocationString() const              { return rtasBinaryLocation.get();}\r
         String getAAXBinaryLocationString() const               { return aaxBinaryLocation.get();}\r
-        String getUnityPluginBinaryLocationString() const       { return unityPluginBinaryLocation.get(); }\r
 \r
     private:\r
         //==========================================================================\r
@@ -587,19 +547,23 @@ protected:
         ValueWithDefault osxSDKVersion, osxDeploymentTarget, iosDeploymentTarget, osxArchitecture,\r
                          customXcodeFlags, plistPreprocessorDefinitions, codeSignIdentity,\r
                          fastMathEnabled, stripLocalSymbolsEnabled, pluginBinaryCopyStepEnabled,\r
-                         vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation,\r
-                         aaxBinaryLocation, unityPluginBinaryLocation;\r
+                         vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation, aaxBinaryLocation;\r
 \r
         //==========================================================================\r
         void addXcodePluginInstallPathProperties (PropertyListBuilder& props)\r
         {\r
             auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAU()\r
-                                         || project.shouldBuildRTAS() || project.shouldBuildAAX() || project.shouldBuildUnityPlugin());\r
+                                         || project.shouldBuildRTAS() || project.shouldBuildAAX());\r
 \r
             if (isBuildingAnyPlugins)\r
                 props.add (new ChoicePropertyComponent (pluginBinaryCopyStepEnabled, "Enable Plugin Copy Step"),\r
                            "Enable this to copy plugin binaries to the specified folder after building.");\r
 \r
+            if (project.shouldBuildVST())\r
+                props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepEnabled, "VST Binary Location",\r
+                                                                    1024, false),\r
+                           "The folder in which the compiled VST binary should be placed.");\r
+\r
             if (project.shouldBuildVST3())\r
                 props.add (new TextPropertyComponentWithEnablement (vst3BinaryLocation, pluginBinaryCopyStepEnabled, "VST3 Binary Location",\r
                                                                     1024, false),\r
@@ -619,16 +583,6 @@ protected:
                 props.add (new TextPropertyComponentWithEnablement (aaxBinaryLocation, pluginBinaryCopyStepEnabled, "AAX Binary Location",\r
                                                                     1024, false),\r
                            "The folder in which the compiled AAX binary should be placed.");\r
-\r
-            if (project.shouldBuildUnityPlugin())\r
-                props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepEnabled, "Unity Binary Location",\r
-                                                                    1024, false),\r
-                           "The folder in which the compiled Unity plugin binary and associated C# GUI script should be placed.");\r
-\r
-            if (project.shouldBuildVST())\r
-                props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepEnabled, "VST Binary Location",\r
-                                                                    1024, false),\r
-                           "The folder in which the compiled legacy VST binary should be placed.");\r
         }\r
 \r
         void updateOldPluginBinaryLocations()\r
@@ -651,7 +605,7 @@ protected:
 \r
     BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override\r
     {\r
-        return *new XcodeBuildConfiguration (project, v, iOS, *this);\r
+        return new XcodeBuildConfiguration (project, v, iOS, *this);\r
     }\r
 \r
 public:\r
@@ -780,15 +734,6 @@ public:
                     xcodeCopyToProductInstallPathAfterBuild = true;\r
                     break;\r
 \r
-                case UnityPlugIn:\r
-                    xcodePackageType = "BNDL";\r
-                    xcodeBundleSignature = "????";\r
-                    xcodeFileType = "wrapper.cfbundle";\r
-                    xcodeBundleExtension = ".bundle";\r
-                    xcodeProductType = "com.apple.product-type.bundle";\r
-                    xcodeCopyToProductInstallPathAfterBuild = true;\r
-                    break;\r
-\r
                 case SharedCodeTarget:\r
                     xcodeFileType = "archive.ar";\r
                     xcodeBundleExtension = ".a";\r
@@ -877,7 +822,7 @@ public:
 \r
             if (ProjectExporter::BuildConfiguration::Ptr config = owner.getConfiguration(0))\r
             {\r
-                auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn));\r
+                auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString());\r
 \r
                 if (xcodeFileType == "archive.ar")\r
                     productName = getStaticLibbedFilename (productName);\r
@@ -1050,7 +995,6 @@ public:
                 return s;\r
             }\r
 \r
-            s.set ("PRODUCT_NAME", owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted());\r
             s.set ("PRODUCT_BUNDLE_IDENTIFIER", getBundleIdentifier());\r
 \r
             auto arch = (! owner.isiOS() && type == Target::AudioUnitv3PlugIn) ? osxArch_64Bit\r
@@ -1061,16 +1005,9 @@ public:
             else if (arch == osxArch_64BitUniversal)   s.set ("ARCHS", "\"$(ARCHS_STANDARD_32_64_BIT)\"");\r
             else if (arch == osxArch_64Bit)            s.set ("ARCHS", "\"$(ARCHS_STANDARD_64_BIT)\"");\r
 \r
-            StringArray headerPaths (getHeaderSearchPaths (config));\r
-            headerPaths.add ("\"$(inherited)\"");\r
-            s.set ("HEADER_SEARCH_PATHS", indentParenthesisedList (headerPaths, 1));\r
+            s.set ("HEADER_SEARCH_PATHS", String ("(") + getHeaderSearchPaths (config).joinIntoString (", ") + ", \"$(inherited)\")");\r
             s.set ("USE_HEADERMAP", String (static_cast<bool> (config.exporter.settings.getProperty ("useHeaderMap")) ? "YES" : "NO"));\r
 \r
-            auto frameworkSearchPaths = getFrameworkSearchPaths (config);\r
-\r
-            if (! frameworkSearchPaths.isEmpty())\r
-                s.set ("FRAMEWORK_SEARCH_PATHS", String ("(") + frameworkSearchPaths.joinIntoString (", ") + ", \"$(inherited)\")");\r
-\r
             s.set ("GCC_OPTIMIZATION_LEVEL", config.getGCCOptimisationFlag());\r
 \r
             if (shouldCreatePList())\r
@@ -1097,7 +1034,7 @@ public:
                 }\r
 \r
                 if (defsList.size() > 0)\r
-                    s.set ("INFOPLIST_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList, 1));\r
+                    s.set ("INFOPLIST_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList));\r
             }\r
 \r
             if (config.isLinkTimeOptimisationEnabled())\r
@@ -1120,12 +1057,6 @@ public:
             {\r
                 s.set ("INSTALL_PATH", installPath.quoted());\r
 \r
-                if (type == Target::SharedCodeTarget)\r
-                    s.set ("SKIP_INSTALL", "YES");\r
-\r
-                if (! owner.embeddedFrameworkIDs.isEmpty())\r
-                    s.set ("LD_RUNPATH_SEARCH_PATHS", "\"$(inherited) @executable_path/Frameworks @executable_path/../Frameworks\"");\r
-\r
                 if (xcodeCopyToProductInstallPathAfterBuild)\r
                 {\r
                     s.set ("DEPLOYMENT_LOCATION", "YES");\r
@@ -1172,6 +1103,9 @@ public:
 \r
                 if (sdkRoot.isNotEmpty())\r
                     s.set ("SDKROOT", sdkRoot);\r
+\r
+                s.set ("MACOSX_DEPLOYMENT_TARGET_ppc", "10.4");\r
+                s.set ("SDKROOT_ppc", "macosx10.5");\r
             }\r
 \r
             s.set ("GCC_VERSION", gccVersion);\r
@@ -1216,14 +1150,12 @@ public:
 \r
                 if (librarySearchPaths.size() > 0)\r
                 {\r
-                    StringArray libPaths;\r
-                    libPaths.add ("\"$(inherited)\"");\r
+                    String libPaths ("(\"$(inherited)\"");\r
 \r
                     for (auto& p : librarySearchPaths)\r
-                        libPaths.add ("\"\\\"" + p + "\\\"\"");\r
-\r
-                    s.set ("LIBRARY_SEARCH_PATHS", indentParenthesisedList (libPaths, 1));\r
+                        libPaths += ", \"\\\"" + p + "\\\"\"";\r
 \r
+                    s.set ("LIBRARY_SEARCH_PATHS", libPaths + ")");\r
                 }\r
             }\r
 \r
@@ -1273,7 +1205,7 @@ public:
                 defsList.add ("\"" + def + "\"");\r
             }\r
 \r
-            s.set ("GCC_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList, 1));\r
+            s.set ("GCC_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList));\r
 \r
             StringArray customFlags;\r
             customFlags.addTokens (config.getCustomXcodeFlagsString(), ",", "\"'");\r
@@ -1299,7 +1231,6 @@ public:
                 case AudioUnitPlugIn:   return config.isPluginBinaryCopyStepEnabled() ? config.getAUBinaryLocationString() : String();\r
                 case RTASPlugIn:        return config.isPluginBinaryCopyStepEnabled() ? config.getRTASBinaryLocationString() : String();\r
                 case AAXPlugIn:         return config.isPluginBinaryCopyStepEnabled() ? config.getAAXBinaryLocationString() : String();\r
-                case UnityPlugIn:       return config.isPluginBinaryCopyStepEnabled() ? config.getUnityPluginBinaryLocationString() : String();\r
                 case SharedCodeTarget:  return owner.isiOS() ? "@executable_path/Frameworks" : "@executable_path/../Frameworks";\r
                 default:                return {};\r
             }\r
@@ -1350,7 +1281,7 @@ public:
             if (! shouldCreatePList())\r
                 return;\r
 \r
-            auto plist = parseXML (owner.getPListToMergeString());\r
+            std::unique_ptr<XmlElement> plist (XmlDocument::parse (owner.getPListToMergeString()));\r
 \r
             if (plist == nullptr || ! plist->hasTagName ("plist"))\r
                 plist.reset (new XmlElement ("plist"));\r
@@ -1360,16 +1291,16 @@ public:
             if (dict == nullptr)\r
                 dict = plist->createNewChildElement ("dict");\r
 \r
-            if (owner.isMicrophonePermissionEnabled())\r
-                addPlistDictionaryKey (dict, "NSMicrophoneUsageDescription", owner.getMicrophonePermissionsTextString());\r
-\r
-            if (owner.isCameraPermissionEnabled())\r
-                addPlistDictionaryKey (dict, "NSCameraUsageDescription", owner.getCameraPermissionTextString());\r
-\r
             if (owner.iOS)\r
             {\r
                 addPlistDictionaryKeyBool (dict, "LSRequiresIPhoneOS", true);\r
 \r
+                if (owner.isMicrophonePermissionEnabled())\r
+                    addPlistDictionaryKey (dict, "NSMicrophoneUsageDescription", owner.getMicrophonePermissionsTextString());\r
+\r
+                if (owner.isCameraPermissionEnabled())\r
+                    addPlistDictionaryKey (dict, "NSCameraUsageDescription", owner.getCameraPermissionTextString());\r
+\r
                 if (type != AudioUnitv3PlugIn)\r
                     addPlistDictionaryKeyBool (dict, "UIViewControllerBasedStatusBarAppearance", false);\r
             }\r
@@ -1535,29 +1466,13 @@ public:
         }\r
 \r
         //==============================================================================\r
-        void sanitiseAndEscapeSearchPaths (const BuildConfiguration& config, StringArray& paths) const\r
-        {\r
-            paths = getCleanedStringArray (paths);\r
-\r
-            for (auto& path : paths)\r
-            {\r
-                // Xcode 10 can't deal with search paths starting with "~" so we need to replace them here...\r
-                path = owner.replacePreprocessorTokens (config, sanitisePath (path));\r
-\r
-                if (path.containsChar (' '))\r
-                    path = "\"\\\"" + path + "\\\"\""; // crazy double quotes required when there are spaces..\r
-                else\r
-                    path = "\"" + path + "\"";\r
-            }\r
-        }\r
-\r
         StringArray getHeaderSearchPaths (const BuildConfiguration& config) const\r
         {\r
             StringArray paths (owner.extraSearchPaths);\r
             paths.addArray (config.getHeaderSearchPaths());\r
             paths.addArray (getTargetExtraHeaderSearchPaths());\r
 \r
-            if (owner.project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client"))\r
+            if (owner.project.getModules().isModuleEnabled ("juce_audio_plugin_client"))\r
             {\r
                 // Needed to compile .r files\r
                 paths.add (owner.getModuleFolderRelativeToProject ("juce_audio_plugin_client")\r
@@ -1565,14 +1480,18 @@ public:
                                 .toUnixStyle());\r
             }\r
 \r
-            sanitiseAndEscapeSearchPaths (config, paths);\r
-            return paths;\r
-        }\r
+            paths = getCleanedStringArray (paths);\r
+\r
+            for (auto& s : paths)\r
+            {\r
+                s = owner.replacePreprocessorTokens (config, s);\r
+\r
+                if (s.containsChar (' '))\r
+                    s = "\"\\\"" + s + "\\\"\""; // crazy double quotes required when there are spaces..\r
+                else\r
+                    s = "\"" + s + "\"";\r
+            }\r
 \r
-        StringArray getFrameworkSearchPaths (const BuildConfiguration& config) const\r
-        {\r
-            auto paths = getSearchPathsFromString (owner.getFrameworkSearchPathsString());\r
-            sanitiseAndEscapeSearchPaths (config, paths);\r
             return paths;\r
         }\r
 \r
@@ -1612,19 +1531,6 @@ public:
             addPlistDictionaryKey (dict, "subtype", pluginSubType);\r
             addPlistDictionaryKeyInt (dict, "version", owner.project.getVersionAsHexInteger());\r
 \r
-            if (owner.project.isAUSandBoxSafe())\r
-            {\r
-                addPlistDictionaryKeyBool (dict, "sandboxSafe", true);\r
-            }\r
-            else\r
-            {\r
-                dict->createNewChildElement ("key")->addTextElement ("resourceUsage");\r
-                auto* resourceUsageDict = dict->createNewChildElement ("dict");\r
-\r
-                addPlistDictionaryKeyBool (resourceUsageDict, "network.client", true);\r
-                addPlistDictionaryKeyBool (resourceUsageDict, "temporary-exception.files.all.read-write", true);\r
-            }\r
-\r
             xcodeExtraPListEntries.add (plistKey);\r
             xcodeExtraPListEntries.add (plistEntry);\r
         }\r
@@ -1675,7 +1581,9 @@ public:
         {\r
             if (type == AAXPlugIn)\r
             {\r
-                auto aaxLibsFolder = RelativePath (owner.getAAXPathString(), RelativePath::projectFolder).getChildFile ("Libs");\r
+                 auto aaxLibsFolder\r
+                    = RelativePath (owner.getAAXPathValue().toString(), RelativePath::projectFolder)\r
+                        .getChildFile ("Libs");\r
 \r
                 String libraryPath (config.isDebug() ? "Debug" : "Release");\r
                 libraryPath += "/libAAXLibrary_libcpp.a";\r
@@ -1684,7 +1592,7 @@ public:
             }\r
             else if (type == RTASPlugIn)\r
             {\r
-                RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+                RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder);\r
 \r
                 extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a"));\r
                 extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a"));\r
@@ -1697,7 +1605,7 @@ public:
 \r
             if (type == RTASPlugIn)\r
             {\r
-                RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+                RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder);\r
 \r
                 targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/Headers/FlatCarbon");\r
                 targetExtraSearchPaths.add ("$(SDKROOT)/Developer/Headers/FlatCarbon");\r
@@ -1784,18 +1692,14 @@ private:
 \r
     mutable OwnedArray<ValueTree> pbxBuildFiles, pbxFileReferences, pbxGroups, misc, projectConfigs, targetConfigs;\r
     mutable StringArray resourceIDs, sourceIDs, targetIDs;\r
-    mutable StringArray frameworkFileIDs, embeddedFrameworkIDs, rezFileIDs, resourceFileRefs, subprojectFileIDs;\r
-    mutable Array<std::pair<String, String>> subprojectReferences;\r
+    mutable StringArray frameworkFileIDs, rezFileIDs, resourceFileRefs;\r
     mutable File menuNibFile, iconFile;\r
     mutable StringArray buildProducts;\r
 \r
     const bool iOS;\r
 \r
-    ValueWithDefault customPListValue, pListPrefixHeaderValue, pListPreprocessValue,\r
-                     subprojectsValue,\r
-                     extraFrameworksValue, frameworkSearchPathsValue, extraCustomFrameworksValue, embeddedFrameworksValue,\r
-                     postbuildCommandValue, prebuildCommandValue,\r
-                     duplicateAppExResourcesFolderValue, iosDeviceFamilyValue, iPhoneScreenOrientationValue,\r
+    ValueWithDefault customPListValue, pListPrefixHeaderValue, pListPreprocessValue, extraFrameworksValue, postbuildCommandValue,\r
+                     prebuildCommandValue, duplicateAppExResourcesFolderValue, iosDeviceFamilyValue, iPhoneScreenOrientationValue,\r
                      iPadScreenOrientationValue, customXcodeResourceFoldersValue, customXcassetsFolderValue,\r
                      microphonePermissionNeededValue, microphonePermissionsTextValue, cameraPermissionNeededValue, cameraPermissionTextValue,\r
                      uiFileSharingEnabledValue, uiSupportsDocumentBrowserValue, uiStatusBarHiddenValue, documentExtensionsValue, iosInAppPurchasesValue,\r
@@ -1822,14 +1726,7 @@ private:
     {\r
         prepareTargets();\r
 \r
-        // Must be called before adding embedded frameworks, as we want to\r
-        // embed any frameworks found in subprojects.\r
-        addSubprojects();\r
-\r
         addFrameworks();\r
-        addCustomFrameworks();\r
-        addEmbeddedFrameworks();\r
-\r
         addCustomResourceFolders();\r
         addPlistFileReferences();\r
 \r
@@ -1955,30 +1852,23 @@ private:
 \r
     void addExtraGroupsToProject (StringArray& topLevelGroupIDs) const\r
     {\r
-        {\r
+        { // Add 'resources' group\r
             auto resourcesGroupID = createID ("__resources");\r
             addGroup (resourcesGroupID, "Resources", resourceFileRefs);\r
             topLevelGroupIDs.add (resourcesGroupID);\r
         }\r
 \r
-        {\r
+        { // Add 'frameworks' group\r
             auto frameworksGroupID = createID ("__frameworks");\r
             addGroup (frameworksGroupID, "Frameworks", frameworkFileIDs);\r
             topLevelGroupIDs.add (frameworksGroupID);\r
         }\r
 \r
-        {\r
+        { // Add 'products' group\r
             auto productsGroupID = createID ("__products");\r
             addGroup (productsGroupID, "Products", buildProducts);\r
             topLevelGroupIDs.add (productsGroupID);\r
         }\r
-\r
-        if (! subprojectFileIDs.isEmpty())\r
-        {\r
-            auto subprojectLibrariesGroupID = createID ("__subprojects");\r
-            addGroup (subprojectLibrariesGroupID, "Subprojects", subprojectFileIDs);\r
-            topLevelGroupIDs.add (subprojectLibrariesGroupID);\r
-        }\r
     }\r
 \r
     void addBuildPhases() const\r
@@ -2037,10 +1927,6 @@ private:
                 && project.shouldBuildStandalonePlugin() && target->type == XcodeTarget::StandalonePlugIn)\r
                 embedAppExtension();\r
 \r
-            if (project.getProjectType().isAudioPlugin() && project.shouldBuildUnityPlugin()\r
-                && target->type == XcodeTarget::UnityPlugIn)\r
-                embedUnityScript();\r
-\r
             addTargetObject (*target);\r
         }\r
     }\r
@@ -2058,28 +1944,9 @@ private:
         }\r
     }\r
 \r
-    void embedUnityScript() const\r
-    {\r
-        if (auto* unityTarget = getTargetOfType (XcodeTarget::UnityPlugIn))\r
-        {\r
-            RelativePath scriptPath (getProject().getGeneratedCodeFolder().getChildFile (getProject().getUnityScriptName()),\r
-                                     getTargetFolder(),\r
-                                     RelativePath::buildTargetFolder);\r
-\r
-            auto path = scriptPath.toUnixStyle();\r
-            auto refID = addFileReference (path);\r
-            auto fileID = addBuildFile (path, refID, false, false);\r
-\r
-            resourceIDs.add (fileID);\r
-            resourceFileRefs.add (refID);\r
-\r
-            unityTarget->addCopyFilesPhase ("Embed Unity Script", fileID, kWrapperFolder);\r
-        }\r
-    }\r
-\r
     static Image fixMacIconImageSize (Drawable& image)\r
     {\r
-        const int validSizes[] = { 16, 32, 64, 128, 256, 512, 1024 };\r
+        const int validSizes[] = { 16, 32, 48, 128, 256, 512, 1024 };\r
 \r
         auto w = image.getWidth();\r
         auto h = image.getHeight();\r
@@ -2125,7 +1992,6 @@ private:
 \r
         v->setProperty ("dependencies", indentParenthesisedList (getTargetDependencies (target)), nullptr);\r
         v->setProperty (Ids::name, target.getXcodeSchemeName(), nullptr);\r
-\r
         v->setProperty ("productName", projectName, nullptr);\r
 \r
         if (target.type != XcodeTarget::AggregateTarget)\r
@@ -2169,7 +2035,42 @@ private:
         return dependencies;\r
     }\r
 \r
-    static void writeIconData (MemoryOutputStream& out, const Image& image, const char* type)\r
+    static void writeOldIconFormat (MemoryOutputStream& out, const Image& image, const char* type, const char* maskType)\r
+    {\r
+        auto w = image.getWidth();\r
+        auto h = image.getHeight();\r
+\r
+        out.write (type, 4);\r
+        out.writeIntBigEndian (8 + 4 * w * h);\r
+\r
+        Image::BitmapData bitmap (image, Image::BitmapData::readOnly);\r
+\r
+        for (int y = 0; y < h; ++y)\r
+        {\r
+            for (int x = 0; x < w; ++x)\r
+            {\r
+                auto pixel = bitmap.getPixelColour (x, y);\r
+                out.writeByte ((char) pixel.getAlpha());\r
+                out.writeByte ((char) pixel.getRed());\r
+                out.writeByte ((char) pixel.getGreen());\r
+                out.writeByte ((char) pixel.getBlue());\r
+            }\r
+        }\r
+\r
+        out.write (maskType, 4);\r
+        out.writeIntBigEndian (8 + w * h);\r
+\r
+        for (int y = 0; y < h; ++y)\r
+        {\r
+            for (int x = 0; x < w; ++x)\r
+            {\r
+                auto pixel = bitmap.getPixelColour (x, y);\r
+                out.writeByte ((char) pixel.getAlpha());\r
+            }\r
+        }\r
+    }\r
+\r
+    static void writeNewIconFormat (MemoryOutputStream& out, const Image& image, const char* type)\r
     {\r
         MemoryOutputStream pngData;\r
         PNGImageFormat pngFormat;\r
@@ -2183,12 +2084,12 @@ private:
     void writeIcnsFile (const OwnedArray<Drawable>& images, OutputStream& out) const\r
     {\r
         MemoryOutputStream data;\r
-        auto smallest = std::numeric_limits<int>::max();\r
+        int smallest = 0x7fffffff;\r
         Drawable* smallestImage = nullptr;\r
 \r
         for (int i = 0; i < images.size(); ++i)\r
         {\r
-            auto image = fixMacIconImageSize (*images.getUnchecked (i));\r
+            auto image = fixMacIconImageSize (*images.getUnchecked(i));\r
             jassert (image.getWidth() == image.getHeight());\r
 \r
             if (image.getWidth() < smallest)\r
@@ -2199,13 +2100,13 @@ private:
 \r
             switch (image.getWidth())\r
             {\r
-                case 16:   writeIconData (data, image, "icp4"); break;\r
-                case 32:   writeIconData (data, image, "icp5"); break;\r
-                case 64:   writeIconData (data, image, "icp6"); break;\r
-                case 128:  writeIconData (data, image, "ic07"); break;\r
-                case 256:  writeIconData (data, image, "ic08"); break;\r
-                case 512:  writeIconData (data, image, "ic09"); break;\r
-                case 1024: writeIconData (data, image, "ic10"); break;\r
+                case 16:   writeOldIconFormat (data, image, "is32", "s8mk"); break;\r
+                case 32:   writeOldIconFormat (data, image, "il32", "l8mk"); break;\r
+                case 48:   writeOldIconFormat (data, image, "ih32", "h8mk"); break;\r
+                case 128:  writeOldIconFormat (data, image, "it32", "t8mk"); break;\r
+                case 256:  writeNewIconFormat (data, image, "ic08"); break;\r
+                case 512:  writeNewIconFormat (data, image, "ic09"); break;\r
+                case 1024: writeNewIconFormat (data, image, "ic10"); break;\r
                 default:   break;\r
             }\r
         }\r
@@ -2215,7 +2116,7 @@ private:
         // If you only supply a 1024 image, the file doesn't work on 10.8, so we need\r
         // to force a smaller one in there too..\r
         if (smallest > 512 && smallestImage != nullptr)\r
-            writeIconData (data, rescaleImageForIcon (*smallestImage, 512), "ic09");\r
+            writeNewIconFormat (data, rescaleImageForIcon (*smallestImage, 512), "ic09");\r
 \r
         out.write ("icns", 4);\r
         out.writeIntBigEndian ((int) data.getDataSize() + 8);\r
@@ -2349,18 +2250,15 @@ private:
         s.set ("GCC_WARN_UNDECLARED_SELECTOR", "YES");\r
         s.set ("GCC_WARN_UNINITIALIZED_AUTOS", "YES");\r
         s.set ("GCC_WARN_UNUSED_FUNCTION", "YES");\r
-        s.set ("CLANG_ENABLE_OBJC_WEAK", "YES");\r
         s.set ("CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING", "YES");\r
         s.set ("CLANG_WARN_BOOL_CONVERSION", "YES");\r
         s.set ("CLANG_WARN_COMMA", "YES");\r
         s.set ("CLANG_WARN_CONSTANT_CONVERSION", "YES");\r
-        s.set ("CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS", "YES");\r
         s.set ("CLANG_WARN_EMPTY_BODY", "YES");\r
         s.set ("CLANG_WARN_ENUM_CONVERSION", "YES");\r
         s.set ("CLANG_WARN_INFINITE_RECURSION", "YES");\r
         s.set ("CLANG_WARN_INT_CONVERSION", "YES");\r
         s.set ("CLANG_WARN_NON_LITERAL_NULL_CONVERSION", "YES");\r
-        s.set ("CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF", "YES");\r
         s.set ("CLANG_WARN_OBJC_LITERAL_CONVERSION", "YES");\r
         s.set ("CLANG_WARN_RANGE_LOOP_ANALYSIS", "YES");\r
         s.set ("CLANG_WARN_STRICT_PROTOTYPES", "YES");\r
@@ -2455,157 +2353,17 @@ private:
         }\r
     }\r
 \r
-    void addCustomFrameworks() const\r
-    {\r
-        StringArray customFrameworks;\r
-        customFrameworks.addTokens (getExtraCustomFrameworksString(), true);\r
-        customFrameworks.trim();\r
-\r
-        for (auto& framework : customFrameworks)\r
-        {\r
-            auto frameworkID = addCustomFramework (framework);\r
-\r
-            for (auto& target : targets)\r
-            {\r
-                target->frameworkIDs.add (frameworkID);\r
-                target->frameworkNames.add (framework);\r
-            }\r
-        }\r
-    }\r
-\r
-    void addEmbeddedFrameworks() const\r
-    {\r
-        StringArray frameworks;\r
-        frameworks.addTokens (getEmbeddedFrameworksString(), true);\r
-        frameworks.trim();\r
-\r
-        for (auto& framework : frameworks)\r
-        {\r
-            auto frameworkID = addEmbeddedFramework (framework);\r
-            embeddedFrameworkIDs.add (frameworkID);\r
-\r
-            for (auto& target : targets)\r
-            {\r
-                target->frameworkIDs.add (frameworkID);\r
-                target->frameworkNames.add (framework);\r
-            }\r
-        }\r
-\r
-        if (! embeddedFrameworkIDs.isEmpty())\r
-            for (auto& target : targets)\r
-                target->addCopyFilesPhase ("Embed Frameworks", embeddedFrameworkIDs, kFrameworksFolder);\r
-    }\r
-\r
     void addCustomResourceFolders() const\r
     {\r
         StringArray folders;\r
 \r
         folders.addTokens (getCustomResourceFoldersString(), ":", "");\r
         folders.trim();\r
-        folders.removeEmptyStrings();\r
 \r
         for (auto& crf : folders)\r
             addCustomResourceFolder (crf);\r
     }\r
 \r
-    void addSubprojects() const\r
-    {\r
-        auto subprojectLines = StringArray::fromLines (getSubprojectsString());\r
-        subprojectLines.removeEmptyStrings (true);\r
-\r
-        Array<std::pair<String, StringArray>> subprojects;\r
-\r
-        for (auto& line : subprojectLines)\r
-        {\r
-            String subprojectName (line.upToFirstOccurrenceOf (":", false, false));\r
-            StringArray requestedBuildProducts (StringArray::fromTokens (line.fromFirstOccurrenceOf (":", false, false), ",;|", "\"'"));\r
-            requestedBuildProducts.trim();\r
-            subprojects.add ({ subprojectName, requestedBuildProducts });\r
-        }\r
-\r
-        for (const auto& subprojectInfo : subprojects)\r
-        {\r
-            String subprojectPath (subprojectInfo.first);\r
-\r
-            if (! subprojectPath.endsWith (".xcodeproj"))\r
-                subprojectPath += ".xcodeproj";\r
-\r
-            File subprojectFile;\r
-\r
-            if (File::isAbsolutePath (subprojectPath))\r
-            {\r
-                subprojectFile = subprojectPath;\r
-            }\r
-            else\r
-            {\r
-                subprojectFile = getProject().getProjectFolder().getChildFile (subprojectPath);\r
-\r
-                RelativePath p (subprojectPath, RelativePath::projectFolder);\r
-                subprojectPath = p.rebased (getProject().getProjectFolder(), getTargetFolder(), RelativePath::buildTargetFolder).toUnixStyle();\r
-            }\r
-\r
-            if (! subprojectFile.isDirectory())\r
-                continue;\r
-\r
-            auto availableBuildProducts = XcodeProjectParser::parseBuildProducts (subprojectFile);\r
-\r
-            // If no build products have been specified then we'll take everything\r
-            if (! subprojectInfo.second.isEmpty())\r
-            {\r
-                auto newEnd = std::remove_if (availableBuildProducts.begin(), availableBuildProducts.end(),\r
-                                              [&subprojectInfo](const std::pair<String, String> &item)\r
-                                              {\r
-                                                  return ! subprojectInfo.second.contains (item.first);\r
-                                              });\r
-                availableBuildProducts.erase (newEnd, availableBuildProducts.end());\r
-            }\r
-\r
-            if (availableBuildProducts.empty())\r
-                continue;\r
-\r
-            auto subprojectFileType = getFileType (RelativePath (subprojectPath, RelativePath::projectFolder));\r
-            auto subprojectFileID = addFileOrFolderReference (subprojectPath, "<group>", subprojectFileType);\r
-            subprojectFileIDs.add (subprojectFileID);\r
-\r
-            StringArray proxyIDs;\r
-\r
-            for (auto& buildProduct : availableBuildProducts)\r
-            {\r
-                auto buildProductFileType = getFileType (RelativePath (buildProduct.second, RelativePath::projectFolder));\r
-\r
-                auto containerID = addContainerItemProxy (subprojectFileID, buildProduct.first);\r
-                auto proxyID = addReferenceProxy (containerID, buildProduct.second, buildProductFileType);\r
-                proxyIDs.add (proxyID);\r
-\r
-                if (buildProductFileType == "archive.ar" || buildProductFileType == "wrapper.framework")\r
-                {\r
-                    auto buildFileID = addBuildFile (buildProduct.second, proxyID, false, true);\r
-\r
-                    for (auto& target : targets)\r
-                        target->frameworkIDs.add (buildFileID);\r
-\r
-                    if (buildProductFileType == "wrapper.framework")\r
-                    {\r
-                        auto fileID = createID (buildProduct.second + "buildref");\r
-\r
-                        auto* v = new ValueTree (fileID);\r
-                        v->setProperty ("isa", "PBXBuildFile", nullptr);\r
-                        v->setProperty ("fileRef", proxyID, nullptr);\r
-                        v->setProperty ("settings", "{ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }", nullptr);\r
-                        pbxBuildFiles.add (v);\r
-\r
-                        embeddedFrameworkIDs.add (fileID);\r
-                    }\r
-                }\r
-            }\r
-\r
-            auto productGroupID = createFileRefID (subprojectPath + "_products");\r
-            addGroup (productGroupID, "Products", proxyIDs);\r
-\r
-            subprojectReferences.add ({ productGroupID, subprojectFileID });\r
-        }\r
-    }\r
-\r
     void addXcassets() const\r
     {\r
         auto customXcassetsPath = getCustomXcassetsFolderString();\r
@@ -2637,7 +2395,7 @@ private:
                   "\tarchiveVersion = 1;\n"\r
                   "\tclasses = {\n\t};\n"\r
                   "\tobjectVersion = 46;\n"\r
-                  "\tobjects = {\n";\r
+                  "\tobjects = {\n\n";\r
 \r
         Array<ValueTree*> objects;\r
         objects.addArray (pbxBuildFiles);\r
@@ -2649,7 +2407,7 @@ private:
 \r
         for (auto* o : objects)\r
         {\r
-            output << "\t\t" << o->getType().toString() << " = {\n";\r
+            output << "\t\t" << o->getType().toString() << " = {";\r
 \r
             for (int j = 0; j < o->getNumProperties(); ++j)\r
             {\r
@@ -2661,10 +2419,10 @@ private:
                                                 || val.trimStart().startsWithChar ('{'))))\r
                     val = "\"" + val + "\"";\r
 \r
-                output << "\t\t\t" << propertyName.toString() << " = " << val << ";\n";\r
+                output << propertyName.toString() << " = " << val << "; ";\r
             }\r
 \r
-            output << "\t\t};\n";\r
+            output << "};\n";\r
         }\r
 \r
         output << "\t};\n\trootObject = " << createID ("__root") << ";\n}\n";\r
@@ -2687,7 +2445,7 @@ private:
         v->setProperty ("fileRef", fileRefID, nullptr);\r
 \r
         if (inhibitWarnings)\r
-            v->setProperty ("settings", "{ COMPILER_FLAGS = \"-w\"; }", nullptr);\r
+            v->setProperty ("settings", "{COMPILER_FLAGS = \"-w\"; }", nullptr);\r
 \r
         pbxBuildFiles.add (v);\r
         return fileID;\r
@@ -2718,8 +2476,17 @@ private:
         return addFileOrFolderReference (pathString, sourceTree, fileType);\r
     }\r
 \r
-    void checkAndAddFileReference (std::unique_ptr<ValueTree> v) const\r
+    String addFileOrFolderReference (String pathString, String sourceTree, String fileType) const\r
     {\r
+        auto fileRefID = createFileRefID (pathString);\r
+\r
+        std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
+        v->setProperty ("isa", "PBXFileReference", nullptr);\r
+        v->setProperty ("lastKnownFileType", fileType, nullptr);\r
+        v->setProperty (Ids::name, pathString.fromLastOccurrenceOf ("/", false, false), nullptr);\r
+        v->setProperty ("path", pathString, nullptr);\r
+        v->setProperty ("sourceTree", sourceTree, nullptr);\r
+\r
         auto existing = pbxFileReferences.indexOfSorted (*this, v.get());\r
 \r
         if (existing >= 0)\r
@@ -2731,53 +2498,6 @@ private:
         {\r
             pbxFileReferences.addSorted (*this, v.release());\r
         }\r
-    }\r
-\r
-    String addFileOrFolderReference (const String& pathString, String sourceTree, String fileType) const\r
-    {\r
-        auto fileRefID = createFileRefID (pathString);\r
-\r
-        std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
-        v->setProperty ("isa", "PBXFileReference", nullptr);\r
-        v->setProperty ("lastKnownFileType", fileType, nullptr);\r
-        v->setProperty (Ids::name, pathString.fromLastOccurrenceOf ("/", false, false), nullptr);\r
-        v->setProperty ("path", pathString, nullptr);\r
-        v->setProperty ("sourceTree", sourceTree, nullptr);\r
-\r
-        checkAndAddFileReference (std::move (v));\r
-\r
-        return fileRefID;\r
-    }\r
-\r
-    String addContainerItemProxy (const String& subprojectID, const String& itemName) const\r
-    {\r
-        auto uniqueString = subprojectID + "_" + itemName;\r
-        auto fileRefID = createFileRefID (uniqueString);\r
-\r
-        std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
-        v->setProperty ("isa", "PBXContainerItemProxy", nullptr);\r
-        v->setProperty ("containerPortal", subprojectID, nullptr);\r
-        v->setProperty ("proxyType", 2, nullptr);\r
-        v->setProperty ("remoteGlobalIDString", createFileRefID (uniqueString + "_global"), nullptr);\r
-        v->setProperty ("remoteInfo", itemName, nullptr);\r
-\r
-        checkAndAddFileReference (std::move (v));\r
-\r
-        return fileRefID;\r
-    }\r
-\r
-    String addReferenceProxy (const String& containerItemID, const String& proxyPath, const String& fileType) const\r
-    {\r
-        auto fileRefID = createFileRefID (containerItemID + "_" + proxyPath);\r
-\r
-        std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
-        v->setProperty ("isa", "PBXReferenceProxy", nullptr);\r
-        v->setProperty ("fileType", fileType, nullptr);\r
-        v->setProperty ("path", proxyPath, nullptr);\r
-        v->setProperty ("remoteRef", containerItemID, nullptr);\r
-        v->setProperty ("sourceTree", "BUILT_PRODUCTS_DIR", nullptr);\r
-\r
-        checkAndAddFileReference (std::move (v));\r
 \r
         return fileRefID;\r
     }\r
@@ -3014,41 +2734,6 @@ private:
         return addBuildFile (path, fileRefID, false, false);\r
     }\r
 \r
-    String addCustomFramework (String frameworkPath) const\r
-    {\r
-        if (! frameworkPath.endsWithIgnoreCase (".framework"))\r
-            frameworkPath << ".framework";\r
-\r
-        auto fileRefID = createFileRefID (frameworkPath);\r
-\r
-        auto fileType = getFileType (RelativePath (frameworkPath, RelativePath::projectFolder));\r
-        addFileOrFolderReference (frameworkPath, "<group>", fileType);\r
-\r
-        frameworkFileIDs.add (fileRefID);\r
-\r
-        return addBuildFile (frameworkPath, fileRefID, false, false);\r
-    }\r
-\r
-    String addEmbeddedFramework (const String& path) const\r
-    {\r
-        auto fileRefID = createFileRefID (path);\r
-\r
-        auto fileType = getFileType (RelativePath (path, RelativePath::projectFolder));\r
-        addFileOrFolderReference (path, "<group>", fileType);\r
-\r
-        auto fileID = createID (path + "buildref");\r
-\r
-        auto* v = new ValueTree (fileID);\r
-        v->setProperty ("isa", "PBXBuildFile", nullptr);\r
-        v->setProperty ("fileRef", fileRefID, nullptr);\r
-        v->setProperty ("settings", "{ ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }", nullptr);\r
-        pbxBuildFiles.add (v);\r
-\r
-        frameworkFileIDs.add (fileRefID);\r
-\r
-        return fileID;\r
-    }\r
-\r
     void addGroup (const String& groupID, const String& groupName, const StringArray& childIDs) const\r
     {\r
         auto* v = new ValueTree (groupID);\r
@@ -3117,17 +2802,6 @@ private:
         v->setProperty ("hasScannedForEncodings", (int) 0, nullptr);\r
         v->setProperty ("mainGroup", createID ("__mainsourcegroup"), nullptr);\r
         v->setProperty ("projectDirPath", "\"\"", nullptr);\r
-\r
-        if (! subprojectReferences.isEmpty())\r
-        {\r
-            StringArray projectReferences;\r
-\r
-            for (auto& reference : subprojectReferences)\r
-                projectReferences.add (indentBracedList ({ "ProductGroup = " + reference.first, "ProjectRef = " + reference.second }, 1));\r
-\r
-            v->setProperty ("projectReferences", indentParenthesisedList (projectReferences), nullptr);\r
-        }\r
-\r
         v->setProperty ("projectRoot", "\"\"", nullptr);\r
 \r
         auto targetString = "(" + targetIDs.joinIntoString (", ") + ")";\r
@@ -3200,7 +2874,9 @@ private:
 \r
     bool xcschemeManagementPlistMatchesTargets (const File& plist) const\r
     {\r
-        if (auto xml = parseXML (plist))\r
+        std::unique_ptr<XmlElement> xml (XmlDocument::parse (plist));\r
+\r
+        if (xml != nullptr)\r
             if (auto* dict = xml->getChildByName ("dict"))\r
                 return parseNamesOfTargetsFromPlist (*dict) == getNamesOfTargets();\r
 \r
@@ -3257,7 +2933,7 @@ private:
 \r
         for (auto& type : getiOSAppIconTypes())\r
         {\r
-            DynamicObject::Ptr d (new DynamicObject());\r
+            DynamicObject::Ptr d = new DynamicObject();\r
             d->setProperty ("idiom",    type.idiom);\r
             d->setProperty ("size",     type.sizeString);\r
             d->setProperty ("filename", type.filename);\r
@@ -3325,7 +3001,7 @@ private:
 \r
         for (auto& type : getiOSLaunchImageTypes())\r
         {\r
-            DynamicObject::Ptr d (new DynamicObject());\r
+            DynamicObject::Ptr d = new DynamicObject();\r
             d->setProperty ("orientation", type.orientation);\r
             d->setProperty ("idiom", type.idiom);\r
             d->setProperty ("extent",  type.extent);\r
@@ -3391,21 +3067,25 @@ private:
     }\r
 \r
     //==============================================================================\r
-    static String indentBracedList        (const StringArray& list, int depth = 0) { return indentList (list, '{', '}', ";", depth, true); }\r
-    static String indentParenthesisedList (const StringArray& list, int depth = 0) { return indentList (list, '(', ')', ",", depth, false); }\r
+    static String indentBracedList (const StringArray& list)        { return "{" + indentList (list, ";", 0, true) + " }"; }\r
+    static String indentParenthesisedList (const StringArray& list) { return "(" + indentList (list, ",", 1, false) + " )"; }\r
 \r
-    static String indentList (StringArray list, char openBracket, char closeBracket, const String& separator, int extraTabs, bool shouldSort)\r
+    static String indentList (const StringArray& list, const String& separator, int extraTabs, bool shouldSort)\r
     {\r
         if (list.size() == 0)\r
-            return openBracket + String (" ") + closeBracket;\r
+            return " ";\r
 \r
         auto tabs = "\n" + String::repeatedString ("\t", extraTabs + 4);\r
 \r
         if (shouldSort)\r
-            list.sort (true);\r
+        {\r
+            auto sorted = list;\r
+            sorted.sort (true);\r
+\r
+            return tabs + sorted.joinIntoString (separator + tabs) + separator;\r
+        }\r
 \r
-        return openBracket + tabs + list.joinIntoString (separator + tabs) + separator\r
-                   + "\n" + String::repeatedString ("\t", extraTabs + 3) + closeBracket;\r
+        return tabs + list.joinIntoString (separator + tabs) + separator;\r
     }\r
 \r
     String createID (String rootString) const\r
index 0db8e04569acea2214fc56e35ac234be1157d010..b0b07b98f400fc93a3859e801d2cd719bbcad218 100644 (file)
@@ -36,8 +36,6 @@
 \r
 #include "jucer_ProjectExport_CLion.h"\r
 \r
-#include "../Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"\r
-\r
 //==============================================================================\r
 static void addType (Array<ProjectExporter::ExporterTypeInfo>& list,\r
                      const char* name, const void* iconData, int iconDataSize)\r
@@ -298,31 +296,7 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props)
                    "The location of the folder in which the " + name + " project will be created. "\r
                    "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory.");\r
 \r
-        if (shouldBuildTargetType (ProjectType::Target::VSTPlugIn) && project.shouldBuildVST())\r
-        {\r
-            props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.wrappedValue, "VST (Legacy) SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
-                       "If you're building a VST plug-in, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. "\r
-                       "This can be an absolute path, or a path relative to the Projucer project file.");\r
-        }\r
-\r
-        if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) && project.shouldBuildVST3())\r
-        {\r
-            props.add (new FilePathPropertyComponent (vst3PathValueWrapper.wrappedValue, "VST3 SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
-                       "If you're building a VST3 plug-in, you can use this field to override the global VST3 SDK path with a project-specific path. "\r
-                       "This can be an absolute path, or a path relative to the Projucer project file.");\r
-        }\r
-\r
-        if (shouldBuildTargetType (ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX())\r
-        {\r
-            props.add (new FilePathPropertyComponent (aaxPathValueWrapper.wrappedValue, "AAX SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
-                       "If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
-        }\r
-\r
-        if (shouldBuildTargetType (ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS())\r
-        {\r
-            props.add (new FilePathPropertyComponent (rtasPathValueWrapper.wrappedValue, "RTAS SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
-                       "If you're building an RTAS plug-in, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
-        }\r
+        createDependencyPathProperties (props);\r
 \r
         props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true),\r
                    "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, "\r
@@ -353,6 +327,30 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props)
                "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts.");\r
 }\r
 \r
+void ProjectExporter::createDependencyPathProperties (PropertyListBuilder& props)\r
+{\r
+    if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost())\r
+    {\r
+        if (dynamic_cast<DependencyPathValueSource*> (&getVST3PathValue().getValueSource()) != nullptr)\r
+            props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getVST3PathValue(), "VST3 SDK Folder"),\r
+                       "If you're building a VST3 plugin or host, this must be the folder containing the VST3 SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
+    }\r
+\r
+    if (shouldBuildTargetType (ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX())\r
+    {\r
+        if (dynamic_cast<DependencyPathValueSource*> (&getAAXPathValue().getValueSource()) != nullptr)\r
+            props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getAAXPathValue(), "AAX SDK Folder"),\r
+                       "If you're building an AAX plugin, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
+    }\r
+\r
+    if (shouldBuildTargetType (ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS())\r
+    {\r
+        if (dynamic_cast<DependencyPathValueSource*> (&getRTASPathValue().getValueSource()) != nullptr)\r
+            props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getRTASPathValue(), "RTAS SDK Folder"),\r
+                       "If you're building an RTAS, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
+    }\r
+}\r
+\r
 void ProjectExporter::createIconProperties (PropertyListBuilder& props)\r
 {\r
     OwnedArray<Project::Item> images;\r
@@ -390,12 +388,8 @@ void ProjectExporter::addSettingsForProjectType (const ProjectType& type)
 \r
 void ProjectExporter::addVSTPathsIfPluginOrHost()\r
 {\r
-    if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost()\r
-         || shouldBuildTargetType (ProjectType::Target::VSTPlugIn) || project.isVSTPluginHost())\r
-    {\r
-        addLegacyVSTFolderToPathIfSpecified();\r
+    if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost())\r
         addVST3FolderToPath();\r
-    }\r
 }\r
 \r
 void ProjectExporter::addCommonAudioPluginSettings()\r
@@ -406,38 +400,21 @@ void ProjectExporter::addCommonAudioPluginSettings()
     // Note: RTAS paths are platform-dependent, impl -> addPlatformSpecificSettingsForProjectType\r
  }\r
 \r
-void ProjectExporter::addLegacyVSTFolderToPathIfSpecified()\r
-{\r
-    auto vstFolder = getVSTLegacyPathString();\r
-\r
-    if (vstFolder.isNotEmpty())\r
-        addToExtraSearchPaths (RelativePath (vstFolder, RelativePath::projectFolder), 0);\r
-}\r
-\r
-RelativePath ProjectExporter::getInternalVST3SDKPath()\r
-{\r
-    return getModuleFolderRelativeToProject ("juce_audio_processors")\r
-                           .getChildFile ("format_types")\r
-                           .getChildFile ("VST3_SDK");\r
-}\r
-\r
 void ProjectExporter::addVST3FolderToPath()\r
 {\r
-    auto vst3Folder = getVST3PathString();\r
+    auto vst3Folder = getVST3PathValue().toString();\r
 \r
     if (vst3Folder.isNotEmpty())\r
         addToExtraSearchPaths (RelativePath (vst3Folder, RelativePath::projectFolder), 0);\r
-    else\r
-        addToExtraSearchPaths (getInternalVST3SDKPath(), 0);\r
 }\r
 \r
 void ProjectExporter::addAAXFoldersToPath()\r
 {\r
-    auto aaxFolder = getAAXPathString();\r
+    auto aaxFolder = getAAXPathValue().toString();\r
 \r
     if (aaxFolder.isNotEmpty())\r
     {\r
-        RelativePath aaxFolderPath (aaxFolder, RelativePath::projectFolder);\r
+        RelativePath aaxFolderPath (getAAXPathValue().toString(), RelativePath::projectFolder);\r
 \r
         addToExtraSearchPaths (aaxFolderPath);\r
         addToExtraSearchPaths (aaxFolderPath.getChildFile ("Interfaces"));\r
@@ -473,8 +450,7 @@ void ProjectExporter::addTargetSpecificPreprocessorDefs (StringPairArray& defs,
         {"JucePlugin_Build_AUv3",       ProjectType::Target::AudioUnitv3PlugIn},\r
         {"JucePlugin_Build_RTAS",       ProjectType::Target::RTASPlugIn},\r
         {"JucePlugin_Build_AAX",        ProjectType::Target::AAXPlugIn},\r
-        {"JucePlugin_Build_Standalone", ProjectType::Target::StandalonePlugIn},\r
-        {"JucePlugin_Build_Unity",      ProjectType::Target::UnityPlugIn}\r
+        {"JucePlugin_Build_Standalone", ProjectType::Target::StandalonePlugIn}\r
     };\r
 \r
     if (targetType == ProjectType::Target::SharedCodeTarget)\r
@@ -542,13 +518,7 @@ void ProjectExporter::addToExtraSearchPaths (const RelativePath& pathFromProject
     addProjectPathToBuildPathList (extraSearchPaths, pathFromProjectFolder, index);\r
 }\r
 \r
-static var getStoredPathForModule (const String& id, const ProjectExporter& exp)\r
-{\r
-    return getAppSettings().getStoredPath (isJUCEModule (id) ? Ids::defaultJuceModulePath : Ids::defaultUserModulePath,\r
-                                           exp.getTargetOSForExporter()).get();\r
-}\r
-\r
-ValueWithDefault ProjectExporter::getPathForModuleValue (const String& moduleID)\r
+Value ProjectExporter::getPathForModuleValue (const String& moduleID)\r
 {\r
     auto* um = getUndoManager();\r
 \r
@@ -562,7 +532,7 @@ ValueWithDefault ProjectExporter::getPathForModuleValue (const String& moduleID)
         paths.appendChild (m, um);\r
     }\r
 \r
-    return { m, Ids::path, um, getStoredPathForModule (moduleID, *this) };\r
+    return m.getPropertyAsValue (Ids::path, um);\r
 }\r
 \r
 String ProjectExporter::getPathForModuleString (const String& moduleID) const\r
@@ -570,8 +540,19 @@ String ProjectExporter::getPathForModuleString (const String& moduleID) const
     auto exporterPath = settings.getChildWithName (Ids::MODULEPATHS)\r
                                 .getChildWithProperty (Ids::ID, moduleID) [Ids::path].toString();\r
 \r
-    if (exporterPath.isEmpty() || project.getEnabledModules().shouldUseGlobalPath (moduleID))\r
-        return getStoredPathForModule (moduleID, *this);\r
+    if (exporterPath.isEmpty() || project.getModules().shouldUseGlobalPath (moduleID))\r
+    {\r
+        auto id = isJUCEModule (moduleID) ? Ids::defaultJuceModulePath\r
+                                          : Ids::defaultUserModulePath;\r
+\r
+        if (TargetOS::getThisOS() != getTargetOSForExporter())\r
+            return getAppSettings().getFallbackPathForOS (id, getTargetOSForExporter()).toString();\r
+\r
+        if (id == Ids::defaultJuceModulePath)\r
+            return getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString();\r
+\r
+        return getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString();\r
+    }\r
 \r
     return exporterPath;\r
 }\r
@@ -588,17 +569,17 @@ TargetOS::OS ProjectExporter::getTargetOSForExporter() const
 {\r
     auto targetOS = TargetOS::unknown;\r
 \r
-    if      (isWindows())                 targetOS = TargetOS::windows;\r
-    else if (isOSX() || isiOS())          targetOS = TargetOS::osx;\r
-    else if (isLinux())                   targetOS = TargetOS::linux;\r
-    else if (isAndroid() || isCLion())    targetOS = TargetOS::getThisOS();\r
+    if      (isWindows())            targetOS = TargetOS::windows;\r
+    else if (isOSX() || isiOS())     targetOS = TargetOS::osx;\r
+    else if (isLinux())              targetOS = TargetOS::linux;\r
+    else if (isAndroid())            targetOS = TargetOS::getThisOS();\r
 \r
     return targetOS;\r
 }\r
 \r
 RelativePath ProjectExporter::getModuleFolderRelativeToProject (const String& moduleID) const\r
 {\r
-    if (project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID).getValue())\r
+    if (project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue())\r
         return RelativePath (project.getRelativePathForFile (project.getLocalModuleFolder (moduleID)),\r
                              RelativePath::projectFolder);\r
 \r
@@ -617,7 +598,7 @@ String ProjectExporter::getLegacyModulePath() const
 \r
 RelativePath ProjectExporter::getLegacyModulePath (const String& moduleID) const\r
 {\r
-    if (project.getEnabledModules().state.getChildWithProperty (Ids::ID, moduleID) ["useLocalCopy"])\r
+    if (project.getModules().state.getChildWithProperty (Ids::ID, moduleID) ["useLocalCopy"])\r
         return RelativePath (project.getRelativePathForFile (project.getGeneratedCodeFolder()\r
                                                                 .getChildFile ("modules")\r
                                                                 .getChildFile (moduleID)), RelativePath::projectFolder);\r
@@ -640,9 +621,9 @@ void ProjectExporter::updateOldModulePaths()
 \r
     if (oldPath.isNotEmpty())\r
     {\r
-        for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+        for (int i = project.getModules().getNumModules(); --i >= 0;)\r
         {\r
-            auto modID = project.getEnabledModules().getModuleID (i);\r
+            auto modID = project.getModules().getModuleID(i);\r
             getPathForModuleValue (modID) = getLegacyModulePath (modID).getParentDirectory().toUnixStyle();\r
         }\r
 \r
@@ -665,10 +646,10 @@ void ProjectExporter::createDefaultModulePaths()
     {\r
         if (areCompatibleExporters (*this, *exporter))\r
         {\r
-            for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+            for (int i = project.getModules().getNumModules(); --i >= 0;)\r
             {\r
-                auto modID = project.getEnabledModules().getModuleID (i);\r
-                getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID);\r
+                auto modID = project.getModules().getModuleID (i);\r
+                getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID).getValue();\r
             }\r
 \r
             return;\r
@@ -679,19 +660,19 @@ void ProjectExporter::createDefaultModulePaths()
     {\r
         if (exporter->canLaunchProject())\r
         {\r
-            for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+            for (int i = project.getModules().getNumModules(); --i >= 0;)\r
             {\r
-                auto modID = project.getEnabledModules().getModuleID (i);\r
-                getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID);\r
+                auto modID = project.getModules().getModuleID (i);\r
+                getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID).getValue();\r
             }\r
 \r
             return;\r
         }\r
     }\r
 \r
-    for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+    for (int i = project.getModules().getNumModules(); --i >= 0;)\r
     {\r
-        auto modID = project.getEnabledModules().getModuleID (i);\r
+        auto modID = project.getModules().getModuleID (i);\r
         getPathForModuleValue (modID) = "../../juce";\r
     }\r
 }\r
@@ -750,7 +731,7 @@ void ProjectExporter::addNewConfigurationFromExisting (const BuildConfiguration&
     ValueTree newConfig (Ids::CONFIGURATION);\r
     newConfig = configToCopy.config.createCopy();\r
 \r
-    newConfig.setProperty (Ids::name, configToCopy.getName(), nullptr);\r
+    newConfig.setProperty (Ids::name, configToCopy.getName(), 0);\r
 \r
     configs.appendChild (newConfig, project.getUndoManagerFor (configs));\r
 }\r
@@ -837,7 +818,7 @@ Image ProjectExporter::rescaleImageForIcon (Drawable& d, const int size)
     {\r
         auto im = SoftwareImageType().convert (drawableImage->getImage());\r
 \r
-        if (im.getWidth() == size && im.getHeight() == size)\r
+        if (size == im.getWidth() && size == im.getHeight())\r
             return im;\r
 \r
         // (scale it down in stages for better resampling)\r
index b7d4cb367184f70f4183be1686f7d73f1daef212..07cec42835866cc0807df494af5d65eb1d1cb02d 100644 (file)
@@ -27,6 +27,7 @@
 #pragma once\r
 \r
 #include "../Project/jucer_Project.h"\r
+#include "../Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h"\r
 #include "../Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h"\r
 \r
 class ProjectSaver;\r
@@ -151,16 +152,15 @@ public:
 \r
     String getExternalLibrariesString() const             { return getSearchPathsFromString (externalLibrariesValue.get().toString()).joinIntoString (";"); }\r
 \r
-    bool shouldUseGNUExtensions() const                   { return gnuExtensionsValue.get(); }\r
+    bool shouldUseGNUExtensions() const                   { return gnuExtensionsValue.get();}\r
 \r
-    String getVSTLegacyPathString() const                 { return vstLegacyPathValueWrapper.wrappedValue.get(); }\r
-    String getVST3PathString() const                      { return vst3PathValueWrapper.wrappedValue.get(); }\r
-    String getAAXPathString() const                       { return aaxPathValueWrapper.wrappedValue.get(); }\r
-    String getRTASPathString() const                      { return rtasPathValueWrapper.wrappedValue.get(); }\r
+    Value getVST3PathValue() const                        { return vst3Path; }\r
+    Value getRTASPathValue() const                        { return rtasPath; }\r
+    Value getAAXPathValue() const                         { return aaxPath; }\r
 \r
     // NB: this is the path to the parent "modules" folder that contains the named module, not the\r
     // module folder itself.\r
-    ValueWithDefault getPathForModuleValue (const String& moduleID);\r
+    Value getPathForModuleValue (const String& moduleID);\r
     String getPathForModuleString (const String& moduleID) const;\r
     void removePathForModule (const String& moduleID);\r
 \r
@@ -244,12 +244,8 @@ public:
         String getName() const                                 { return configNameValue.get(); }\r
         bool isDebug() const                                   { return isDebugValue.get(); }\r
 \r
+        String getTargetBinaryNameString() const               { return targetNameValue.get(); }\r
         String getTargetBinaryRelativePathString() const       { return targetBinaryPathValue.get(); }\r
-        String getTargetBinaryNameString (bool isUnityPlugin = false) const\r
-        {\r
-            return (isUnityPlugin ? Project::addUnityPluginPrefixIfNecessary (targetNameValue.get().toString())\r
-                                  : targetNameValue.get().toString());\r
-        }\r
 \r
         int getOptimisationLevelInt() const                    { return optimisationLevelValue.get(); }\r
         String getGCCOptimisationFlag() const;\r
@@ -303,7 +299,7 @@ public:
         bool next();\r
 \r
         BuildConfiguration& operator*() const       { return *config; }\r
-        BuildConfiguration* operator->() const      { return config.get(); }\r
+        BuildConfiguration* operator->() const      { return config; }\r
 \r
         BuildConfiguration::Ptr config;\r
         int index;\r
@@ -320,7 +316,7 @@ public:
         bool next();\r
 \r
         const BuildConfiguration& operator*() const       { return *config; }\r
-        const BuildConfiguration* operator->() const      { return config.get(); }\r
+        const BuildConfiguration* operator->() const      { return config; }\r
 \r
         BuildConfiguration::Ptr config;\r
         int index;\r
@@ -369,39 +365,7 @@ protected:
     const ProjectType& projectType;\r
     const String projectName;\r
     const File projectFolder;\r
-\r
-    //==============================================================================\r
-    // Wraps a ValueWithDefault object that has a default which depends on a global value.\r
-    // Used for the VST3, RTAS and AAX project-specific path options.\r
-    struct ValueWithDefaultWrapper  : public Value::Listener\r
-    {\r
-        void init (const ValueWithDefault& vwd, ValueWithDefault global, TargetOS::OS targetOS)\r
-        {\r
-            wrappedValue = vwd;\r
-            globalValue = global.getPropertyAsValue();\r
-            globalIdentifier = global.getPropertyID();\r
-            os = targetOS;\r
-\r
-            if (wrappedValue.get() == var())\r
-                wrappedValue.resetToDefault();\r
-\r
-            globalValue.addListener (this);\r
-            valueChanged (globalValue);\r
-        }\r
-\r
-        void valueChanged (Value&) override\r
-        {\r
-            wrappedValue.setDefault (getAppSettings().getStoredPath (globalIdentifier, os).get());\r
-        }\r
-\r
-        ValueWithDefault wrappedValue;\r
-        Value globalValue;\r
-\r
-        Identifier globalIdentifier;\r
-        TargetOS::OS os;\r
-    };\r
-\r
-    ValueWithDefaultWrapper vstLegacyPathValueWrapper, vst3PathValueWrapper, rtasPathValueWrapper, aaxPathValueWrapper;\r
+    Value vst3Path, rtasPath, aaxPath; // these must be initialised in the specific exporter c'tors!\r
 \r
     ValueWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue,\r
                      userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue;\r
@@ -477,8 +441,6 @@ private:
     void createIconProperties (PropertyListBuilder&);\r
     void addVSTPathsIfPluginOrHost();\r
     void addCommonAudioPluginSettings();\r
-    void addLegacyVSTFolderToPathIfSpecified();\r
-    RelativePath getInternalVST3SDKPath();\r
     void addVST3FolderToPath();\r
     void addAAXFoldersToPath();\r
 \r
index da1459d6fc2e5fd4b74e8c3308f309509554bb7b..4d8d9a483014886694e1208a07d60cfef3492458 100644 (file)
@@ -83,7 +83,6 @@ void ProjectSaver::writePluginCharacteristicsFile()
     flags.set ("JucePlugin_Build_RTAS",                  boolToString (project.shouldBuildRTAS()));\r
     flags.set ("JucePlugin_Build_AAX",                   boolToString (project.shouldBuildAAX()));\r
     flags.set ("JucePlugin_Build_Standalone",            boolToString (project.shouldBuildStandalonePlugin()));\r
-    flags.set ("JucePlugin_Build_Unity",                 boolToString (project.shouldBuildUnityPlugin()));\r
     flags.set ("JucePlugin_Enable_IAA",                  boolToString (project.shouldEnableIAA()));\r
     flags.set ("JucePlugin_Name",                        toStringLiteral (project.getPluginNameString()));\r
     flags.set ("JucePlugin_Desc",                        toStringLiteral (project.getPluginDescriptionString()));\r
index 8f12b3a2f1e25a4ada953bcfe23aa918cab6f012..7a3a2a4b53eea187f73b5132d1a967e602a031cc 100644 (file)
@@ -82,7 +82,7 @@ public:
         project.setFile (projectFile);\r
 \r
         OwnedArray<LibraryModule> modules;\r
-        project.getEnabledModules().createRequiredModules (modules);\r
+        project.getModules().createRequiredModules (modules);\r
 \r
         checkModuleValidity (modules);\r
 \r
@@ -94,13 +94,8 @@ public:
             auto projectRootHash = project.getProjectRoot().toXmlString().hashCode();\r
 \r
             if (project.getProjectType().isAudioPlugin())\r
-            {\r
                 writePluginCharacteristicsFile();\r
 \r
-                if (project.shouldBuildUnityPlugin())\r
-                    writeUnityScriptFile();\r
-            }\r
-\r
             writeAppConfigFile (modules, appConfigUserContent);\r
             writeBinaryDataFiles();\r
             writeAppHeader (modules);\r
@@ -115,24 +110,24 @@ public:
             }\r
 \r
             if (generatedCodeFolder.exists())\r
-            {\r
                 writeReadmeFile();\r
-                deleteUnwantedFilesIn (generatedCodeFolder);\r
-            }\r
+        }\r
 \r
-            if (errors.size() == 0)\r
-            {\r
-                // Workaround for a bug where Xcode thinks the project is invalid if opened immedietely\r
-                // after writing\r
-                if (waitAfterSaving)\r
-                    Thread::sleep (2000);\r
+        if (generatedCodeFolder.exists())\r
+            deleteUnwantedFilesIn (generatedCodeFolder);\r
 \r
-                return Result::ok();\r
-            }\r
+        if (errors.size() > 0)\r
+        {\r
+            project.setFile (oldFile);\r
+            return Result::fail (errors[0]);\r
         }\r
 \r
-        project.setFile (oldFile);\r
-        return Result::fail (errors[0]);\r
+        // Workaround for a bug where Xcode thinks the project is invalid if opened immedietely\r
+        // after writing\r
+        if (waitAfterSaving)\r
+            Thread::sleep (2000);\r
+\r
+        return Result::ok();\r
     }\r
 \r
     Result saveResourcesOnly()\r
@@ -148,7 +143,7 @@ public:
     Result saveContentNeededForLiveBuild()\r
     {\r
         OwnedArray<LibraryModule> modules;\r
-        project.getEnabledModules().createRequiredModules (modules);\r
+        project.getModules().createRequiredModules (modules);\r
 \r
         checkModuleValidity (modules);\r
 \r
@@ -390,7 +385,7 @@ private:
                     return;\r
                 }\r
 \r
-                if (project.getEnabledModules().getExtraDependenciesNeeded (module->getID()).size() > 0)\r
+                if (project.getModules().getExtraDependenciesNeeded (module->getID()).size() > 0)\r
                 {\r
                     addError ("At least one of your modules has missing dependencies!\n"\r
                               "Please go to the settings page of the highlighted modules and add the required dependencies.");\r
@@ -491,24 +486,25 @@ private:
             }\r
         }\r
 \r
-        if (extraAppConfigContent.isNotEmpty())\r
-            out << newLine << extraAppConfigContent.trimEnd() << newLine;\r
-\r
         {\r
+            int isStandaloneApplication = 1;\r
             auto& type = project.getProjectType();\r
 \r
-            auto isStandaloneApplication = (! type.isAudioPlugin() && ! type.isDynamicLibrary());\r
+            if (type.isAudioPlugin() || type.isDynamicLibrary())\r
+                isStandaloneApplication = 0;\r
 \r
-            out << newLine\r
-                << "//==============================================================================" << newLine\r
+            out << "//==============================================================================" << newLine\r
                 << "#ifndef    JUCE_STANDALONE_APPLICATION" << newLine\r
                 << " #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)" << newLine\r
                 << "  #define  JUCE_STANDALONE_APPLICATION JucePlugin_Build_Standalone" << newLine\r
                 << " #else" << newLine\r
-                << "  #define  JUCE_STANDALONE_APPLICATION " << (isStandaloneApplication ? "1" : "0") << newLine\r
+                << "  #define  JUCE_STANDALONE_APPLICATION " << isStandaloneApplication << newLine\r
                 << " #endif" << newLine\r
                 << "#endif" << newLine;\r
         }\r
+\r
+        if (extraAppConfigContent.isNotEmpty())\r
+            out << newLine << extraAppConfigContent.trimEnd() << newLine;\r
     }\r
 \r
     void writeAppConfigFile (const OwnedArray<LibraryModule>& modules, const String& userContent)\r
@@ -560,7 +556,6 @@ private:
             << "namespace ProjectInfo" << newLine\r
             << "{" << newLine\r
             << "    const char* const  projectName    = " << CppTokeniserFunctions::addEscapeChars (project.getProjectNameString()).quoted() << ";" << newLine\r
-            << "    const char* const  companyName    = " << CppTokeniserFunctions::addEscapeChars (project.getCompanyNameString()).quoted() << ";" << newLine\r
             << "    const char* const  versionString  = " << CppTokeniserFunctions::addEscapeChars (project.getVersionString()).quoted() << ";" << newLine\r
             << "    const int          versionNumber  = " << project.getVersionAsHex() << ";" << newLine\r
             << "}" << newLine\r
@@ -674,25 +669,6 @@ private:
 \r
     void writePluginCharacteristicsFile();\r
 \r
-    void writeUnityScriptFile()\r
-    {\r
-        String unityScriptContents (BinaryData::jucer_UnityPluginGUIScript_cs);\r
-\r
-        auto projectName = Project::addUnityPluginPrefixIfNecessary (project.getProjectNameString());\r
-\r
-        unityScriptContents = unityScriptContents.replace ("%%plugin_class_name%%",  projectName.replace (" ", "_"))\r
-                                                 .replace ("%%plugin_name%%",        projectName)\r
-                                                 .replace ("%%plugin_vendor%%",      project.getPluginManufacturerString())\r
-                                                 .replace ("%%plugin_description%%", project.getPluginDescriptionString());\r
-\r
-        auto f = getGeneratedCodeFolder().getChildFile (project.getUnityScriptName());\r
-\r
-        MemoryOutputStream out;\r
-        out << unityScriptContents;\r
-\r
-        replaceFileIfDifferent (f, out);\r
-    }\r
-\r
     void writeProjects (const OwnedArray<LibraryModule>&, const String&, bool);\r
 \r
     void saveExporter (ProjectExporter* exporter, const OwnedArray<LibraryModule>& modules)\r
diff --git a/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h b/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h
deleted file mode 100644 (file)
index 46e5ade..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-#include <regex>\r
-\r
-//==============================================================================\r
-class XcodeProjectParser\r
-{\r
-public:\r
-    //==============================================================================\r
-    static std::unique_ptr<HashMap<std::string, std::string>> parseObjects (const File& projectFile)\r
-    {\r
-        auto pbxprojs = projectFile.findChildFiles (File::TypesOfFileToFind::findFiles, false, "*.pbxproj");\r
-\r
-        if (pbxprojs.isEmpty())\r
-        {\r
-            jassertfalse;\r
-            return nullptr;\r
-        }\r
-\r
-        auto content = pbxprojs[0].loadFileAsString().toStdString();\r
-\r
-        std::regex comments ("/\\*.*?\\*/");\r
-        content = (std::regex_replace (content, comments, ""));\r
-\r
-        std::regex whitespace ("\\s+");\r
-        content = (std::regex_replace (content, whitespace, " "));\r
-\r
-        auto objects = std::make_unique<HashMap<std::string, std::string>>();\r
-        std::smatch objectsStartMatch;\r
-\r
-        if (! std::regex_search (content, objectsStartMatch, std::regex ("[ ;{]+objects *= *\\{")))\r
-        {\r
-            jassertfalse;\r
-            return nullptr;\r
-        }\r
-\r
-        auto strPtr = content.begin() + objectsStartMatch.position() + objectsStartMatch.length();\r
-\r
-        while (strPtr++ != content.end())\r
-        {\r
-            if (*strPtr == ' ' || *strPtr == ';')\r
-                continue;\r
-\r
-            if (*strPtr == '}')\r
-                break;\r
-\r
-            auto groupReference = parseObjectID (content, strPtr);\r
-\r
-            if (groupReference.empty())\r
-            {\r
-                jassertfalse;\r
-                return nullptr;\r
-            }\r
-\r
-            while (*strPtr == ' ' || *strPtr == '=')\r
-            {\r
-                if (++strPtr == content.end())\r
-                {\r
-                    jassertfalse;\r
-                    return nullptr;\r
-                }\r
-            }\r
-\r
-            auto bracedContent = parseBracedContent (content, strPtr);\r
-\r
-            if (bracedContent.empty())\r
-                return nullptr;\r
-\r
-            objects->set (groupReference, bracedContent);\r
-        }\r
-\r
-        jassert (strPtr <= content.end());\r
-\r
-        return objects;\r
-    }\r
-\r
-    static std::pair<std::string, std::string> findObjectMatching (const HashMap<std::string, std::string>& objects,\r
-                                                                   const std::regex& rgx)\r
-    {\r
-        HashMap<std::string, std::string>::Iterator it (objects);\r
-        std::smatch match;\r
-\r
-        while (it.next())\r
-        {\r
-            auto key = it.getValue();\r
-\r
-            if (std::regex_search (key, match, rgx))\r
-                return { it.getKey(), it.getValue() };\r
-        }\r
-\r
-        return {};\r
-    }\r
-\r
-    //==============================================================================\r
-    static std::vector<std::pair<String, String>> parseBuildProducts (const File& projectFile)\r
-    {\r
-        auto objects = parseObjects (projectFile);\r
-\r
-        if (objects == nullptr)\r
-            return {};\r
-\r
-        auto mainObject = findObjectMatching (*objects, std::regex ("[ ;{]+isa *= *PBXProject[ ;}]+"));\r
-        jassert (! mainObject.first.empty());\r
-\r
-        auto targetRefs = parseObjectItemList (mainObject.second, "targets");\r
-        jassert (! targetRefs.isEmpty());\r
-\r
-        std::vector<std::pair<String, String>> results;\r
-\r
-        for (auto& t : targetRefs)\r
-        {\r
-            auto targetRef = t.toStdString();\r
-\r
-            if (! objects->contains (targetRef))\r
-            {\r
-                jassertfalse;\r
-                continue;\r
-            }\r
-\r
-            auto name = parseObjectItemValue (objects->getReference (targetRef), "name");\r
-\r
-            if (name.empty())\r
-                continue;\r
-\r
-            auto productRef = parseObjectItemValue (objects->getReference (targetRef), "productReference");\r
-\r
-            if (productRef.empty())\r
-                continue;\r
-\r
-            if (! objects->contains (productRef))\r
-            {\r
-                jassertfalse;\r
-                continue;\r
-            }\r
-\r
-            auto path = parseObjectItemValue (objects->getReference (productRef), "path");\r
-\r
-            if (path.empty())\r
-                continue;\r
-\r
-            results.push_back ({ String (name).unquoted(), String (path).unquoted() });\r
-        }\r
-\r
-        return results;\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    static std::string parseObjectID (std::string& content, std::string::iterator& ptr)\r
-    {\r
-        auto start = ptr;\r
-\r
-        while (ptr != content.end() && *ptr != ' ' && *ptr != ';' && *ptr != '=')\r
-            ++ptr;\r
-\r
-        return ptr == content.end() ? std::string()\r
-        : content.substr ((size_t) std::distance (content.begin(), start),\r
-                          (size_t) std::distance (start, ptr));\r
-    }\r
-\r
-    //==============================================================================\r
-    static std::string parseBracedContent (std::string& content, std::string::iterator& ptr)\r
-    {\r
-        jassert (*ptr == '{');\r
-        auto start = ++ptr;\r
-        auto braceDepth = 1;\r
-\r
-        while (ptr++ != content.end())\r
-        {\r
-            switch (*ptr)\r
-            {\r
-                case '{':\r
-                    ++braceDepth;\r
-                    break;\r
-                case '}':\r
-                    if (--braceDepth == 0)\r
-                        return content.substr ((size_t) std::distance (content.begin(), start),\r
-                                               (size_t) std::distance (start, ptr));\r
-            }\r
-        }\r
-\r
-        jassertfalse;\r
-        return {};\r
-    }\r
-\r
-    //==============================================================================\r
-    static std::string parseObjectItemValue (const std::string& source, const std::string& key)\r
-    {\r
-        std::smatch match;\r
-\r
-        if (! std::regex_search (source, match, std::regex ("[ ;{]+" + key + " *= *(.*?)[ ;]+")))\r
-        {\r
-            jassertfalse;\r
-            return {};\r
-        }\r
-\r
-        return match[1];\r
-    }\r
-\r
-    //==============================================================================\r
-    static StringArray parseObjectItemList (const std::string& source, const std::string& key)\r
-    {\r
-        std::smatch match;\r
-\r
-        if (! std::regex_search (source, match, std::regex ("[ ;{]+" + key + " *= *\\((.*?)\\)")))\r
-        {\r
-            jassertfalse;\r
-            return {};\r
-        }\r
-\r
-        auto result = StringArray::fromTokens (String (match[1]), ", ", "");\r
-        result.removeEmptyStrings();\r
-\r
-        return result;\r
-    }\r
-};\r
index e43d0351254ba1469cbc2550819f9fc41ba7ddef..d195a7f4a2b7a77ef05acb53fa56703e6d351062 100644 (file)
@@ -64,11 +64,13 @@ File AppearanceSettings::getSchemesFolder()
 \r
 void AppearanceSettings::writeDefaultSchemeFile (const String& xmlString, const String& name)\r
 {\r
-    auto file = getSchemesFolder().getChildFile (name).withFileExtension (getSchemeFileSuffix());\r
+    const File file (getSchemesFolder().getChildFile (name).withFileExtension (getSchemeFileSuffix()));\r
 \r
     AppearanceSettings settings (false);\r
 \r
-    if (auto xml = parseXML (xmlString))\r
+    std::unique_ptr<XmlElement> xml (XmlDocument::parse (xmlString));\r
+\r
+    if (xml != nullptr)\r
         settings.readFromXML (*xml);\r
 \r
     settings.writeToFile (file);\r
@@ -130,10 +132,8 @@ bool AppearanceSettings::readFromXML (const XmlElement& xml)
 \r
 bool AppearanceSettings::readFromFile (const File& file)\r
 {\r
-    if (auto xml = parseXML (file))\r
-        return readFromXML (*xml);\r
-\r
-    return false;\r
+    const std::unique_ptr<XmlElement> xml (XmlDocument::parse (file));\r
+    return xml != nullptr && readFromXML (*xml);\r
 }\r
 \r
 bool AppearanceSettings::writeToFile (const File& file) const\r
index 49ea0e1eab6274cc8ce5125174715780d9c80abc..10744c9ae23f2ae04222d72cbb71198791b5b786 100644 (file)
@@ -46,11 +46,7 @@ StoredSettings::StoredSettings()
       fallbackPaths ("FALLBACK_PATHS")\r
 {\r
     updateOldProjectSettingsFiles();\r
-\r
     reload();\r
-    changed (true);\r
-    flush();\r
-\r
     checkJUCEPaths();\r
 \r
     projectDefaults.addListener (this);\r
@@ -196,21 +192,41 @@ void StoredSettings::updateOldProjectSettingsFiles()
             auto newFileName = oldFileName.replace ("Introjucer", "Projucer");\r
 \r
             if (oldFileName.contains ("_Project"))\r
-            {\r
                 f.moveFileTo (f.getSiblingFile (newProjectSettingsDir.getFileName()).getChildFile (newFileName));\r
-            }\r
             else\r
-            {\r
-                auto newFile = f.getSiblingFile (newFileName);\r
-\r
-                // don't overwrite newer settings file\r
-                if (! newFile.existsAsFile())\r
-                    f.moveFileTo (f.getSiblingFile (newFileName));\r
-            }\r
+                f.moveFileTo (f.getSiblingFile (newFileName));\r
         }\r
     }\r
 }\r
 \r
+void StoredSettings::checkJUCEPaths()\r
+{\r
+    auto moduleFolder = projectDefaults.getProperty (Ids::defaultJuceModulePath).toString();\r
+    auto juceFolder = projectDefaults.getProperty (Ids::jucePath).toString();\r
+\r
+    auto validModuleFolder = moduleFolder.isNotEmpty() && isGlobalPathValid ({}, Ids::defaultJuceModulePath, moduleFolder);\r
+    auto validJuceFolder = juceFolder.isNotEmpty() && isGlobalPathValid ({}, Ids::jucePath, juceFolder);\r
+\r
+    if (validModuleFolder && ! validJuceFolder)\r
+        projectDefaults.getPropertyAsValue (Ids::jucePath, nullptr) = File (moduleFolder).getParentDirectory().getFullPathName();\r
+    else if (! validModuleFolder && validJuceFolder)\r
+        projectDefaults.getPropertyAsValue (Ids::defaultJuceModulePath, nullptr) = File (juceFolder).getChildFile ("modules").getFullPathName();\r
+}\r
+\r
+bool StoredSettings::shouldAskUserToSetJUCEPath() noexcept\r
+{\r
+    if (! isGlobalPathValid ({}, Ids::jucePath, projectDefaults.getProperty (Ids::jucePath).toString())\r
+        && getGlobalProperties().getValue ("dontAskAboutJUCEPath", {}).isEmpty())\r
+        return true;\r
+\r
+    return false;\r
+}\r
+\r
+void StoredSettings::setDontAskAboutJUCEPathAgain() noexcept\r
+{\r
+    getGlobalProperties().setValue ("dontAskAboutJUCEPath", 1);\r
+}\r
+\r
 //==============================================================================\r
 void StoredSettings::loadSwatchColours()\r
 {\r
@@ -261,30 +277,110 @@ void StoredSettings::ColourSelectorWithSwatches::setSwatchColour (int index, con
 }\r
 \r
 //==============================================================================\r
-void StoredSettings::changed (bool isProjectDefaults)\r
+Value StoredSettings::getStoredPath (const Identifier& key)\r
 {\r
-    std::unique_ptr<XmlElement> data (isProjectDefaults ? projectDefaults.createXml()\r
-                                                        : fallbackPaths.createXml());\r
+    auto v = projectDefaults.getPropertyAsValue (key, nullptr);\r
+\r
+    if (v.toString().isEmpty())\r
+        v = getFallbackPathForOS (key, TargetOS::getThisOS()).toString();\r
 \r
-    propertyFiles.getUnchecked (0)->setValue (isProjectDefaults ? "PROJECT_DEFAULT_SETTINGS" : "FALLBACK_PATHS",\r
-                                              data.get());\r
+    return v;\r
+}\r
+\r
+Value StoredSettings::getFallbackPathForOS (const Identifier& key, DependencyPathOS os)\r
+{\r
+    auto id = Identifier();\r
+\r
+    if      (os == TargetOS::osx)     id = Ids::osxFallback;\r
+    else if (os == TargetOS::windows) id = Ids::windowsFallback;\r
+    else if (os == TargetOS::linux)   id = Ids::linuxFallback;\r
+\r
+    if (id == Identifier())\r
+        jassertfalse;\r
+\r
+    auto v = fallbackPaths.getOrCreateChildWithName (id, nullptr)\r
+                          .getPropertyAsValue (key, nullptr);\r
+\r
+    if (v.toString().isEmpty())\r
+    {\r
+        if (key == Ids::jucePath)\r
+        {\r
+            v = (os == TargetOS::windows ? "C:\\JUCE"\r
+                                         : "~/JUCE");\r
+        }\r
+        else if (key == Ids::defaultJuceModulePath)\r
+        {\r
+            v = (os == TargetOS::windows ? "C:\\JUCE\\modules"\r
+                                         : "~/JUCE/modules");\r
+        }\r
+        else if (key == Ids::defaultUserModulePath)\r
+        {\r
+            v = (os == TargetOS::windows ? "C:\\modules"\r
+                                         : "~/modules");\r
+        }\r
+        else if (key == Ids::vst3Path)\r
+        {\r
+            v = (os == TargetOS::windows ? "C:\\SDKs\\VST_SDK\\VST3_SDK"\r
+                                         : "~/SDKs/VST_SDK/VST3_SDK");\r
+        }\r
+        else if (key == Ids::rtasPath)\r
+        {\r
+            if      (os == TargetOS::windows)  v = "C:\\SDKs\\PT_90_SDK";\r
+            else if (os == TargetOS::osx)      v = "~/SDKs/PT_90_SDK";\r
+            else                               jassertfalse; // no RTAS on this OS!\r
+        }\r
+        else if (key == Ids::aaxPath)\r
+        {\r
+            if      (os == TargetOS::windows)  v = "C:\\SDKs\\AAX";\r
+            else if (os == TargetOS::osx)      v = "~/SDKs/AAX";\r
+            else                               jassertfalse; // no AAX on this OS!\r
+        }\r
+        else if (key == Ids::androidSDKPath)\r
+        {\r
+            v = "${user.home}/Library/Android/sdk";\r
+        }\r
+        else if (key == Ids::androidNDKPath)\r
+        {\r
+            v = "${user.home}/Library/Android/sdk/ndk-bundle";\r
+        }\r
+        else if (key == Ids::clionExePath)\r
+        {\r
+            if (os == TargetOS::windows)\r
+            {\r
+              #if JUCE_WINDOWS\r
+                auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {});\r
+                auto openCmd = StringArray::fromTokens (regValue, true);\r
+\r
+                if (! openCmd.isEmpty())\r
+                    return Value (openCmd[0].unquoted());\r
+              #endif\r
+\r
+                v = "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe";\r
+            }\r
+            else if (os == TargetOS::osx)\r
+            {\r
+                v = "/Applications/CLion.app";\r
+            }\r
+            else\r
+            {\r
+                v = "${user.home}/clion/bin/clion.sh";\r
+            }\r
+        }\r
+    }\r
+\r
+    return v;\r
 }\r
 \r
-//==============================================================================\r
 static bool doesSDKPathContainFile (const File& relativeTo, const String& path, const String& fileToCheckFor) noexcept\r
 {\r
     auto actualPath = path.replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
     return relativeTo.getChildFile (actualPath + "/" + fileToCheckFor).exists();\r
 }\r
 \r
-static bool isGlobalPathValid (const File& relativeTo, const Identifier& key, const String& path)\r
+bool StoredSettings::isGlobalPathValid (const File& relativeTo, const Identifier& key, const String& path) const noexcept\r
 {\r
     String fileToCheckFor;\r
 \r
-    if (key == Ids::vstLegacyPath)\r
-    {\r
-        fileToCheckFor = "pluginterfaces/vst2.x/aeffect.h";\r
-    }\r
     if (key == Ids::vst3Path)\r
     {\r
         fileToCheckFor = "base/source/baseiids.cpp";\r
@@ -331,14 +427,6 @@ static bool isGlobalPathValid (const File& relativeTo, const Identifier& key, co
         fileToCheckFor = "../clion.sh";\r
        #endif\r
     }\r
-    else if (key == Ids::androidStudioExePath)\r
-    {\r
-       #if JUCE_MAC\r
-        fileToCheckFor = "Android Studio.app";\r
-       #elif JUCE_WINDOWS\r
-        fileToCheckFor = "studio64.exe";\r
-       #endif\r
-    }\r
     else if (key == Ids::jucePath)\r
     {\r
         fileToCheckFor = "ChangeList.txt";\r
@@ -352,138 +440,3 @@ static bool isGlobalPathValid (const File& relativeTo, const Identifier& key, co
 \r
     return doesSDKPathContainFile (relativeTo, path, fileToCheckFor);\r
 }\r
-\r
-void StoredSettings::checkJUCEPaths()\r
-{\r
-    auto moduleFolder = getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString();\r
-    auto juceFolder   = getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString();\r
-\r
-    auto validModuleFolder = isGlobalPathValid ({}, Ids::defaultJuceModulePath, moduleFolder);\r
-    auto validJuceFolder   = isGlobalPathValid ({}, Ids::jucePath, juceFolder);\r
-\r
-    if (validModuleFolder && ! validJuceFolder)\r
-        projectDefaults.getPropertyAsValue (Ids::jucePath, nullptr) = File (moduleFolder).getParentDirectory().getFullPathName();\r
-    else if (! validModuleFolder && validJuceFolder)\r
-        projectDefaults.getPropertyAsValue (Ids::defaultJuceModulePath, nullptr) = File (juceFolder).getChildFile ("modules").getFullPathName();\r
-}\r
-\r
-bool StoredSettings::shouldAskUserToSetJUCEPath() noexcept\r
-{\r
-    if (! isGlobalPathValid ({}, Ids::jucePath, getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString())\r
-        && getGlobalProperties().getValue ("dontAskAboutJUCEPath", {}).isEmpty())\r
-        return true;\r
-\r
-    return false;\r
-}\r
-\r
-void StoredSettings::setDontAskAboutJUCEPathAgain() noexcept\r
-{\r
-    getGlobalProperties().setValue ("dontAskAboutJUCEPath", 1);\r
-}\r
-\r
-static String getFallbackPathForOS (const Identifier& key, DependencyPathOS os)\r
-{\r
-    if (key == Ids::jucePath)\r
-    {\r
-        return (os == TargetOS::windows ? "C:\\JUCE" : "~/JUCE");\r
-    }\r
-    else if (key == Ids::defaultJuceModulePath)\r
-    {\r
-        return (os == TargetOS::windows ? "C:\\JUCE\\modules" : "~/JUCE/modules");\r
-    }\r
-    else if (key == Ids::defaultUserModulePath)\r
-    {\r
-        return (os == TargetOS::windows ? "C:\\modules" : "~/modules");\r
-    }\r
-    else if (key == Ids::vstLegacyPath || key == Ids::vst3Path)\r
-    {\r
-        return {};\r
-    }\r
-    else if (key == Ids::rtasPath)\r
-    {\r
-        if      (os == TargetOS::windows)  return "C:\\SDKs\\PT_90_SDK";\r
-        else if (os == TargetOS::osx)      return "~/SDKs/PT_90_SDK";\r
-        else                               return {}; // no RTAS on this OS!\r
-    }\r
-    else if (key == Ids::aaxPath)\r
-    {\r
-        if      (os == TargetOS::windows)  return "C:\\SDKs\\AAX";\r
-        else if (os == TargetOS::osx)      return "~/SDKs/AAX";\r
-        else                               return {}; // no AAX on this OS!\r
-    }\r
-    else if (key == Ids::androidSDKPath)\r
-    {\r
-        return "${user.home}/Library/Android/sdk";\r
-    }\r
-    else if (key == Ids::androidNDKPath)\r
-    {\r
-        return "${user.home}/Library/Android/sdk/ndk-bundle";\r
-    }\r
-    else if (key == Ids::clionExePath)\r
-    {\r
-        if (os == TargetOS::windows)\r
-        {\r
-          #if JUCE_WINDOWS\r
-            auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {});\r
-            auto openCmd = StringArray::fromTokens (regValue, true);\r
-\r
-            if (! openCmd.isEmpty())\r
-                return openCmd[0].unquoted();\r
-          #endif\r
-\r
-            return "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe";\r
-        }\r
-        else if (os == TargetOS::osx)\r
-        {\r
-            return "/Applications/CLion.app";\r
-        }\r
-        else\r
-        {\r
-            return "${user.home}/clion/bin/clion.sh";\r
-        }\r
-    }\r
-    else if (key == Ids::androidStudioExePath)\r
-    {\r
-        if (os == TargetOS::windows)\r
-        {\r
-           #if JUCE_WINDOWS\r
-            auto path = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio\\Path", {}, {});\r
-\r
-            if (! path.isEmpty())\r
-                return path.unquoted() + "\\bin\\studio64.exe";\r
-           #endif\r
-\r
-            return "C:\\Program Files\\Android\\Android Studio\\bin\\studio64.exe";\r
-        }\r
-        else if (os == TargetOS::osx)\r
-        {\r
-            return "/Applications/Android Studio.app";\r
-        }\r
-        else\r
-        {\r
-            return {}; // no Android Studio on this OS!\r
-        }\r
-    }\r
-\r
-    // unknown key!\r
-    jassertfalse;\r
-    return {};\r
-}\r
-\r
-static Identifier identifierForOS (DependencyPathOS os) noexcept\r
-{\r
-    if      (os == TargetOS::osx)     return Ids::osxFallback;\r
-    else if (os == TargetOS::windows) return Ids::windowsFallback;\r
-    else if (os == TargetOS::linux)   return Ids::linuxFallback;\r
-\r
-    jassertfalse;\r
-    return {};\r
-}\r
-\r
-ValueWithDefault StoredSettings::getStoredPath (const Identifier& key, DependencyPathOS os)\r
-{\r
-    auto tree = (os == TargetOS::getThisOS() ? projectDefaults\r
-                                             : fallbackPaths.getOrCreateChildWithName (identifierForOS (os), nullptr));\r
-\r
-    return { tree, key, nullptr, getFallbackPathForOS (key, os) };\r
-}\r
index 0871b470e13629baddd94cbdb9f5bf988743bcae..26435b858bac4b0bca6a6e953975a6a57b61ac74 100644 (file)
@@ -61,19 +61,36 @@ public:
         void setSwatchColour (int index, const Colour& newColour) override;\r
     };\r
 \r
-    //==============================================================================\r
-    ValueWithDefault getStoredPath (const Identifier& key, DependencyPathOS os);\r
-\r
-    bool shouldAskUserToSetJUCEPath() noexcept;\r
-    void setDontAskAboutJUCEPathAgain() noexcept;\r
-\r
     //==============================================================================\r
     AppearanceSettings appearance;\r
     StringArray monospacedFontNames;\r
     File lastWizardFolder;\r
 \r
-private:\r
     //==============================================================================\r
+    Value getStoredPath (const Identifier& key);\r
+    Value getFallbackPathForOS (const Identifier& key, DependencyPathOS);\r
+\r
+    bool isGlobalPathValid (const File& relativeTo, const Identifier& key, const String& path) const noexcept;\r
+\r
+    //==============================================================================\r
+    bool shouldAskUserToSetJUCEPath() noexcept;\r
+    void setDontAskAboutJUCEPathAgain() noexcept;\r
+\r
+private:\r
+    OwnedArray<PropertiesFile> propertyFiles;\r
+    ValueTree projectDefaults;\r
+    ValueTree fallbackPaths;\r
+\r
+    void changed (bool isProjectDefaults)\r
+    {\r
+        std::unique_ptr<XmlElement> data (isProjectDefaults ? projectDefaults.createXml()\r
+                                                            : fallbackPaths.createXml());\r
+\r
+        propertyFiles.getUnchecked (0)->setValue (isProjectDefaults ? "PROJECT_DEFAULT_SETTINGS"\r
+                                                                    : "FALLBACK_PATHS",\r
+                                                  data.get());\r
+    }\r
+\r
     void updateGlobalPreferences();\r
     void updateRecentFiles();\r
     void updateLastWizardFolder();\r
@@ -86,20 +103,12 @@ private:
     void checkJUCEPaths();\r
 \r
     //==============================================================================\r
-    void changed (bool);\r
-\r
     void valueTreePropertyChanged (ValueTree& vt, const Identifier&) override  { changed (vt == projectDefaults); }\r
     void valueTreeChildAdded (ValueTree& vt, ValueTree&) override              { changed (vt == projectDefaults); }\r
     void valueTreeChildRemoved (ValueTree& vt, ValueTree&, int) override       { changed (vt == projectDefaults); }\r
     void valueTreeChildOrderChanged (ValueTree& vt, int, int) override         { changed (vt == projectDefaults); }\r
     void valueTreeParentChanged (ValueTree& vt) override                       { changed (vt == projectDefaults); }\r
 \r
-    //==============================================================================\r
-    OwnedArray<PropertiesFile> propertyFiles;\r
-    ValueTree projectDefaults;\r
-    ValueTree fallbackPaths;\r
-\r
-    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StoredSettings)\r
 };\r
 \r
index deb7c1f7a76d72e9c7b934aad20dd96c5bb359a9..68b28eca7809b91bb34a2d2afad613025942e8c0 100644 (file)
@@ -99,7 +99,7 @@ namespace CodeHelpers
         words.addTokens (s.retainCharacters (allowedChars), false);\r
         words.trim();\r
 \r
-        auto n = words[0];\r
+        String n (words[0]);\r
 \r
         if (capitalise)\r
             n = n.toLowerCase();\r
@@ -176,7 +176,7 @@ namespace CodeHelpers
         {\r
             for (int i = 0; i < lines.size(); ++i)\r
             {\r
-                auto& line = lines.getReference (i);\r
+                String& line = lines.getReference (i);\r
 \r
                 if (line.length() > maxLineLength)\r
                 {\r
@@ -259,7 +259,7 @@ namespace CodeHelpers
             #define COL(col)  #col,\r
             #include "jucer_Colours.h"\r
             #undef COL\r
-            nullptr\r
+            0\r
         };\r
 \r
         for (int i = 0; i < numElementsInArray (colourNames) - 1; ++i)\r
@@ -301,7 +301,7 @@ namespace CodeHelpers
     {\r
         const int maxCharsOnLine = 250;\r
 \r
-        auto data = (const unsigned char*) mb.getData();\r
+        const unsigned char* data = (const unsigned char*) mb.getData();\r
         int charsOnLine = 0;\r
 \r
         bool canUseStringLiteral = mb.getSize() < 32768; // MS compilers can't handle big string literals..\r
@@ -312,8 +312,7 @@ namespace CodeHelpers
 \r
             for (size_t i = 0; i < mb.getSize(); ++i)\r
             {\r
-                auto num = (unsigned int) data[i];\r
-\r
+                const unsigned int num = (unsigned int) data[i];\r
                 if (! ((num >= 32 && num < 127) || num == '\t' || num == '\r' || num == '\n'))\r
                 {\r
                     if (++numEscaped > mb.getSize() / 4)\r
@@ -331,7 +330,7 @@ namespace CodeHelpers
 \r
             for (size_t i = 0; i < mb.getSize(); ++i)\r
             {\r
-                auto num = (int) (unsigned int) data[i];\r
+                const int num = (int) (unsigned int) data[i];\r
                 out << num << ',';\r
 \r
                 charsOnLine += 2;\r
@@ -365,9 +364,8 @@ namespace CodeHelpers
     //==============================================================================\r
     static unsigned int calculateHash (const String& s, const unsigned int hashMultiplier)\r
     {\r
-        auto t = s.toUTF8();\r
+        const char* t = s.toUTF8();\r
         unsigned int hash = 0;\r
-\r
         while (*t != 0)\r
             hash = hashMultiplier * hash + (unsigned int) *t++;\r
 \r
@@ -380,13 +378,11 @@ namespace CodeHelpers
 \r
         for (;;)\r
         {\r
-            SortedSet<unsigned int> hashes;\r
+            SortedSet <unsigned int> hashes;\r
             bool collision = false;\r
-\r
             for (int i = strings.size(); --i >= 0;)\r
             {\r
-                auto hash = calculateHash (strings[i], v);\r
-\r
+                const unsigned int hash = calculateHash (strings[i], v);\r
                 if (hashes.contains (hash))\r
                 {\r
                     collision = true;\r
@@ -409,12 +405,11 @@ namespace CodeHelpers
                               const StringArray& strings, const StringArray& codeToExecute, const int indentLevel)\r
     {\r
         jassert (strings.size() == codeToExecute.size());\r
-        auto indent = String::repeatedString (" ", indentLevel);\r
-        auto hashMultiplier = findBestHashMultiplier (strings);\r
+        const String indent (String::repeatedString (" ", indentLevel));\r
+        const unsigned int hashMultiplier = findBestHashMultiplier (strings);\r
 \r
         out << indent << "unsigned int hash = 0;" << newLine\r
-            << newLine\r
-            << indent << "if (" << utf8PointerVariable << " != nullptr)" << newLine\r
+            << indent << "if (" << utf8PointerVariable << " != 0)" << newLine\r
             << indent << "    while (*" << utf8PointerVariable << " != 0)" << newLine\r
             << indent << "        hash = " << (int) hashMultiplier << " * hash + (unsigned int) *" << utf8PointerVariable << "++;" << newLine\r
             << newLine\r
@@ -466,8 +461,8 @@ namespace CodeHelpers
         {\r
             pos = pos.movedByLines (-1);\r
 \r
-            auto line = pos.getLineText();\r
-            auto trimmedLine = line.trimStart();\r
+            const String line (pos.getLineText());\r
+            const String trimmedLine (line.trimStart());\r
 \r
             braceCount += getBraceCount (trimmedLine.getCharPointer());\r
 \r
index f0e0d1c639828e3be110461586ce037fc73d32e4..7258b3538225501f8039fc8ac88ebc96c86efff6 100644 (file)
@@ -30,9 +30,9 @@
 //==============================================================================\r
 namespace FileHelpers\r
 {\r
-    static uint64 calculateMemoryHashCode (const void* data, size_t numBytes)\r
+    static int64 calculateMemoryHashCode (const void* data, const size_t numBytes)\r
     {\r
-        uint64 t = 0;\r
+        int64 t = 0;\r
 \r
         for (size_t i = 0; i < numBytes; ++i)\r
             t = t * 65599 + static_cast<const uint8*> (data)[i];\r
@@ -40,9 +40,9 @@ namespace FileHelpers
         return t;\r
     }\r
 \r
-    uint64 calculateStreamHashCode (InputStream& in)\r
+    int64 calculateStreamHashCode (InputStream& in)\r
     {\r
-        uint64 t = 0;\r
+        int64 t = 0;\r
 \r
         const int bufferSize = 4096;\r
         HeapBlock<uint8> buffer;\r
@@ -50,7 +50,7 @@ namespace FileHelpers
 \r
         for (;;)\r
         {\r
-            auto num = in.read (buffer, bufferSize);\r
+            const int num = in.read (buffer, bufferSize);\r
 \r
             if (num <= 0)\r
                 break;\r
@@ -62,7 +62,7 @@ namespace FileHelpers
         return t;\r
     }\r
 \r
-    uint64 calculateFileHashCode (const File& file)\r
+    int64 calculateFileHashCode (const File& file)\r
     {\r
         std::unique_ptr<FileInputStream> stream (file.createInputStream());\r
         return stream != nullptr ? calculateStreamHashCode (*stream) : 0;\r
index be67380bc80ede45df369d7e3441f829f45c4aed..011625ed975eb82676e0722a06314df71db32e8b 100644 (file)
@@ -30,8 +30,8 @@
 //==============================================================================\r
 namespace FileHelpers\r
 {\r
-    uint64 calculateStreamHashCode (InputStream&);\r
-    uint64 calculateFileHashCode (const File&);\r
+    int64 calculateStreamHashCode (InputStream& stream);\r
+    int64 calculateFileHashCode (const File& file);\r
 \r
     bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, size_t numBytes);\r
     bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData);\r
@@ -90,6 +90,5 @@ struct FileModificationDetector
 private:\r
     File file;\r
     Time fileModificationTime;\r
-    uint64 fileHashCode = 0;\r
-    int64 fileSize = -1;\r
+    int64 fileHashCode, fileSize;\r
 };\r
index cd145b64e045665e474bd73960e509800b83c837..bc8ee3ec1b26e6f0a6bbed89bca5c12d51cea250 100644 (file)
@@ -384,73 +384,3 @@ bool isValidJUCEExamplesDirectory (const File& directory) noexcept
 \r
     return directory.getChildFile ("Assets").getChildFile ("juce_icon.png").existsAsFile();\r
 }\r
-\r
-//==============================================================================\r
-static var parseJUCEHeaderMetadata (const StringArray& lines)\r
-{\r
-    auto* o = new DynamicObject();\r
-    var result (o);\r
-\r
-    for (auto& line : lines)\r
-    {\r
-        line = trimCommentCharsFromStartOfLine (line);\r
-\r
-        auto colon = line.indexOfChar (':');\r
-\r
-        if (colon >= 0)\r
-        {\r
-            auto key = line.substring (0, colon).trim();\r
-            auto value = line.substring (colon + 1).trim();\r
-\r
-            o->setProperty (key, value);\r
-        }\r
-    }\r
-\r
-    return result;\r
-}\r
-\r
-static String parseMetadataItem (const StringArray& lines, int& index)\r
-{\r
-    String result = lines[index++];\r
-\r
-    while (index < lines.size())\r
-    {\r
-        auto continuationLine = trimCommentCharsFromStartOfLine (lines[index]);\r
-\r
-        if (continuationLine.isEmpty() || continuationLine.indexOfChar (':') != -1\r
-            || continuationLine.startsWith ("END_JUCE_"))\r
-            break;\r
-\r
-        result += " " + continuationLine;\r
-        ++index;\r
-    }\r
-\r
-    return result;\r
-}\r
-\r
-var parseJUCEHeaderMetadata (const File& file)\r
-{\r
-    StringArray lines;\r
-    file.readLines (lines);\r
-\r
-    for (int i = 0; i < lines.size(); ++i)\r
-    {\r
-        auto trimmedLine = trimCommentCharsFromStartOfLine (lines[i]);\r
-\r
-        if (trimmedLine.startsWith ("BEGIN_JUCE_"))\r
-        {\r
-            StringArray desc;\r
-            auto j = i + 1;\r
-\r
-            while (j < lines.size())\r
-            {\r
-                if (trimCommentCharsFromStartOfLine (lines[j]).startsWith ("END_JUCE_"))\r
-                    return parseJUCEHeaderMetadata (desc);\r
-\r
-                desc.add (parseMetadataItem (lines, j));\r
-            }\r
-        }\r
-    }\r
-\r
-    return {};\r
-}\r
index 0584dc41da0594a77a0c073713c63c23a7addf12..28da5491036bba2de58fdc4739af0551a7025110 100644 (file)
@@ -31,8 +31,6 @@
 const char* getPreferredLinefeed();\r
 String joinLinesIntoSourceFile (StringArray& lines);\r
 \r
-var parseJUCEHeaderMetadata (const File&);\r
-\r
 String trimCommentCharsFromStartOfLine (const String& line);\r
 \r
 String hexString8Digits (int value);\r
index d1a14b1845a3d5bf782d7713237e6825e3080123..7b66a4695eb833e32f7fb6dc9402c9e619bb3fd7 100644 (file)
@@ -68,11 +68,9 @@ namespace Ids
     DECLARE_ID (jucePath);\r
     DECLARE_ID (defaultJuceModulePath);\r
     DECLARE_ID (defaultUserModulePath);\r
-    DECLARE_ID (vstLegacyFolder);\r
     DECLARE_ID (vst3Folder);\r
     DECLARE_ID (rtasFolder);\r
     DECLARE_ID (auFolder);\r
-    DECLARE_ID (vstLegacyPath);\r
     DECLARE_ID (vst3Path);\r
     DECLARE_ID (rtasPath);\r
     DECLARE_ID (aaxPath);\r
@@ -120,18 +118,13 @@ namespace Ids
     DECLARE_ID (auBinaryLocation);\r
     DECLARE_ID (rtasBinaryLocation);\r
     DECLARE_ID (aaxBinaryLocation);\r
-    DECLARE_ID (unityPluginBinaryLocation);\r
     DECLARE_ID (enablePluginBinaryCopyStep);\r
     DECLARE_ID (stripLocalSymbols);\r
     DECLARE_ID (osxSDK);\r
     DECLARE_ID (osxCompatibility);\r
     DECLARE_ID (osxArchitecture);\r
     DECLARE_ID (iosCompatibility);\r
-    DECLARE_ID (xcodeSubprojects);\r
     DECLARE_ID (extraFrameworks);\r
-    DECLARE_ID (frameworkSearchPaths);\r
-    DECLARE_ID (extraCustomFrameworks);\r
-    DECLARE_ID (embeddedFrameworks);\r
     DECLARE_ID (extraDLLs);\r
     DECLARE_ID (winArchitecture);\r
     DECLARE_ID (winWarningLevel);\r
@@ -153,7 +146,6 @@ namespace Ids
     DECLARE_ID (postbuildCommand);\r
     DECLARE_ID (generateManifest);\r
     DECLARE_ID (useRuntimeLibDLL);\r
-    DECLARE_ID (multiProcessorCompilation);\r
     DECLARE_ID (enableIncrementalLinking);\r
     DECLARE_ID (bundleIdentifier);\r
     DECLARE_ID (aaxIdentifier);\r
@@ -225,7 +217,6 @@ namespace Ids
     DECLARE_ID (androidSharedLibraries);\r
     DECLARE_ID (androidScreenOrientation);\r
     DECLARE_ID (androidExtraAssetsFolder);\r
-    DECLARE_ID (androidStudioExePath);\r
     DECLARE_ID (iosDeviceFamily);\r
     const Identifier iPhoneScreenOrientation ("iosScreenOrientation"); // old name is confusing\r
     DECLARE_ID (iPadScreenOrientation);\r
@@ -307,7 +298,6 @@ namespace Ids
     DECLARE_ID (buildRTAS);\r
     DECLARE_ID (buildAAX);\r
     DECLARE_ID (buildStandalone);\r
-    DECLARE_ID (buildUnity);\r
     DECLARE_ID (enableIAA);\r
     DECLARE_ID (pluginName);\r
     DECLARE_ID (pluginDesc);\r
@@ -325,7 +315,6 @@ namespace Ids
     DECLARE_ID (pluginVST3Category);\r
     DECLARE_ID (pluginAUExportPrefix);\r
     DECLARE_ID (pluginAUMainType);\r
-    DECLARE_ID (pluginAUIsSandboxSafe);\r
     DECLARE_ID (pluginRTASCategory);\r
     DECLARE_ID (pluginRTASDisableBypass);\r
     DECLARE_ID (pluginRTASDisableMultiMono);\r
index fa2524b8b69e352f923bdadaa83ae09522d46320..fd4ce588ec2d601c56c70b8c2ba1fead04468334 100644 (file)
@@ -183,7 +183,7 @@ struct TranslationHelpers
         scanFilesForTranslations (strings, project.getMainGroup());\r
 \r
         OwnedArray<LibraryModule> modules;\r
-        project.getEnabledModules().createRequiredModules (modules);\r
+        project.getModules().createRequiredModules (modules);\r
 \r
         for (int j = 0; j < modules.size(); ++j)\r
         {\r
index b473cb7d7c60ca299b610116b2097f38f5c95589..0424f5ffd03c074a86066df78ab51916a92ac84c 100644 (file)
@@ -27,7 +27,6 @@
 #include "../../Application/jucer_Headers.h"\r
 #include "../../ProjectSaving/jucer_ProjectExporter.h"\r
 #include "jucer_PIPGenerator.h"\r
-#include "../../Project/jucer_Module.h"\r
 \r
 //==============================================================================\r
 static String removeEnclosed (const String& input, const String& start, const String& end)\r
@@ -98,11 +97,9 @@ static bool isMobileExporter (const String& exporterName)
 }\r
 \r
 //==============================================================================\r
-PIPGenerator::PIPGenerator (const File& pip, const File& output, const File& jucePath, const Array<File>& userPaths)\r
+PIPGenerator::PIPGenerator (const File& pip, const File& output)\r
     : pipFile (pip),\r
-      juceModulesPath (jucePath),\r
-      userModulesPaths (userPaths),\r
-      metadata (parseJUCEHeaderMetadata (pipFile))\r
+      metadata (parsePIPMetadata())\r
 {\r
     if (output != File())\r
     {\r
@@ -120,12 +117,6 @@ PIPGenerator::PIPGenerator (const File& pip, const File& output, const File& juc
 \r
     outputDirectory = outputDirectory.getChildFile (metadata[Ids::name].toString());\r
     useLocalCopy = metadata[Ids::useLocalCopy].toString().isNotEmpty() || isClipboard;\r
-\r
-    if (! userModulesPaths.isEmpty())\r
-    {\r
-        availableUserModules.reset (new AvailableModuleList());\r
-        availableUserModules->scanPaths (userModulesPaths);\r
-    }\r
 }\r
 \r
 //==============================================================================\r
@@ -138,10 +129,12 @@ Result PIPGenerator::createJucerFile()
     if (result != Result::ok())\r
         return result;\r
 \r
-    addModules     (root);\r
-    addExporters   (root);\r
-    createFiles    (root);\r
-    setModuleFlags (root);\r
+    addModules   (root);\r
+    addExporters (root);\r
+    createFiles  (root);\r
+\r
+    if (! metadata[Ids::moduleFlags].toString().isEmpty())\r
+        setModuleFlags (root);\r
 \r
     auto outputFile = outputDirectory.getChildFile (metadata[Ids::name].toString() + ".jucer");\r
 \r
@@ -149,20 +142,89 @@ Result PIPGenerator::createJucerFile()
 \r
     if (xml->writeToFile (outputFile, {}))\r
         return Result::ok();\r
-\r
-    return Result::fail ("Failed to create .jucer file in " + outputDirectory.getFullPathName());\r
+    else\r
+        return Result::fail ("Failed to create .jucer file in " + outputDirectory.getFullPathName()+ ".");\r
 }\r
 \r
-Result PIPGenerator::createMainCpp()\r
+bool PIPGenerator::createMainCpp()\r
 {\r
     auto outputFile = outputDirectory.getChildFile ("Source").getChildFile ("Main.cpp");\r
 \r
     if (! outputFile.existsAsFile() && (outputFile.create() != Result::ok()))\r
-        return Result::fail ("Failed to create Main.cpp - " + outputFile.getFullPathName());\r
+        return false;\r
 \r
     outputFile.replaceWithText (getMainFileTextForType());\r
 \r
-    return Result::ok();\r
+    return true;\r
+}\r
+\r
+//==============================================================================\r
+var PIPGenerator::parsePIPMetadata (const StringArray& lines)\r
+{\r
+    auto* o = new DynamicObject();\r
+    var result (o);\r
+\r
+    for (auto& line : lines)\r
+    {\r
+        line = trimCommentCharsFromStartOfLine (line);\r
+\r
+        auto colon = line.indexOfChar (':');\r
+\r
+        if (colon >= 0)\r
+        {\r
+            auto key = line.substring (0, colon).trim();\r
+            auto value = line.substring (colon + 1).trim();\r
+\r
+            o->setProperty (key, value);\r
+        }\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+static String parseMetadataItem (const StringArray& lines, int& index)\r
+{\r
+    String result = lines[index++];\r
+\r
+    while (index < lines.size())\r
+    {\r
+        auto continuationLine = trimCommentCharsFromStartOfLine (lines[index]);\r
+\r
+        if (continuationLine.indexOfChar (':') != -1 || continuationLine.startsWith ("END_JUCE_PIP_METADATA"))\r
+            break;\r
+\r
+        result += continuationLine;\r
+        ++index;\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+var PIPGenerator::parsePIPMetadata()\r
+{\r
+    StringArray lines;\r
+    pipFile.readLines (lines);\r
+\r
+    for (int i = 0; i < lines.size(); ++i)\r
+    {\r
+        auto trimmedLine = trimCommentCharsFromStartOfLine (lines[i]);\r
+\r
+        if (trimmedLine.startsWith ("BEGIN_JUCE_PIP_METADATA"))\r
+        {\r
+            StringArray desc;\r
+            auto j = i + 1;\r
+\r
+            while (j < lines.size())\r
+            {\r
+                if (trimCommentCharsFromStartOfLine (lines[j]).startsWith ("END_JUCE_PIP_METADATA"))\r
+                    return parsePIPMetadata (desc);\r
+\r
+                desc.add (parseMetadataItem (lines, j));\r
+            }\r
+        }\r
+    }\r
+\r
+    return {};\r
 }\r
 \r
 //==============================================================================\r
@@ -228,7 +290,7 @@ ValueTree PIPGenerator::createModulePathChild (const String& moduleID)
     ValueTree modulePath (Ids::MODULEPATH);\r
 \r
     modulePath.setProperty (Ids::ID, moduleID, nullptr);\r
-    modulePath.setProperty (Ids::path, getPathForModule (moduleID).getFullPathName(), nullptr);\r
+    modulePath.setProperty (Ids::path, {}, nullptr);\r
 \r
     return modulePath;\r
 }\r
@@ -253,9 +315,9 @@ ValueTree PIPGenerator::createExporterChild (const String& exporterName)
 \r
     if (isMobileExporter (exporterName) || (metadata[Ids::name] == "AUv3SynthPlugin" && exporterName == "XCODE_MAC"))\r
     {\r
-        auto juceDir = getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString();\r
+        auto juceDir = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
 \r
-        if (isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
+        if (juceDir.isNotEmpty() && isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
         {\r
             auto assetsDirectoryPath = File (juceDir).getChildFile ("examples").getChildFile ("Assets").getFullPathName();\r
 \r
@@ -285,7 +347,12 @@ ValueTree PIPGenerator::createExporterChild (const String& exporterName)
         auto modules = StringArray::fromTokens (metadata[Ids::dependencies_].toString(), ",", {});\r
 \r
         for (auto m : modules)\r
-            modulePaths.addChild (createModulePathChild (m.trim()), -1, nullptr);\r
+        {\r
+            m = m.trim();\r
+\r
+            if (isJUCEModule (m))\r
+                modulePaths.addChild (createModulePathChild (m), -1, nullptr);\r
+        }\r
 \r
         exporter.addChild (modulePaths, -1, nullptr);\r
     }\r
@@ -300,7 +367,7 @@ ValueTree PIPGenerator::createModuleChild (const String& moduleID)
     module.setProperty (Ids::ID, moduleID, nullptr);\r
     module.setProperty (Ids::showAllCode, 1, nullptr);\r
     module.setProperty (Ids::useLocalCopy, 0, nullptr);\r
-    module.setProperty (Ids::useGlobalPath, (getPathForModule (moduleID) == File() ? 1 : 0), nullptr);\r
+    module.setProperty (Ids::useGlobalPath, 1, nullptr);\r
 \r
     return module;\r
 }\r
@@ -339,7 +406,12 @@ void PIPGenerator::addModules (ValueTree& jucerTree)
         modules.mergeArray (getModulesRequiredForAudioProcessor());\r
 \r
     for (auto& m : modules)\r
-        modulesTree.addChild (createModuleChild (m.trim()), -1, nullptr);\r
+    {\r
+        m = m.trim();\r
+\r
+        if (isJUCEModule (m))\r
+            modulesTree.addChild (createModuleChild (m), -1, nullptr);\r
+    }\r
 \r
     jucerTree.addChild (modulesTree, -1, nullptr);\r
 }\r
@@ -356,9 +428,9 @@ Result PIPGenerator::setProjectSettings (ValueTree& jucerTree)
 \r
     if (useLocalCopy && isJUCEExample (pipFile))\r
     {\r
-        auto juceDir = getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString();\r
+        auto juceDir = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
 \r
-        if (isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
+        if (juceDir.isNotEmpty() && isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
         {\r
              defines += ((defines.isEmpty() ? "" : " ") + String ("PIP_JUCE_EXAMPLES_DIRECTORY=")\r
                          + Base64::toBase64 (File (juceDir).getChildFile ("examples").getFullPathName()));\r
@@ -388,9 +460,8 @@ Result PIPGenerator::setProjectSettings (ValueTree& jucerTree)
     {\r
         jucerTree.setProperty (Ids::projectType, "audioplug", nullptr);\r
         jucerTree.setProperty (Ids::pluginManufacturer, metadata[Ids::vendor], nullptr);\r
-        jucerTree.setProperty (Ids::pluginAUIsSandboxSafe, "1", nullptr);\r
 \r
-        StringArray pluginFormatsToBuild (Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString());\r
+        StringArray pluginFormatsToBuild (Ids::buildVST.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString());\r
         pluginFormatsToBuild.addArray (getExtraPluginFormatsToBuild());\r
 \r
         jucerTree.setProperty (Ids::pluginFormats, pluginFormatsToBuild.joinIntoString (","), nullptr);\r
@@ -414,10 +485,6 @@ void PIPGenerator::setModuleFlags (ValueTree& jucerTree)
         options.setProperty (name, (value == "1" ? 1 : 0), nullptr);\r
     }\r
 \r
-    if (metadata[Ids::type].toString() == "AudioProcessor"\r
-          && options.getPropertyPointer ("JUCE_VST3_CAN_REPLACE_VST2") == nullptr)\r
-        options.setProperty ("JUCE_VST3_CAN_REPLACE_VST2", 0, nullptr);\r
-\r
     jucerTree.addChild (options, -1, nullptr);\r
 }\r
 \r
@@ -528,18 +595,3 @@ StringArray PIPGenerator::getPluginCharacteristics() const
 \r
     return {};\r
 }\r
-\r
-File PIPGenerator::getPathForModule (const String& moduleID) const\r
-{\r
-    if (isJUCEModule (moduleID))\r
-    {\r
-        if (juceModulesPath != File())\r
-            return juceModulesPath;\r
-    }\r
-    else if (availableUserModules != nullptr)\r
-    {\r
-        return availableUserModules->getModuleWithID (moduleID).second.getParentDirectory();\r
-    }\r
-\r
-    return {};\r
-}\r
index 5a9fa94efe8e73a19f27b918d16261085db2ea8e..2502ff853659cd85da2d1a706793d110c5efb4ba 100644 (file)
@@ -32,8 +32,7 @@
 class PIPGenerator\r
 {\r
 public:\r
-    PIPGenerator (const File& pipFile, const File& outputDirectory = {},\r
-                  const File& pathToJUCEModules = {}, const Array<File>& pathsToUserModules = {});\r
+    PIPGenerator (const File& pipFile, const File& outputDirectory = {});\r
 \r
     //==============================================================================\r
     bool hasValidPIP() const noexcept                   { return ! metadata[Ids::name].toString().isEmpty(); }\r
@@ -46,9 +45,13 @@ public:
 \r
     //==============================================================================\r
     Result createJucerFile();\r
-    Result createMainCpp();\r
+    bool createMainCpp();\r
 \r
 private:\r
+    //==============================================================================\r
+    var parsePIPMetadata (const StringArray& lines);\r
+    var parsePIPMetadata();\r
+\r
     //==============================================================================\r
     void addFileToTree (ValueTree& groupTree, const String& name, bool compile, const String& path);\r
     void createFiles (ValueTree& jucerTree);\r
@@ -74,14 +77,8 @@ private:
     StringArray getExtraPluginFormatsToBuild() const;\r
     StringArray getPluginCharacteristics() const;\r
 \r
-    File getPathForModule (const String&) const;\r
-\r
     //==============================================================================\r
-    File pipFile, outputDirectory, juceModulesPath;\r
-\r
-    Array<File> userModulesPaths;\r
-    std::unique_ptr<AvailableModuleList> availableUserModules;\r
-\r
+    File pipFile, outputDirectory;\r
     var metadata;\r
 \r
     bool isTemp = false;\r
diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp
new file mode 100644 (file)
index 0000000..a72d53f
--- /dev/null
@@ -0,0 +1,280 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2017 - ROLI Ltd.\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+   27th April 2017).\r
+\r
+   End User License Agreement: www.juce.com/juce-5-licence\r
+   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#include "../../../Application/jucer_Headers.h"\r
+#include "jucer_DependencyPathPropertyComponent.h"\r
+\r
+//==============================================================================\r
+DependencyPathValueSource::DependencyPathValueSource (const Value& projectSettingsPath,\r
+                                                      Identifier globalSettingsKey,\r
+                                                      DependencyPathOS osThisSettingAppliesTo)\r
+  : projectSettingsValue (projectSettingsPath),\r
+    globalKey (globalSettingsKey),\r
+    os (osThisSettingAppliesTo),\r
+    globalSettingsValue (getAppSettings().getStoredPath (globalKey)),\r
+    fallbackValue (getAppSettings().getFallbackPathForOS (globalKey, os))\r
+{\r
+    globalSettingsValue.addListener (this);\r
+    fallbackValue.addListener (this);\r
+}\r
+\r
+bool DependencyPathValueSource::isValidPath (const File& relativeTo) const\r
+{\r
+    // if we are on another OS than the one which this path setting is for,\r
+    // we have no way of knowing whether the path is valid - so just assume it is:\r
+    if (! appliesToThisOS())\r
+        return true;\r
+\r
+    return getAppSettings().isGlobalPathValid (relativeTo, globalKey, getValue().toString());\r
+}\r
+\r
+bool DependencyPathValueSource::isValidPath() const\r
+{\r
+    return isValidPath (File::getCurrentWorkingDirectory());\r
+}\r
+\r
+//==============================================================================\r
+DependencyPathPropertyComponent::DependencyPathPropertyComponent (const File& pathRelativeToUse,\r
+                                                                  const Value& value,\r
+                                                                  const String& propertyName)\r
+try : TextPropertyComponent (propertyName, 1024, false),\r
+      pathRelativeTo (pathRelativeToUse),\r
+      pathValue (value),\r
+      pathValueSource (dynamic_cast<DependencyPathValueSource&> (pathValue.getValueSource()))\r
+{\r
+    bool initialValueIsEmpty = ! pathValueSource.isUsingProjectSettings();\r
+\r
+    getValue().referTo (pathValue);\r
+\r
+    // the following step is necessary because the above referTo() has internally called setValue(),\r
+    // which has set the project value to whatever is displayed in the label (this may be the\r
+    // global/fallback value). In this case we have to reset the project value to blank:\r
+    if (initialValueIsEmpty)\r
+        getValue().setValue (String());\r
+\r
+    getValue().addListener (this);\r
+\r
+    if (auto* label = dynamic_cast<Label*> (getChildComponent (0)))\r
+        label->onEditorShow = [this, label] { setEditorText (label); };\r
+    else\r
+        jassertfalse;\r
+\r
+    lookAndFeelChanged();\r
+}\r
+catch (const std::bad_cast&)\r
+{\r
+    // a DependencyPathPropertyComponent must be initialised with a Value\r
+    // that is referring to a DependencyPathValueSource!\r
+    jassertfalse;\r
+    throw;\r
+}\r
+\r
+void DependencyPathPropertyComponent::valueChanged (Value& value)\r
+{\r
+    // this callback handles the update of this setting in case\r
+    // the user changed the global preferences.\r
+    if (value.refersToSameSourceAs (pathValue) && pathValueSource.isUsingGlobalSettings())\r
+        textWasEdited();\r
+}\r
+\r
+void DependencyPathPropertyComponent::textWasEdited()\r
+{\r
+    setColour (textColourId, getTextColourToDisplay());\r
+    TextPropertyComponent::textWasEdited();\r
+}\r
+\r
+Colour DependencyPathPropertyComponent::getTextColourToDisplay() const\r
+{\r
+    if (! pathValueSource.isUsingProjectSettings())\r
+        return pathValueSource.isValidPath (pathRelativeTo) ? findColour (widgetTextColourId).withMultipliedAlpha (0.5f)\r
+                                                            : Colours::red.withMultipliedAlpha (0.5f);\r
+\r
+    return pathValueSource.isValidPath (pathRelativeTo) ? findColour (widgetTextColourId)\r
+                                                        : Colours::red;\r
+}\r
+\r
+void DependencyPathPropertyComponent::setEditorText (Label* label)\r
+{\r
+    if (! pathValueSource.isUsingProjectSettings())\r
+        if (auto editor = label->getCurrentTextEditor())\r
+            editor->setText (String(), dontSendNotification);\r
+}\r
+\r
+void DependencyPathPropertyComponent::lookAndFeelChanged()\r
+{\r
+    textWasEdited();\r
+}\r
+\r
+//==============================================================================\r
+DependencyFilePathPropertyComponent::DependencyFilePathPropertyComponent (Value& value,\r
+                                                                          const String& propertyDescription,\r
+                                                                          bool isDir,\r
+                                                                          const String& wc,\r
+                                                                          const File& rootToUseForRelativePaths)\r
+try : TextPropertyComponent (propertyDescription, 1024, false),\r
+      pathRelativeTo (rootToUseForRelativePaths),\r
+      pathValue (value),\r
+      pathValueSource (dynamic_cast<DependencyPathValueSource&> (pathValue.getValueSource())),\r
+      browseButton ("..."),\r
+      isDirectory (isDir),\r
+      wildcards (wc)\r
+{\r
+    auto initialValueIsEmpty = ! pathValueSource.isUsingProjectSettings();\r
+\r
+    getValue().referTo (pathValue);\r
+\r
+    if (initialValueIsEmpty)\r
+        getValue().setValue (String());\r
+\r
+    getValue().addListener (this);\r
+\r
+    if (auto* label = dynamic_cast<Label*> (getChildComponent (0)))\r
+        label->onEditorShow = [this, label] { setEditorText (label); };\r
+    else\r
+        jassertfalse;\r
+\r
+    setInterestedInFileDrag (false);\r
+\r
+    addAndMakeVisible (browseButton);\r
+    browseButton.onClick = [this] { browse(); };\r
+\r
+    lookAndFeelChanged();\r
+}\r
+catch (const std::bad_cast&)\r
+{\r
+    // a DependencyPathPropertyComponent must be initialised with a Value\r
+    // that is referring to a DependencyPathValueSource!\r
+    jassertfalse;\r
+    throw;\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::resized()\r
+{\r
+    auto bounds = getLookAndFeel().getPropertyComponentContentPosition (*this);\r
+\r
+    browseButton.setBounds (bounds.removeFromRight (30));\r
+    getChildComponent (0)->setBounds (bounds);\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::paintOverChildren (Graphics& g)\r
+{\r
+    if (highlightForDragAndDrop)\r
+    {\r
+        g.setColour (findColour (defaultHighlightColourId).withAlpha (0.5f));\r
+        g.fillRect (getChildComponent (0)->getBounds());\r
+    }\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::filesDropped (const StringArray& files, int, int)\r
+{\r
+    const File firstFile (files[0]);\r
+\r
+    if (isDirectory)\r
+        setTo (firstFile.isDirectory() ? firstFile\r
+                                       : firstFile.getParentDirectory());\r
+    else\r
+        setTo (firstFile);\r
+\r
+    highlightForDragAndDrop = false;\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::setTo (const File& f)\r
+{\r
+    pathValue = (pathRelativeTo == File()) ? f.getFullPathName()\r
+                                           : f.getRelativePathFrom (pathRelativeTo);\r
+\r
+    textWasEdited();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::enablementChanged()\r
+{\r
+    getValue().referTo (isEnabled() ? pathValue\r
+                                    : pathValueSource.appliesToThisOS() ? pathValueSource.getGlobalSettingsValue()\r
+                                                                        : pathValueSource.getFallbackSettingsValue());\r
+    textWasEdited();\r
+    repaint();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::textWasEdited()\r
+{\r
+    setColour (textColourId, getTextColourToDisplay());\r
+    TextPropertyComponent::textWasEdited();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::valueChanged (Value& value)\r
+{\r
+    if ((value.refersToSameSourceAs (pathValue) && pathValueSource.isUsingGlobalSettings())\r
+             || value.refersToSameSourceAs (pathValueSource.getGlobalSettingsValue()))\r
+        textWasEdited();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::setEditorText (Label* label)\r
+{\r
+    if (! pathValueSource.isUsingProjectSettings())\r
+        if (auto editor = label->getCurrentTextEditor())\r
+            editor->setText (String(), dontSendNotification);\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::browse()\r
+{\r
+    auto currentFile = pathRelativeTo.getChildFile (pathValue.toString());\r
+\r
+    if (isDirectory)\r
+    {\r
+        FileChooser chooser ("Select directory", currentFile);\r
+\r
+        if (chooser.browseForDirectory())\r
+            setTo (chooser.getResult());\r
+    }\r
+    else\r
+    {\r
+        FileChooser chooser ("Select file", currentFile, wildcards);\r
+\r
+        if (chooser.browseForFileToOpen())\r
+            setTo (chooser.getResult());\r
+    }\r
+}\r
+\r
+Colour DependencyFilePathPropertyComponent::getTextColourToDisplay() const\r
+{\r
+    auto alpha = 1.0f;\r
+    auto key = pathValueSource.getKey();\r
+    const auto& globalSettingsValue = pathValueSource.getGlobalSettingsValue();\r
+\r
+    if (! pathValueSource.isUsingProjectSettings() && isEnabled())\r
+        alpha = 0.5f;\r
+\r
+    if ((key == Ids::defaultUserModulePath && getValue().toString().contains (";")) || ! pathValueSource.appliesToThisOS())\r
+        return findColour (widgetTextColourId).withMultipliedAlpha (alpha);\r
+\r
+    auto usingGlobalPath = (getValue().refersToSameSourceAs (globalSettingsValue));\r
+\r
+    auto isValidPath = getAppSettings().isGlobalPathValid (pathRelativeTo, key,\r
+                                                           (usingGlobalPath ? globalSettingsValue : pathValue).toString());\r
+\r
+    return isValidPath ? findColour (widgetTextColourId).withMultipliedAlpha (alpha)\r
+                       : Colours::red.withMultipliedAlpha (alpha);\r
+}\r
diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h
new file mode 100644 (file)
index 0000000..9bcc340
--- /dev/null
@@ -0,0 +1,238 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2017 - ROLI Ltd.\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+   27th April 2017).\r
+\r
+   End User License Agreement: www.juce.com/juce-5-licence\r
+   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#pragma once\r
+\r
+\r
+//==============================================================================\r
+/** This ValueSource type implements the fallback logic required for dependency\r
+    path settings: use the project exporter value; if this is empty, fall back to\r
+    the global preference value; if the exporter is supposed to run on another\r
+    OS and we don't know what the global preferences on that other machine are,\r
+    fall back to a generic OS-specific fallback value.\r
+*/\r
+class DependencyPathValueSource : public Value::ValueSource,\r
+                                  private Value::Listener\r
+{\r
+public:\r
+    DependencyPathValueSource (const Value& projectSettingsPath,\r
+                               Identifier globalSettingsKey,\r
+                               DependencyPathOS osThisSettingAppliesTo);\r
+\r
+    /** This gets the currently used value, which may be either\r
+        the project setting, the global setting, or the fallback value. */\r
+    var getValue() const override\r
+    {\r
+        if (isUsingProjectSettings())\r
+            return projectSettingsValue.getValue();\r
+\r
+        if (isUsingGlobalSettings())\r
+            return globalSettingsValue.getValue();\r
+\r
+        return fallbackValue.getValue();\r
+    }\r
+\r
+    void setValue (const var& newValue) override\r
+    {\r
+        projectSettingsValue = newValue;\r
+\r
+        if (isUsingProjectSettings())\r
+            sendChangeMessage (false);\r
+    }\r
+\r
+    bool isUsingProjectSettings() const\r
+    {\r
+        return projectSettingsValueIsValid();\r
+    }\r
+\r
+    bool isUsingGlobalSettings() const\r
+    {\r
+        return ! projectSettingsValueIsValid() && globalSettingsValueIsValid();\r
+    }\r
+\r
+    bool isUsingFallbackValue() const\r
+    {\r
+        return ! projectSettingsValueIsValid() && ! globalSettingsValueIsValid();\r
+    }\r
+\r
+    bool appliesToThisOS() const\r
+    {\r
+        return os == TargetOS::getThisOS();\r
+    }\r
+\r
+    bool isValidPath (const File& relativeTo) const;\r
+\r
+    bool isValidPath() const;\r
+\r
+    Identifier getKey()                   { return globalKey; }\r
+\r
+    Value getGlobalSettingsValue()        { return globalSettingsValue; }\r
+    Value getFallbackSettingsValue()      { return fallbackValue; }\r
+\r
+private:\r
+    void valueChanged (Value& value) override\r
+    {\r
+        if ((value.refersToSameSourceAs (globalSettingsValue) && isUsingGlobalSettings())\r
+                || (value.refersToSameSourceAs (fallbackValue) && isUsingFallbackValue()))\r
+        {\r
+            sendChangeMessage (true);\r
+            setValue (String()); // make sure that the project-specific value is still blank\r
+        }\r
+    }\r
+\r
+    /** This defines when to use the project setting, and when to\r
+        consider it invalid and to fall back to the global setting or\r
+        the fallback value. */\r
+    bool projectSettingsValueIsValid() const\r
+    {\r
+        return ! projectSettingsValue.toString().isEmpty();\r
+    }\r
+\r
+    /** This defines when to use the global setting - given the project setting\r
+        is invalid, and when to fall back to the fallback value instead. */\r
+    bool globalSettingsValueIsValid() const\r
+    {\r
+        // only use the global settings if they are set on the same OS\r
+        // that this setting is for!\r
+        DependencyPathOS thisOS = TargetOS::getThisOS();\r
+\r
+        return thisOS == TargetOS::unknown ? false : os == thisOS;\r
+    }\r
+\r
+    /** the dependency path setting as set in this Projucer project. */\r
+    Value projectSettingsValue;\r
+\r
+    /** the global key used in the application settings for the global setting value.\r
+        needed for checking whether the path is valid. */\r
+    Identifier globalKey;\r
+\r
+    /** on what operating system should this dependency path be used?\r
+     note that this is *not* the os that is targeted by the project,\r
+     but rather the os on which the project will be compiled\r
+     (= on which the path settings need to be set correctly). */\r
+    DependencyPathOS os;\r
+\r
+    /** the dependency path global setting on this machine.\r
+        used when there value set for this project is invalid. */\r
+    Value globalSettingsValue;\r
+\r
+    /** the dependency path fallback setting. used instead of the global setting\r
+        whenever the latter doesn't apply, e.g. the setting is for another\r
+        OS than the ome this machine is running. */\r
+    Value fallbackValue;\r
+};\r
+\r
+\r
+//==============================================================================\r
+class DependencyPathPropertyComponent : public TextPropertyComponent,\r
+                                        private Value::Listener\r
+{\r
+public:\r
+    DependencyPathPropertyComponent (const File& pathRelativeToUse,\r
+                                     const Value& value,\r
+                                     const String& propertyName);\r
+\r
+\r
+private:\r
+    /** This function defines what colour the label text should assume\r
+        depending on the current state of the value the component tracks. */\r
+    Colour getTextColourToDisplay() const;\r
+\r
+    /** This function handles path changes because of user input. */\r
+    void textWasEdited() override;\r
+\r
+    /** This function handles path changes because the global path changed. */\r
+    void valueChanged (Value& value) override;\r
+\r
+    /** If the dependency path is relative, relative to which directory should\r
+        we check if an object is available. */\r
+    File pathRelativeTo;\r
+\r
+    /** the value that represents this dependency path setting. */\r
+    Value pathValue;\r
+\r
+    /** a reference to the value source that this value refers to. */\r
+    DependencyPathValueSource& pathValueSource;\r
+\r
+    void setEditorText (Label* label);\r
+\r
+    void lookAndFeelChanged() override;\r
+\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DependencyPathPropertyComponent)\r
+};\r
+\r
+//==============================================================================\r
+class DependencyFilePathPropertyComponent    : public TextPropertyComponent,\r
+                                               public FileDragAndDropTarget,\r
+                                               private Value::Listener\r
+{\r
+public:\r
+    DependencyFilePathPropertyComponent (Value& value,\r
+                                         const String& propertyDescription,\r
+                                         bool isDirectory,\r
+                                         const String& wildcards = "*",\r
+                                         const File& rootToUseForRelativePaths = File());\r
+\r
+    void resized() override;\r
+    void paintOverChildren (Graphics& g) override;\r
+\r
+    bool isInterestedInFileDrag (const StringArray&) override     { return isEnabled(); }\r
+    void fileDragEnter (const StringArray&, int, int) override    { highlightForDragAndDrop = true;  repaint(); }\r
+    void fileDragExit (const StringArray&) override               { highlightForDragAndDrop = false; repaint(); }\r
+    void filesDropped (const StringArray&, int, int) override;\r
+\r
+    void setTo (const File& f);\r
+\r
+    void enablementChanged() override;\r
+\r
+private:\r
+    void textWasEdited() override;\r
+\r
+    void valueChanged (Value&) override;\r
+\r
+    void setEditorText (Label* label);\r
+\r
+    void lookAndFeelChanged() override\r
+    {\r
+        browseButton.setColour (TextButton::buttonColourId,\r
+                                findColour (secondaryButtonBackgroundColourId));\r
+        textWasEdited();\r
+    }\r
+\r
+    void browse();\r
+    Colour getTextColourToDisplay() const;\r
+\r
+    //==========================================================================\r
+    File pathRelativeTo;\r
+    Value pathValue;\r
+    DependencyPathValueSource& pathValueSource;\r
+\r
+    TextButton browseButton;\r
+    bool isDirectory, highlightForDragAndDrop = false;\r
+    String wildcards;\r
+\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DependencyFilePathPropertyComponent)\r
+};\r
index ed558a21c2260c0aaadcf02561588124cef8692a..26eb88ea65f64848d2bb3dc1a2c651e95eed1d7e 100644 (file)
 \r
 \r
 //==============================================================================\r
-/** A PropertyComponent for selecting files or folders.\r
-\r
-    The user may drag files over the property box, enter the path manually and/or click\r
-    the '...' button to open a file selection dialog box.\r
-*/\r
-class FilePathPropertyComponent    : public PropertyComponent,\r
-                                     public FileDragAndDropTarget,\r
-                                     private Value::Listener\r
+class FilePathPropertyComponent  : public PropertyComponent\r
 {\r
 public:\r
-    FilePathPropertyComponent (Value valueToControl, const String& propertyName, bool isDir, bool thisOS = true,\r
-                               const String& wildcardsToUse = "*", const File& relativeRoot = File(), bool multiPath = false)\r
-        : PropertyComponent (propertyName),\r
-          text (valueToControl, propertyName, 1024, false),\r
-          isDirectory (isDir), isThisOS (thisOS), supportsMultiplePaths (multiPath), wildcards (wildcardsToUse), root (relativeRoot)\r
+    /** A Property Component for selecting files or folders.\r
+\r
+        The user may drag files over the property box, enter the path\r
+        manually and/or click the '...' button to open a file selection\r
+        dialog box\r
+    */\r
+    FilePathPropertyComponent (Value valueToControl,\r
+                               const String& propertyDescription,\r
+                               bool isDirectory,\r
+                               const String& wildcards = "*",\r
+                               const File& rootToUseForRelativePaths = File(),\r
+                               const bool supportsMultiplePaths = false)\r
+        : PropertyComponent (propertyDescription),\r
+          innerComp (valueToControl, isDirectory, wildcards, rootToUseForRelativePaths, supportsMultiplePaths)\r
     {\r
-        textValue.referTo (valueToControl);\r
-\r
-        init();\r
-    }\r
-\r
-    /** Displays a default value when no value is specified by the user. */\r
-    FilePathPropertyComponent (ValueWithDefault& valueToControl, const String& propertyName, bool isDir, bool thisOS = true,\r
-                               const String& wildcardsToUse = "*", const File& relativeRoot = File(), bool multiPath = false)\r
-       : PropertyComponent (propertyName),\r
-         text (valueToControl, propertyName, 1024, false),\r
-         isDirectory (isDir), isThisOS (thisOS), supportsMultiplePaths (multiPath), wildcards (wildcardsToUse), root (relativeRoot)\r
-    {\r
-        textValue = valueToControl.getPropertyAsValue();\r
-\r
-        init();\r
+        addAndMakeVisible (innerComp);\r
     }\r
 \r
-    //==============================================================================\r
-    void refresh() override {}\r
+    void refresh() override {} // N/A\r
 \r
-    void resized() override\r
-    {\r
-        auto bounds = getLocalBounds();\r
-\r
-        text.setBounds (bounds.removeFromLeft (jmax (400, bounds.getWidth() - 55)));\r
-        bounds.removeFromLeft (5);\r
-        browseButton.setBounds (bounds);\r
-    }\r
-\r
-    void paintOverChildren (Graphics& g) override\r
+private:\r
+    struct InnerComponent   : public Component,\r
+                              public FileDragAndDropTarget\r
     {\r
-        if (highlightForDragAndDrop)\r
+        InnerComponent (Value v, bool isDir, const String& wc, const File& rt, const bool multiplePaths)\r
+            : value (v),\r
+              isDirectory (isDir),\r
+              highlightForDragAndDrop (false),\r
+              wildcards (wc),\r
+              root (rt),\r
+              button ("..."),\r
+              supportsMultiplePaths (multiplePaths)\r
         {\r
-            g.setColour (findColour (defaultHighlightColourId).withAlpha (0.5f));\r
-            g.fillRect (getLookAndFeel().getPropertyComponentContentPosition (text));\r
-        }\r
-    }\r
+            addAndMakeVisible (textbox);\r
+            textbox.getTextValue().referTo (value);\r
+            textbox.onReturnKey  = [this] { updateEditorColour (textbox); };\r
+            textbox.onFocusLost  = [this] { updateEditorColour (textbox); };\r
 \r
-    //==============================================================================\r
-    bool isInterestedInFileDrag (const StringArray&) override     { return true; }\r
-    void fileDragEnter (const StringArray&, int, int) override    { highlightForDragAndDrop = true;  repaint(); }\r
-    void fileDragExit (const StringArray&) override               { highlightForDragAndDrop = false; repaint(); }\r
+            addAndMakeVisible (button);\r
+            button.onClick = [this] { browse(); };\r
 \r
-    void filesDropped (const StringArray& selectedFiles, int, int) override\r
-    {\r
-        if (supportsMultiplePaths)\r
-        {\r
-            for (auto& f : selectedFiles)\r
-                setTo (f);\r
+            lookAndFeelChanged();\r
         }\r
-        else\r
+\r
+        void paintOverChildren (Graphics& g) override\r
         {\r
-            setTo (selectedFiles[0]);\r
+            if (highlightForDragAndDrop)\r
+            {\r
+                g.setColour (findColour (defaultHighlightColourId).withAlpha (0.5f));\r
+                g.fillRect (textbox.getBounds());\r
+            }\r
         }\r
 \r
-        highlightForDragAndDrop = false;\r
-        repaint();\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    void init()\r
-    {\r
-        textValue.addListener (this);\r
-\r
-        text.setInterestedInFileDrag (false);\r
-        addAndMakeVisible (text);\r
-\r
-        browseButton.onClick = [this] { browse(); };\r
-        addAndMakeVisible (browseButton);\r
-\r
-        lookAndFeelChanged();\r
-    }\r
-\r
-    void setTo (File f)\r
-    {\r
-        if (isDirectory && ! f.isDirectory())\r
-            f = f.getParentDirectory();\r
+        void resized() override\r
+        {\r
+            juce::Rectangle<int> r (getLocalBounds());\r
 \r
-        auto pathName = (root == File()) ? f.getFullPathName()\r
-                                         : f.getRelativePathFrom (root);\r
+            button.setBounds (r.removeFromRight (30));\r
+            textbox.setBounds (r);\r
+        }\r
 \r
-        auto currentPath = text.getText();\r
+        bool isInterestedInFileDrag (const StringArray&) override   { return true; }\r
+        void fileDragEnter (const StringArray&, int, int) override  { highlightForDragAndDrop = true;  repaint(); }\r
+        void fileDragExit (const StringArray&) override             { highlightForDragAndDrop = false; repaint(); }\r
 \r
-        if (supportsMultiplePaths && currentPath.isNotEmpty())\r
-            pathName = currentPath.trimCharactersAtEnd (" ;") + "; " + pathName;\r
+        void filesDropped (const StringArray& files, int, int) override\r
+        {\r
+            const File firstFile (files[0]);\r
 \r
-        text.setText (pathName);\r
-        updateEditorColour();\r
-    }\r
+            if (isDirectory)\r
+                setTo (firstFile.isDirectory() ? firstFile\r
+                                               : firstFile.getParentDirectory());\r
+            else\r
+                setTo (firstFile);\r
 \r
-    void browse()\r
-    {\r
-        File currentFile = {};\r
-\r
-        if (text.getText().isNotEmpty())\r
-            currentFile = root.getChildFile (text.getText());\r
+            highlightForDragAndDrop = false;\r
+            repaint();\r
+        }\r
 \r
-        if (isDirectory)\r
+        void browse()\r
         {\r
-            FileChooser chooser ("Select directory", currentFile);\r
-\r
-            if (chooser.browseForDirectory())\r
-                setTo (chooser.getResult());\r
+            auto currentFile = root.getChildFile (value.toString());\r
+\r
+            if (isDirectory)\r
+            {\r
+                FileChooser chooser ("Select directory", currentFile);\r
+\r
+                if (chooser.browseForDirectory())\r
+                    setTo (chooser.getResult());\r
+            }\r
+            else\r
+            {\r
+                FileChooser chooser ("Select file", currentFile, wildcards);\r
+\r
+                if (chooser.browseForFileToOpen())\r
+                    setTo (chooser.getResult());\r
+            }\r
         }\r
-        else\r
-        {\r
-            FileChooser chooser ("Select file", currentFile, wildcards);\r
 \r
-            if (chooser.browseForFileToOpen())\r
-                setTo (chooser.getResult());\r
+        void updateEditorColour (TextEditor& editor)\r
+        {\r
+            if (supportsMultiplePaths)\r
+            {\r
+                auto paths = StringArray::fromTokens (editor.getTextValue().toString(), ";", {});\r
+\r
+                editor.clear();\r
+\r
+                AttributedString str;\r
+                for (auto p : paths)\r
+                {\r
+                    if (root.getChildFile (p.trim()).exists())    editor.setColour (TextEditor::textColourId, findColour (widgetTextColourId));\r
+                    else                                          editor.setColour (TextEditor::textColourId, Colours::red);\r
+\r
+                    editor.insertTextAtCaret (p);\r
+\r
+                    if (paths.indexOf (p) < paths.size() - 1)\r
+                    {\r
+                        editor.setColour (TextEditor::textColourId, findColour (widgetTextColourId));\r
+                        editor.insertTextAtCaret (";");\r
+                    }\r
+                }\r
+\r
+                editor.setColour (TextEditor::textColourId, findColour (widgetTextColourId));\r
+            }\r
+            else\r
+            {\r
+                auto pathToCheck = editor.getTextValue().toString();\r
+\r
+                //android SDK/NDK paths\r
+                if (pathToCheck.contains ("${user.home}"))\r
+                    pathToCheck = pathToCheck.replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
+\r
+               #if JUCE_WINDOWS\r
+                if (pathToCheck.startsWith ("~"))\r
+                    pathToCheck = pathToCheck.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
+               #endif\r
+\r
+                const auto currentFile = root.getChildFile (pathToCheck);\r
+\r
+                if (currentFile.exists())\r
+                    editor.applyColourToAllText (findColour (widgetTextColourId));\r
+                else\r
+                    editor.applyColourToAllText (Colours::red);\r
+            }\r
         }\r
-    }\r
 \r
-    void updateEditorColour()\r
-    {\r
-        if (supportsMultiplePaths || ! isThisOS)\r
-            return;\r
-\r
-        text.setColour (TextPropertyComponent::textColourId, findColour (widgetTextColourId));\r
-\r
-        auto pathToCheck = text.getText();\r
-\r
-        if (pathToCheck.isNotEmpty())\r
+        void setTo (const File& f)\r
         {\r
-            pathToCheck.replace ("${user.home}", "~");\r
+            auto pathName = (root == File()) ? f.getFullPathName()\r
+                                             : f.getRelativePathFrom (root);\r
 \r
-           #if JUCE_WINDOWS\r
-            if (pathToCheck.startsWith ("~"))\r
-                pathToCheck = pathToCheck.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
-           #endif\r
+            if (supportsMultiplePaths && value.toString().isNotEmpty())\r
+                value = value.toString().trimCharactersAtEnd (" ;") + "; " + pathName;\r
+            else\r
+                value = pathName;\r
 \r
-            if (! root.getChildFile (pathToCheck).exists())\r
-                text.setColour (TextPropertyComponent::textColourId, Colours::red);\r
+            updateEditorColour (textbox);\r
         }\r
-    }\r
-\r
-    void valueChanged (Value&) override\r
-    {\r
-        updateEditorColour();\r
-    }\r
 \r
-    void lookAndFeelChanged() override\r
-    {\r
-        browseButton.setColour (TextButton::buttonColourId, findColour (secondaryButtonBackgroundColourId));\r
-        browseButton.setColour (TextButton::textColourOffId, Colours::white);\r
+        void lookAndFeelChanged() override\r
+        {\r
+            textbox.setColour (TextEditor::backgroundColourId, findColour (widgetBackgroundColourId));\r
+            textbox.setColour (TextEditor::outlineColourId, Colours::transparentBlack);\r
+            updateEditorColour (textbox);\r
 \r
-        updateEditorColour();\r
-    }\r
+            button.setColour (TextButton::buttonColourId, findColour (secondaryButtonBackgroundColourId));\r
+            button.setColour (TextButton::textColourOffId, Colours::white);\r
+        }\r
 \r
-    //==============================================================================\r
-    Value textValue;\r
+        Value value;\r
+        bool isDirectory, highlightForDragAndDrop;\r
+        String wildcards;\r
+        File root;\r
+        TextEditor textbox;\r
+        TextButton button;\r
+        bool supportsMultiplePaths;\r
 \r
-    TextPropertyComponent text;\r
-    TextButton browseButton { "..." };\r
+        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerComponent)\r
+    };\r
 \r
-    bool isDirectory, isThisOS, supportsMultiplePaths, highlightForDragAndDrop = false;\r
-    String wildcards;\r
-    File root;\r
+    InnerComponent innerComp;  // Used so that the PropertyComponent auto first-child positioning works\r
 \r
-    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FilePathPropertyComponent)\r
 };\r
diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h
deleted file mode 100644 (file)
index a9c0948..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-\r
-//==============================================================================\r
-class LabelPropertyComponent  : public PropertyComponent\r
-{\r
-public:\r
-    LabelPropertyComponent (const String& labelText, int propertyHeight = 25,\r
-                            Font labelFont = Font (16.0f, Font::bold),\r
-                            Justification labelJustification = Justification::centred)\r
-        : PropertyComponent (labelText),\r
-          labelToDisplay ({}, labelText)\r
-    {\r
-        setPreferredHeight (propertyHeight);\r
-\r
-        labelToDisplay.setJustificationType (labelJustification);\r
-        labelToDisplay.setFont (labelFont);\r
-\r
-        addAndMakeVisible (labelToDisplay);\r
-        setLookAndFeel (&lf);\r
-    }\r
-\r
-    ~LabelPropertyComponent()    { setLookAndFeel (nullptr); }\r
-\r
-    //==============================================================================\r
-    void refresh() override {}\r
-\r
-    void resized() override\r
-    {\r
-        labelToDisplay.setBounds (getLocalBounds());\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    struct LabelLookAndFeel : public ProjucerLookAndFeel\r
-    {\r
-        void drawPropertyComponentLabel (Graphics&, int, int, PropertyComponent&) {}\r
-    };\r
-\r
-    void lookAndFeelChanged() override\r
-    {\r
-        labelToDisplay.setColour (Label::textColourId, ProjucerApplication::getApp().lookAndFeel.findColour (defaultTextColourId));\r
-    }\r
-\r
-    //==============================================================================\r
-    LabelLookAndFeel lf;\r
-    Label labelToDisplay;\r
-};\r
index 0726f3f74a1ff33807ebee7145c89964e9b93da9..2aeebece1d6318e63e6a2a7079c26786b47de685 100644 (file)
@@ -41,6 +41,8 @@ void ProjucerLookAndFeel::drawTabButton (TabBarButton& button, Graphics& g, bool
     const auto area = button.getActiveArea();\r
     auto backgroundColour = findColour (button.isFrontTab() ? secondaryBackgroundColourId\r
                                                             : inactiveTabBackgroundColourId);\r
+    auto iconColour = findColour (button.isFrontTab() ? activeTabIconColourId\r
+                                                      : inactiveTabIconColourId);\r
 \r
     g.setColour (backgroundColour);\r
     g.fillRect (area);\r
@@ -48,9 +50,6 @@ void ProjucerLookAndFeel::drawTabButton (TabBarButton& button, Graphics& g, bool
     const auto alpha = button.isEnabled() ? ((isMouseOver || isMouseDown) ? 1.0f : 0.8f) : 0.3f;\r
 \r
    #ifndef BUILDING_JUCE_COMPILEENGINE\r
-    auto iconColour = findColour (button.isFrontTab() ? activeTabIconColourId\r
-                                                      : inactiveTabIconColourId);\r
-\r
     if (button.getName() == "Project")\r
     {\r
         auto icon = Icon (getIcons().closedFolder, iconColour.withMultipliedAlpha (alpha));\r
index 51c3e1fe03cd4358fba9021aac03a169cadcff80..7db905a7202454692b00087a02eb4dd0967bb531 100644 (file)
@@ -139,8 +139,6 @@ struct NewProjectWizard
             if (! initialiseProject (*project))\r
                 return nullptr;\r
 \r
-            project->getConfigFlag ("JUCE_STRICT_REFCOUNTEDPOINTER") = true;\r
-\r
             addExporters (*project, wc);\r
             addDefaultModules (*project, useGlobalPath);\r
 \r
@@ -182,14 +180,14 @@ struct NewProjectWizard
 \r
     void addDefaultModules (Project& project, bool useGlobalPath)\r
     {\r
-        auto defaultModules = getDefaultModules();\r
+        StringArray mods (getDefaultModules());\r
 \r
-        AvailableModuleList list;\r
-        list.scanPaths ({ modulesFolder });\r
+        ModuleList list;\r
+        list.addAllModulesInFolder (modulesFolder);\r
 \r
-        for (auto& mod : list.getAllModules())\r
-            if (defaultModules.contains (mod.first))\r
-                project.getEnabledModules().addModule (mod.second, false, useGlobalPath, false);\r
+        for (int i = 0; i < mods.size(); ++i)\r
+            if (const ModuleDescription* info = list.getModuleWithID (mods[i]))\r
+                project.getModules().addModule (info->moduleFolder, false, useGlobalPath, false);\r
     }\r
 \r
     void addExporters (Project& project, WizardComp& wizardComp)\r
index 9df1483705a1f550dd80257d3e223f813f8f3f45..d002fd84b710246d4418ba1b94c200cd3269c593 100644 (file)
 class ModulesFolderPathBox  : public Component\r
 {\r
 public:\r
-    ModulesFolderPathBox (String initialFileOrDirectory)\r
+    ModulesFolderPathBox (File initialFileOrDirectory)\r
         : currentPathBox ("currentPathBox"),\r
           openFolderButton (TRANS("...")),\r
           modulesLabel (String(), TRANS("Modules Folder") + ":"),\r
           useGlobalPathsToggle ("Use global module path")\r
     {\r
-        if (initialFileOrDirectory.isEmpty())\r
-            initialFileOrDirectory = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString();\r
+        if (initialFileOrDirectory == File())\r
+            initialFileOrDirectory = EnabledModuleList::findGlobalModulesFolder();\r
 \r
         setModulesFolder (initialFileOrDirectory);\r
 \r
@@ -85,7 +85,7 @@ public:
         for (;;)\r
         {\r
             FileChooser fc ("Select your JUCE modules folder...",\r
-                            { getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString() },\r
+                            EnabledModuleList::findGlobalModulesFolder(),\r
                             "*");\r
 \r
             if (! fc.browseForDirectory())\r
@@ -122,7 +122,7 @@ public:
     }\r
 \r
     File modulesFolder;\r
-    bool isUsingGlobalPaths = true;\r
+    bool isUsingGlobalPaths;\r
 \r
 private:\r
     ComboBox currentPathBox;\r
@@ -286,7 +286,7 @@ public:
     WizardComp()\r
         : platformTargets(),\r
           projectName (TRANS("Project name")),\r
-          modulesPathBox (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString())\r
+          modulesPathBox (EnabledModuleList::findGlobalModulesFolder())\r
     {\r
         setOpaque (false);\r
 \r
@@ -405,7 +405,7 @@ public:
             }\r
 \r
 \r
-            wizard->modulesFolder = modulesPathBox.isUsingGlobalPaths ? File (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString())\r
+            wizard->modulesFolder = modulesPathBox.isUsingGlobalPaths ? File (getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString())\r
                                                                       : modulesPathBox.modulesFolder;\r
 \r
             if (! isJUCEModulesFolder (wizard->modulesFolder))\r
@@ -419,7 +419,7 @@ public:
                     return;\r
 \r
                 if (modulesPathBox.isUsingGlobalPaths)\r
-                    getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).setValue (wizard->modulesFolder.getFullPathName(), nullptr);\r
+                    getAppSettings().getStoredPath (Ids::defaultJuceModulePath).setValue (wizard->modulesFolder.getFullPathName());\r
             }\r
 \r
             auto projectDir = fileBrowser.getSelectedFile (0);\r
index b81d28744c1f0e4a7e00d0d7e958d1e395b17aa8..1a94c1433502bfbeed3b9988ffc9503e1387e25b 100644 (file)
@@ -104,8 +104,6 @@ struct AudioPluginAppWizard   : public NewProjectWizard
         sourceGroup.addFileAtIndex (editorCppFile, -1, true);\r
         sourceGroup.addFileAtIndex (editorHFile,   -1, false);\r
 \r
-        project.getConfigFlag ("JUCE_VST3_CAN_REPLACE_VST2") = 0;\r
-\r
         return true;\r
     }\r
 \r
index 3ae5142dd1efe0d1632d69f0fb25134846c2be37..f7e1d174ebdec07b510763bcaab27943c27564dc 100644 (file)
@@ -39,13 +39,15 @@ public:
        : DrawableButton (buttonName, buttonStyle)\r
     {\r
         // svg for thumbnail icon\r
-        auto svg = parseXML (thumbSvg);\r
+        std::unique_ptr<XmlElement> svg (XmlDocument::parse (thumbSvg));\r
         jassert (svg != nullptr);\r
+\r
         thumb.reset (Drawable::createFromSVG (*svg));\r
 \r
         // svg for thumbnail background highlight\r
-        auto backSvg = parseXML (BinaryData::wizard_Highlight_svg);\r
+        std::unique_ptr<XmlElement> backSvg (XmlDocument::parse (BinaryData::wizard_Highlight_svg));\r
         jassert (backSvg != nullptr);\r
+\r
         hoverBackground.reset (Drawable::createFromSVG (*backSvg));\r
 \r
         name = buttonName;\r
index 7e387636cfc99e280eb5c3561a6ae4f983e68552..16b9e77276dcc9f411b5ceae24aaf06a2ed28486 100644 (file)
@@ -35,13 +35,13 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_CONSOLEAPP := UnitTestRunner\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -56,13 +56,13 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native\r
   endif\r
 \r
-  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
-  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+  JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+  JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
   JUCE_TARGET_CONSOLEAPP := UnitTestRunner\r
 \r
   JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
   JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
-  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+  JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
 \r
   CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
 endif\r
@@ -89,13 +89,11 @@ OBJECTS_CONSOLEAPP := \
   $(JUCE_OBJDIR)/include_juce_product_unlocking_8278fcdc.o \\r
   $(JUCE_OBJDIR)/include_juce_video_be78589.o \\r
 \r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
 \r
 all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP)\r
 \r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
-       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
-       @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : check-pkg-config $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
        @echo Linking "UnitTestRunner - ConsoleApp"\r
        -$(V_AT)mkdir -p $(JUCE_BINDIR)\r
        -$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@@ -202,6 +200,10 @@ $(JUCE_OBJDIR)/include_juce_video_be78589.o: ../../JuceLibraryCode/include_juce_
        @echo "Compiling include_juce_video.cpp"\r
        $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<"\r
 \r
+check-pkg-config:\r
+       @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+       @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
 clean:\r
        @echo Cleaning UnitTestRunner\r
        $(V_AT)$(CLEANCMD)\r
index 1f206b26b818c41ef100f91f6692300e775064de..25eacd702bd78e5141b76b6aa3d554f9345775b8 100644 (file)
        };
        objectVersion = 46;
        objects = {
-               9E15F32DCE5118835FF71511 = {
-                       isa = PBXBuildFile;
-                       fileRef = 080EAB9CF5AB2BD6B2BBB173;
-               };
-               A70F7F4891DB1CF67653BE74 = {
-                       isa = PBXBuildFile;
-                       fileRef = B38A1AC42B002115350C0268;
-               };
-               96EFF7BA261F57DD829324D8 = {
-                       isa = PBXBuildFile;
-                       fileRef = 7898C73DCA6FA9D9CF669D32;
-               };
-               6EB1A3B818863EF1787A9CCE = {
-                       isa = PBXBuildFile;
-                       fileRef = 4B427AF10E722F9A362CEB73;
-               };
-               D82BA4D40F5686DAFF5E11FB = {
-                       isa = PBXBuildFile;
-                       fileRef = 99527F36B4484133087435CD;
-               };
-               59004CE43AE081B4A6CE9E17 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1932D54A7FAE13BADBA3E9B5;
-               };
-               AA207299991F85938465BF65 = {
-                       isa = PBXBuildFile;
-                       fileRef = 2030A589A9355FE6A0F72428;
-               };
-               66FC7F44EEC9044E5C4A21C3 = {
-                       isa = PBXBuildFile;
-                       fileRef = C0531453A002C480280C5F05;
-               };
-               0C1B9B95BC99382C313BEABC = {
-                       isa = PBXBuildFile;
-                       fileRef = 8ED5AB2E4E106FB97C033C5B;
-               };
-               8D51903C59161885903F60CC = {
-                       isa = PBXBuildFile;
-                       fileRef = 04C1B8BF62AA09E62B362913;
-               };
-               32010EA67EEFE024B9CE1CB5 = {
-                       isa = PBXBuildFile;
-                       fileRef = B4202EE1243A8FCA29996D05;
-               };
-               263250D6F359CE403B0566FF = {
-                       isa = PBXBuildFile;
-                       fileRef = 8C449538B266A891147103D6;
-               };
-               17A09B4AF453B148CD7349F4 = {
-                       isa = PBXBuildFile;
-                       fileRef = FCB76958E12B2D7F8277CD59;
-               };
-               1A038A2954FB9A4F208BE3F2 = {
-                       isa = PBXBuildFile;
-                       fileRef = F260758DB97CF0F5C85218C1;
-               };
-               4BC57B0D2215621D90C8881C = {
-                       isa = PBXBuildFile;
-                       fileRef = D2EBC6292AE5AFC46EB10DAC;
-               };
-               5FE50792EDC7638DE9A824B5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 5C7BDD8DF72F2FC2D44D757A;
-               };
-               D17BAE3D36BB94FC2C8E2438 = {
-                       isa = PBXBuildFile;
-                       fileRef = 88AA2B9840A6792BBAD559EE;
-               };
-               0DA13944CF8AD7F862DF03E3 = {
-                       isa = PBXBuildFile;
-                       fileRef = 324682B2C8B9B4ACD9711A7A;
-               };
-               BFED026CA071070CEB87CFB5 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4BD792956FE7C22CB8FB691D;
-               };
-               33D24B475EA928745A87EDDB = {
-                       isa = PBXBuildFile;
-                       fileRef = 00CDB93410EA5AECBA5ADA95;
-               };
-               FDDF955477BE7FEBC364E19B = {
-                       isa = PBXBuildFile;
-                       fileRef = A76DD7182C290A9020C96CA7;
-               };
-               74EC8AEC296DB2721EB438BF = {
-                       isa = PBXBuildFile;
-                       fileRef = 3A26A3568F2C301EEED25288;
-               };
-               3822F598DA7044E5DB7633A9 = {
-                       isa = PBXBuildFile;
-                       fileRef = 846E187EC2E797B982861CA4;
-               };
-               1DD34A677AE8AE533BF6DE53 = {
-                       isa = PBXBuildFile;
-                       fileRef = AFF0739E38CAEA8CA14FE733;
-               };
-               9B48039CDFD679AD944BAC70 = {
-                       isa = PBXBuildFile;
-                       fileRef = AB19DDC8458D2A420E6D8AC3;
-               };
-               FC139F56BD13A2C78D21076E = {
-                       isa = PBXBuildFile;
-                       fileRef = 08ED235CBE02E0FB4BE4653E;
-               };
-               5CB3596030B0DD3763CAF85C = {
-                       isa = PBXBuildFile;
-                       fileRef = 302A999B2803C0D5C15D237C;
-               };
-               FD15EF066F019B57F0601D71 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4CA19EC18C2BC536B3636842;
-               };
-               A4C15593F5B4E1BE338F4F63 = {
-                       isa = PBXBuildFile;
-                       fileRef = 3D169C5EFBF6304F5CE4C35E;
-               };
-               A1A39E64F9E03EFFA10B0A10 = {
-                       isa = PBXBuildFile;
-                       fileRef = EECBAA403D2D6AEEA8CB05EB;
-               };
-               D43289CF624A7B068237C192 = {
-                       isa = PBXBuildFile;
-                       fileRef = 583EA0E5C4B75A629AEF1157;
-               };
-               AF1FE82A4A20DCB8944B35C7 = {
-                       isa = PBXBuildFile;
-                       fileRef = 4195CB317C364D778AE2ADB1;
-               };
-               1D06F1A254F84A7AE3E90DF2 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1CA82C74AEC08421812BDCAC;
-               };
-               7164274FE42C7EC423455E05 = {
-                       isa = PBXBuildFile;
-                       fileRef = A59D9064C3A2D7EC3DC45420;
-               };
-               1B09834E81EAF5BCB87FAAF4 = {
-                       isa = PBXBuildFile;
-                       fileRef = B96EC82EC3D2813B50386198;
-               };
-               FD00BAFFDB552AA3EB03B893 = {
-                       isa = PBXBuildFile;
-                       fileRef = 1088318C19CEB1861C58B3BA;
-               };
-               00CDB93410EA5AECBA5ADA95 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_devices.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               04C1B8BF62AA09E62B362913 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMIDI.framework;
-                       path = System/Library/Frameworks/CoreMIDI.framework;
-                       sourceTree = SDKROOT;
-               };
-               05501801BF6C4A47598C59E2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_cryptography";
-                       path = "../../../../modules/juce_cryptography";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               080EAB9CF5AB2BD6B2BBB173 = {
-                       isa = PBXFileReference;
-                       explicitFileType = "compiled.mach-o.executable";
-                       includeInIndex = 0;
-                       path = UnitTestRunner;
-                       sourceTree = "BUILT_PRODUCTS_DIR";
-               };
-               08ED235CBE02E0FB4BE4653E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_cryptography.mm";
-                       path = "../../JuceLibraryCode/include_juce_cryptography.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1088318C19CEB1861C58B3BA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_video.mm";
-                       path = "../../JuceLibraryCode/include_juce_video.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1932D54A7FAE13BADBA3E9B5 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Carbon.framework;
-                       path = System/Library/Frameworks/Carbon.framework;
-                       sourceTree = SDKROOT;
-               };
-               1CA82C74AEC08421812BDCAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_opengl.mm";
-                       path = "../../JuceLibraryCode/include_juce_opengl.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               1DC921E6494548F5E73E1056 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_graphics";
-                       path = "../../../../modules/juce_graphics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2030A589A9355FE6A0F72428 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Cocoa.framework;
-                       path = System/Library/Frameworks/Cocoa.framework;
-                       sourceTree = SDKROOT;
-               };
-               2A163F48282EEE95B8A8BA7A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_extra";
-                       path = "../../../../modules/juce_gui_extra";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2A889138F8B9285E95BDEEE6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_utils";
-                       path = "../../../../modules/juce_audio_utils";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               2C4310E5B49051FC40238E11 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = JuceHeader.h;
-                       path = ../../JuceLibraryCode/JuceHeader.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               302A999B2803C0D5C15D237C = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_data_structures.mm";
-                       path = "../../JuceLibraryCode/include_juce_data_structures.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               31323D62C5754F4248607F0B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_basics";
-                       path = "../../../../modules/juce_audio_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               324682B2C8B9B4ACD9711A7A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_analytics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_analytics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               39F1D4C0BF563E43EA8A98B2 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_devices";
-                       path = "../../../../modules/juce_audio_devices";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3A26A3568F2C301EEED25288 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_processors.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               3D169C5EFBF6304F5CE4C35E = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_events.mm";
-                       path = "../../JuceLibraryCode/include_juce_events.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4195CB317C364D778AE2ADB1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_extra.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4B427AF10E722F9A362CEB73 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVFoundation.framework;
-                       path = System/Library/Frameworks/AVFoundation.framework;
-                       sourceTree = SDKROOT;
-               };
-               4BD792956FE7C22CB8FB691D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               4CA19EC18C2BC536B3636842 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_dsp.mm";
-                       path = "../../JuceLibraryCode/include_juce_dsp.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               583EA0E5C4B75A629AEF1157 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_gui_basics.mm";
-                       path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               5C7BDD8DF72F2FC2D44D757A = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file.nib;
-                       name = RecentFilesMenuTemplate.nib;
-                       path = RecentFilesMenuTemplate.nib;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               748F996DD2778AD1442AECA6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_product_unlocking";
-                       path = "../../../../modules/juce_product_unlocking";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               7898C73DCA6FA9D9CF669D32 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AudioToolbox.framework;
-                       path = System/Library/Frameworks/AudioToolbox.framework;
-                       sourceTree = SDKROOT;
-               };
-               7C4E4601FFB642386AD27B07 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_events";
-                       path = "../../../../modules/juce_events";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8165CEA1A009721D3D05D98F = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_core";
-                       path = "../../../../modules/juce_core";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               846E187EC2E797B982861CA4 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_utils.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               88AA2B9840A6792BBAD559EE = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = Main.cpp;
-                       path = ../../Source/Main.cpp;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8C449538B266A891147103D6 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = IOKit.framework;
-                       path = System/Library/Frameworks/IOKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               8EBA9CF0874619A8FA0B4E74 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_osc";
-                       path = "../../../../modules/juce_osc";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               8ED5AB2E4E106FB97C033C5B = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreMedia.framework;
-                       path = System/Library/Frameworks/CoreMedia.framework;
-                       sourceTree = SDKROOT;
-               };
-               9514F6D920549F8A44B2E332 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_blocks_basics";
-                       path = "../../../../modules/juce_blocks_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               99527F36B4484133087435CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = AVKit.framework;
-                       path = System/Library/Frameworks/AVKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               A40A2A0B2841A622C53047CD = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_processors";
-                       path = "../../../../modules/juce_audio_processors";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A59D9064C3A2D7EC3DC45420 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_osc.cpp";
-                       path = "../../JuceLibraryCode/include_juce_osc.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               A76DD7182C290A9020C96CA7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_audio_formats.mm";
-                       path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AB19DDC8458D2A420E6D8AC3 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_core.mm";
-                       path = "../../JuceLibraryCode/include_juce_core.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               AFF0739E38CAEA8CA14FE733 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.cpp;
-                       name = "include_juce_blocks_basics.cpp";
-                       path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B38A1AC42B002115350C0268 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = Accelerate.framework;
-                       path = System/Library/Frameworks/Accelerate.framework;
-                       sourceTree = SDKROOT;
-               };
-               B4202EE1243A8FCA29996D05 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = DiscRecording.framework;
-                       path = System/Library/Frameworks/DiscRecording.framework;
-                       sourceTree = SDKROOT;
-               };
-               B72A2BF24B6FFD414CD3B1CA = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_video";
-                       path = "../../../../modules/juce_video";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               B96EC82EC3D2813B50386198 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_product_unlocking.mm";
-                       path = "../../JuceLibraryCode/include_juce_product_unlocking.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               BDE2CEC1C2F9C0EA2FDEDEEC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.c.h;
-                       name = AppConfig.h;
-                       path = ../../JuceLibraryCode/AppConfig.h;
-                       sourceTree = "SOURCE_ROOT";
-               };
-               C0531453A002C480280C5F05 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = CoreAudio.framework;
-                       path = System/Library/Frameworks/CoreAudio.framework;
-                       sourceTree = SDKROOT;
-               };
-               CC27F53A76BFB2675D2683A1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_opengl";
-                       path = "../../../../modules/juce_opengl";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D2EBC6292AE5AFC46EB10DAC = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = WebKit.framework;
-                       path = System/Library/Frameworks/WebKit.framework;
-                       sourceTree = SDKROOT;
-               };
-               D3BE73543708D756BDB8AEF7 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_dsp";
-                       path = "../../../../modules/juce_dsp";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D6F54293A21405C783852645 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_audio_formats";
-                       path = "../../../../modules/juce_audio_formats";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D782494D4E433C87913F162D = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_analytics";
-                       path = "../../../../modules/juce_analytics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               D785E7E0304F3CC1E42A3ADF = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_data_structures";
-                       path = "../../../../modules/juce_data_structures";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               DD849A04E38279B842EDE213 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = file;
-                       name = "juce_gui_basics";
-                       path = "../../../../modules/juce_gui_basics";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               EECBAA403D2D6AEEA8CB05EB = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = sourcecode.cpp.objcpp;
-                       name = "include_juce_graphics.mm";
-                       path = "../../JuceLibraryCode/include_juce_graphics.mm";
-                       sourceTree = "SOURCE_ROOT";
-               };
-               F260758DB97CF0F5C85218C1 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = QuartzCore.framework;
-                       path = System/Library/Frameworks/QuartzCore.framework;
-                       sourceTree = SDKROOT;
-               };
-               FCB76958E12B2D7F8277CD59 = {
-                       isa = PBXFileReference;
-                       lastKnownFileType = wrapper.framework;
-                       name = OpenGL.framework;
-                       path = System/Library/Frameworks/OpenGL.framework;
-                       sourceTree = SDKROOT;
-               };
-               9E7E99EBD6772DAF4725435D = {
-                       isa = PBXGroup;
-                       children = (
-                               88AA2B9840A6792BBAD559EE,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               88C22F995571E4A515721154 = {
-                       isa = PBXGroup;
-                       children = (
-                               9E7E99EBD6772DAF4725435D,
-                       );
-                       name = UnitTestRunner;
-                       sourceTree = "<group>";
-               };
-               FE614235C8CE15EFCEB61487 = {
-                       isa = PBXGroup;
-                       children = (
-                               D782494D4E433C87913F162D,
-                               31323D62C5754F4248607F0B,
-                               39F1D4C0BF563E43EA8A98B2,
-                               D6F54293A21405C783852645,
-                               A40A2A0B2841A622C53047CD,
-                               2A889138F8B9285E95BDEEE6,
-                               9514F6D920549F8A44B2E332,
-                               8165CEA1A009721D3D05D98F,
-                               05501801BF6C4A47598C59E2,
-                               D785E7E0304F3CC1E42A3ADF,
-                               D3BE73543708D756BDB8AEF7,
-                               7C4E4601FFB642386AD27B07,
-                               1DC921E6494548F5E73E1056,
-                               DD849A04E38279B842EDE213,
-                               2A163F48282EEE95B8A8BA7A,
-                               CC27F53A76BFB2675D2683A1,
-                               8EBA9CF0874619A8FA0B4E74,
-                               748F996DD2778AD1442AECA6,
-                               B72A2BF24B6FFD414CD3B1CA,
-                       );
-                       name = "JUCE Modules";
-                       sourceTree = "<group>";
-               };
-               3F7D4D52FAA229344338F40C = {
-                       isa = PBXGroup;
-                       children = (
-                               BDE2CEC1C2F9C0EA2FDEDEEC,
-                               324682B2C8B9B4ACD9711A7A,
-                               4BD792956FE7C22CB8FB691D,
-                               00CDB93410EA5AECBA5ADA95,
-                               A76DD7182C290A9020C96CA7,
-                               3A26A3568F2C301EEED25288,
-                               846E187EC2E797B982861CA4,
-                               AFF0739E38CAEA8CA14FE733,
-                               AB19DDC8458D2A420E6D8AC3,
-                               08ED235CBE02E0FB4BE4653E,
-                               302A999B2803C0D5C15D237C,
-                               4CA19EC18C2BC536B3636842,
-                               3D169C5EFBF6304F5CE4C35E,
-                               EECBAA403D2D6AEEA8CB05EB,
-                               583EA0E5C4B75A629AEF1157,
-                               4195CB317C364D778AE2ADB1,
-                               1CA82C74AEC08421812BDCAC,
-                               A59D9064C3A2D7EC3DC45420,
-                               B96EC82EC3D2813B50386198,
-                               1088318C19CEB1861C58B3BA,
-                               2C4310E5B49051FC40238E11,
-                       );
-                       name = "JUCE Library Code";
-                       sourceTree = "<group>";
-               };
-               F31A71A7A7566E4D44B2844C = {
-                       isa = PBXGroup;
-                       children = (
-                               5C7BDD8DF72F2FC2D44D757A,
-                       );
-                       name = Resources;
-                       sourceTree = "<group>";
-               };
-               2055BAFF80DBBC11CF2907C0 = {
-                       isa = PBXGroup;
-                       children = (
-                               B38A1AC42B002115350C0268,
-                               7898C73DCA6FA9D9CF669D32,
-                               4B427AF10E722F9A362CEB73,
-                               99527F36B4484133087435CD,
-                               1932D54A7FAE13BADBA3E9B5,
-                               2030A589A9355FE6A0F72428,
-                               C0531453A002C480280C5F05,
-                               8ED5AB2E4E106FB97C033C5B,
-                               04C1B8BF62AA09E62B362913,
-                               B4202EE1243A8FCA29996D05,
-                               8C449538B266A891147103D6,
-                               FCB76958E12B2D7F8277CD59,
-                               F260758DB97CF0F5C85218C1,
-                               D2EBC6292AE5AFC46EB10DAC,
-                       );
-                       name = Frameworks;
-                       sourceTree = "<group>";
-               };
-               6D697538ADDCFBB6C79AC6C6 = {
-                       isa = PBXGroup;
-                       children = (
-                               080EAB9CF5AB2BD6B2BBB173,
-                       );
-                       name = Products;
-                       sourceTree = "<group>";
-               };
-               99F3717D3FEAFDCA3C22E868 = {
-                       isa = PBXGroup;
-                       children = (
-                               88C22F995571E4A515721154,
-                               FE614235C8CE15EFCEB61487,
-                               3F7D4D52FAA229344338F40C,
-                               F31A71A7A7566E4D44B2844C,
-                               2055BAFF80DBBC11CF2907C0,
-                               6D697538ADDCFBB6C79AC6C6,
-                       );
-                       name = Source;
-                       sourceTree = "<group>";
-               };
-               A81C9C5D3696F83D5E8CFE11 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+
+               9E15F32DCE5118835FF71511 = {isa = PBXBuildFile; fileRef = 080EAB9CF5AB2BD6B2BBB173; };
+               A70F7F4891DB1CF67653BE74 = {isa = PBXBuildFile; fileRef = B38A1AC42B002115350C0268; };
+               96EFF7BA261F57DD829324D8 = {isa = PBXBuildFile; fileRef = 7898C73DCA6FA9D9CF669D32; };
+               6EB1A3B818863EF1787A9CCE = {isa = PBXBuildFile; fileRef = 4B427AF10E722F9A362CEB73; };
+               D82BA4D40F5686DAFF5E11FB = {isa = PBXBuildFile; fileRef = 99527F36B4484133087435CD; };
+               59004CE43AE081B4A6CE9E17 = {isa = PBXBuildFile; fileRef = 1932D54A7FAE13BADBA3E9B5; };
+               AA207299991F85938465BF65 = {isa = PBXBuildFile; fileRef = 2030A589A9355FE6A0F72428; };
+               66FC7F44EEC9044E5C4A21C3 = {isa = PBXBuildFile; fileRef = C0531453A002C480280C5F05; };
+               0C1B9B95BC99382C313BEABC = {isa = PBXBuildFile; fileRef = 8ED5AB2E4E106FB97C033C5B; };
+               8D51903C59161885903F60CC = {isa = PBXBuildFile; fileRef = 04C1B8BF62AA09E62B362913; };
+               32010EA67EEFE024B9CE1CB5 = {isa = PBXBuildFile; fileRef = B4202EE1243A8FCA29996D05; };
+               263250D6F359CE403B0566FF = {isa = PBXBuildFile; fileRef = 8C449538B266A891147103D6; };
+               17A09B4AF453B148CD7349F4 = {isa = PBXBuildFile; fileRef = FCB76958E12B2D7F8277CD59; };
+               1A038A2954FB9A4F208BE3F2 = {isa = PBXBuildFile; fileRef = F260758DB97CF0F5C85218C1; };
+               4BC57B0D2215621D90C8881C = {isa = PBXBuildFile; fileRef = D2EBC6292AE5AFC46EB10DAC; };
+               5FE50792EDC7638DE9A824B5 = {isa = PBXBuildFile; fileRef = 5C7BDD8DF72F2FC2D44D757A; };
+               D17BAE3D36BB94FC2C8E2438 = {isa = PBXBuildFile; fileRef = 88AA2B9840A6792BBAD559EE; };
+               0DA13944CF8AD7F862DF03E3 = {isa = PBXBuildFile; fileRef = 324682B2C8B9B4ACD9711A7A; };
+               BFED026CA071070CEB87CFB5 = {isa = PBXBuildFile; fileRef = 4BD792956FE7C22CB8FB691D; };
+               33D24B475EA928745A87EDDB = {isa = PBXBuildFile; fileRef = 00CDB93410EA5AECBA5ADA95; };
+               FDDF955477BE7FEBC364E19B = {isa = PBXBuildFile; fileRef = A76DD7182C290A9020C96CA7; };
+               74EC8AEC296DB2721EB438BF = {isa = PBXBuildFile; fileRef = 3A26A3568F2C301EEED25288; };
+               3822F598DA7044E5DB7633A9 = {isa = PBXBuildFile; fileRef = 846E187EC2E797B982861CA4; };
+               1DD34A677AE8AE533BF6DE53 = {isa = PBXBuildFile; fileRef = AFF0739E38CAEA8CA14FE733; };
+               9B48039CDFD679AD944BAC70 = {isa = PBXBuildFile; fileRef = AB19DDC8458D2A420E6D8AC3; };
+               FC139F56BD13A2C78D21076E = {isa = PBXBuildFile; fileRef = 08ED235CBE02E0FB4BE4653E; };
+               5CB3596030B0DD3763CAF85C = {isa = PBXBuildFile; fileRef = 302A999B2803C0D5C15D237C; };
+               FD15EF066F019B57F0601D71 = {isa = PBXBuildFile; fileRef = 4CA19EC18C2BC536B3636842; };
+               A4C15593F5B4E1BE338F4F63 = {isa = PBXBuildFile; fileRef = 3D169C5EFBF6304F5CE4C35E; };
+               A1A39E64F9E03EFFA10B0A10 = {isa = PBXBuildFile; fileRef = EECBAA403D2D6AEEA8CB05EB; };
+               D43289CF624A7B068237C192 = {isa = PBXBuildFile; fileRef = 583EA0E5C4B75A629AEF1157; };
+               AF1FE82A4A20DCB8944B35C7 = {isa = PBXBuildFile; fileRef = 4195CB317C364D778AE2ADB1; };
+               1D06F1A254F84A7AE3E90DF2 = {isa = PBXBuildFile; fileRef = 1CA82C74AEC08421812BDCAC; };
+               7164274FE42C7EC423455E05 = {isa = PBXBuildFile; fileRef = A59D9064C3A2D7EC3DC45420; };
+               1B09834E81EAF5BCB87FAAF4 = {isa = PBXBuildFile; fileRef = B96EC82EC3D2813B50386198; };
+               FD00BAFFDB552AA3EB03B893 = {isa = PBXBuildFile; fileRef = 1088318C19CEB1861C58B3BA; };
+               00CDB93410EA5AECBA5ADA95 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+               04C1B8BF62AA09E62B362913 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+               05501801BF6C4A47598C59E2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+               080EAB9CF5AB2BD6B2BBB173 = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UnitTestRunner; sourceTree = "BUILT_PRODUCTS_DIR"; };
+               08ED235CBE02E0FB4BE4653E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+               1088318C19CEB1861C58B3BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+               1932D54A7FAE13BADBA3E9B5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+               1CA82C74AEC08421812BDCAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+               1DC921E6494548F5E73E1056 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+               2030A589A9355FE6A0F72428 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+               2A163F48282EEE95B8A8BA7A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+               2A889138F8B9285E95BDEEE6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+               2C4310E5B49051FC40238E11 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+               302A999B2803C0D5C15D237C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+               31323D62C5754F4248607F0B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+               324682B2C8B9B4ACD9711A7A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               39F1D4C0BF563E43EA8A98B2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+               3A26A3568F2C301EEED25288 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+               3D169C5EFBF6304F5CE4C35E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+               4195CB317C364D778AE2ADB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+               4B427AF10E722F9A362CEB73 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+               4BD792956FE7C22CB8FB691D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               4CA19EC18C2BC536B3636842 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_dsp.mm"; path = "../../JuceLibraryCode/include_juce_dsp.mm"; sourceTree = "SOURCE_ROOT"; };
+               583EA0E5C4B75A629AEF1157 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+               5C7BDD8DF72F2FC2D44D757A = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+               748F996DD2778AD1442AECA6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_product_unlocking"; path = "../../../../modules/juce_product_unlocking"; sourceTree = "SOURCE_ROOT"; };
+               7898C73DCA6FA9D9CF669D32 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+               7C4E4601FFB642386AD27B07 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+               8165CEA1A009721D3D05D98F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+               846E187EC2E797B982861CA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+               88AA2B9840A6792BBAD559EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+               8C449538B266A891147103D6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+               8EBA9CF0874619A8FA0B4E74 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+               8ED5AB2E4E106FB97C033C5B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+               9514F6D920549F8A44B2E332 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_blocks_basics"; path = "../../../../modules/juce_blocks_basics"; sourceTree = "SOURCE_ROOT"; };
+               99527F36B4484133087435CD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+               A40A2A0B2841A622C53047CD = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+               A59D9064C3A2D7EC3DC45420 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+               A76DD7182C290A9020C96CA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+               AB19DDC8458D2A420E6D8AC3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+               AFF0739E38CAEA8CA14FE733 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_blocks_basics.cpp"; path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
+               B38A1AC42B002115350C0268 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+               B4202EE1243A8FCA29996D05 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+               B72A2BF24B6FFD414CD3B1CA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+               B96EC82EC3D2813B50386198 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_product_unlocking.mm"; path = "../../JuceLibraryCode/include_juce_product_unlocking.mm"; sourceTree = "SOURCE_ROOT"; };
+               BDE2CEC1C2F9C0EA2FDEDEEC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+               C0531453A002C480280C5F05 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+               CC27F53A76BFB2675D2683A1 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+               D2EBC6292AE5AFC46EB10DAC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+               D3BE73543708D756BDB8AEF7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_dsp"; path = "../../../../modules/juce_dsp"; sourceTree = "SOURCE_ROOT"; };
+               D6F54293A21405C783852645 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+               D782494D4E433C87913F162D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+               D785E7E0304F3CC1E42A3ADF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+               DD849A04E38279B842EDE213 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+               EECBAA403D2D6AEEA8CB05EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+               F260758DB97CF0F5C85218C1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+               FCB76958E12B2D7F8277CD59 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+               9E7E99EBD6772DAF4725435D = {isa = PBXGroup; children = (
+                                       88AA2B9840A6792BBAD559EE, ); name = Source; sourceTree = "<group>"; };
+               88C22F995571E4A515721154 = {isa = PBXGroup; children = (
+                                       9E7E99EBD6772DAF4725435D, ); name = UnitTestRunner; sourceTree = "<group>"; };
+               FE614235C8CE15EFCEB61487 = {isa = PBXGroup; children = (
+                                       D782494D4E433C87913F162D,
+                                       31323D62C5754F4248607F0B,
+                                       39F1D4C0BF563E43EA8A98B2,
+                                       D6F54293A21405C783852645,
+                                       A40A2A0B2841A622C53047CD,
+                                       2A889138F8B9285E95BDEEE6,
+                                       9514F6D920549F8A44B2E332,
+                                       8165CEA1A009721D3D05D98F,
+                                       05501801BF6C4A47598C59E2,
+                                       D785E7E0304F3CC1E42A3ADF,
+                                       D3BE73543708D756BDB8AEF7,
+                                       7C4E4601FFB642386AD27B07,
+                                       1DC921E6494548F5E73E1056,
+                                       DD849A04E38279B842EDE213,
+                                       2A163F48282EEE95B8A8BA7A,
+                                       CC27F53A76BFB2675D2683A1,
+                                       8EBA9CF0874619A8FA0B4E74,
+                                       748F996DD2778AD1442AECA6,
+                                       B72A2BF24B6FFD414CD3B1CA, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+               3F7D4D52FAA229344338F40C = {isa = PBXGroup; children = (
+                                       BDE2CEC1C2F9C0EA2FDEDEEC,
+                                       324682B2C8B9B4ACD9711A7A,
+                                       4BD792956FE7C22CB8FB691D,
+                                       00CDB93410EA5AECBA5ADA95,
+                                       A76DD7182C290A9020C96CA7,
+                                       3A26A3568F2C301EEED25288,
+                                       846E187EC2E797B982861CA4,
+                                       AFF0739E38CAEA8CA14FE733,
+                                       AB19DDC8458D2A420E6D8AC3,
+                                       08ED235CBE02E0FB4BE4653E,
+                                       302A999B2803C0D5C15D237C,
+                                       4CA19EC18C2BC536B3636842,
+                                       3D169C5EFBF6304F5CE4C35E,
+                                       EECBAA403D2D6AEEA8CB05EB,
+                                       583EA0E5C4B75A629AEF1157,
+                                       4195CB317C364D778AE2ADB1,
+                                       1CA82C74AEC08421812BDCAC,
+                                       A59D9064C3A2D7EC3DC45420,
+                                       B96EC82EC3D2813B50386198,
+                                       1088318C19CEB1861C58B3BA,
+                                       2C4310E5B49051FC40238E11, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+               F31A71A7A7566E4D44B2844C = {isa = PBXGroup; children = (
+                                       5C7BDD8DF72F2FC2D44D757A, ); name = Resources; sourceTree = "<group>"; };
+               2055BAFF80DBBC11CF2907C0 = {isa = PBXGroup; children = (
+                                       B38A1AC42B002115350C0268,
+                                       7898C73DCA6FA9D9CF669D32,
+                                       4B427AF10E722F9A362CEB73,
+                                       99527F36B4484133087435CD,
+                                       1932D54A7FAE13BADBA3E9B5,
+                                       2030A589A9355FE6A0F72428,
+                                       C0531453A002C480280C5F05,
+                                       8ED5AB2E4E106FB97C033C5B,
+                                       04C1B8BF62AA09E62B362913,
+                                       B4202EE1243A8FCA29996D05,
+                                       8C449538B266A891147103D6,
+                                       FCB76958E12B2D7F8277CD59,
+                                       F260758DB97CF0F5C85218C1,
+                                       D2EBC6292AE5AFC46EB10DAC, ); name = Frameworks; sourceTree = "<group>"; };
+               6D697538ADDCFBB6C79AC6C6 = {isa = PBXGroup; children = (
+                                       080EAB9CF5AB2BD6B2BBB173, ); name = Products; sourceTree = "<group>"; };
+               99F3717D3FEAFDCA3C22E868 = {isa = PBXGroup; children = (
+                                       88C22F995571E4A515721154,
+                                       FE614235C8CE15EFCEB61487,
+                                       3F7D4D52FAA229344338F40C,
+                                       F31A71A7A7566E4D44B2844C,
+                                       2055BAFF80DBBC11CF2907C0,
+                                       6D697538ADDCFBB6C79AC6C6, ); name = Source; sourceTree = "<group>"; };
+               A81C9C5D3696F83D5E8CFE11 = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INSTALL_PATH = "/usr/bin";
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
-                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.UnitTestRunner;
-                               PRODUCT_NAME = "UnitTestRunner";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Debug;
-               };
-               962CC7E0A536C3F56DBE1F8F = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Debug; };
+               962CC7E0A536C3F56DBE1F8F = {isa = XCBuildConfiguration; buildSettings = {
                                CLANG_CXX_LANGUAGE_STANDARD = "c++14";
                                CLANG_CXX_LIBRARY = "libc++";
                                CLANG_LINK_OBJC_RUNTIME = NO;
                                        "JucePlugin_Build_AUv3=0",
                                        "JucePlugin_Build_RTAS=0",
                                        "JucePlugin_Build_AAX=0",
-                                       "JucePlugin_Build_Standalone=0",
-                                       "JucePlugin_Build_Unity=0",
-                               );
+                                       "JucePlugin_Build_Standalone=0", );
                                GCC_SYMBOLS_PRIVATE_EXTERN = YES;
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-                               HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
-                                       "$(inherited)",
-                               );
+                               HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
                                INSTALL_PATH = "/usr/bin";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
-                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+                               MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+                               OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
                                PRODUCT_BUNDLE_IDENTIFIER = com.roli.UnitTestRunner;
-                               PRODUCT_NAME = "UnitTestRunner";
-                               USE_HEADERMAP = NO;
-                       };
-                       name = Release;
-               };
-               53146F81C8222491DC6DF2A5 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               SDKROOT_ppc = macosx10.5;
+                               USE_HEADERMAP = NO; }; name = Release; };
+               53146F81C8222491DC6DF2A5 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                ONLY_ACTIVE_ARCH = YES;
                                PRODUCT_NAME = "UnitTestRunner";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Debug;
-               };
-               A5040BB0AC85722F6D54A948 = {
-                       isa = XCBuildConfiguration;
-                       buildSettings = {
+                               ZERO_LINK = NO; }; name = Debug; };
+               A5040BB0AC85722F6D54A948 = {isa = XCBuildConfiguration; buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               CLANG_ENABLE_OBJC_WEAK = YES;
                                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
                                CLANG_WARN_BOOL_CONVERSION = YES;
                                CLANG_WARN_COMMA = YES;
                                CLANG_WARN_CONSTANT_CONVERSION = YES;
-                               CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
                                CLANG_WARN_EMPTY_BODY = YES;
                                CLANG_WARN_ENUM_CONVERSION = YES;
                                CLANG_WARN_INFINITE_RECURSION = YES;
                                CLANG_WARN_INT_CONVERSION = YES;
                                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-                               CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
                                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
                                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
                                CLANG_WARN_STRICT_PROTOTYPES = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                PRODUCT_NAME = "UnitTestRunner";
                                WARNING_CFLAGS = -Wreorder;
-                               ZERO_LINK = NO;
-                       };
-                       name = Release;
-               };
-               E65171E718EA0C7E237860FA = {
-                       isa = PBXTargetDependency;
-                       target = B0D62ED1051EE9DFD49F6321;
-               };
-               18FC121B1014F7999CD135D3 = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               53146F81C8222491DC6DF2A5,
-                               A5040BB0AC85722F6D54A948,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               FCC937D27051A7D36CD9198E = {
-                       isa = XCConfigurationList;
-                       buildConfigurations = (
-                               A81C9C5D3696F83D5E8CFE11,
-                               962CC7E0A536C3F56DBE1F8F,
-                       );
-                       defaultConfigurationIsVisible = 0;
-                       defaultConfigurationName = Debug;
-               };
-               DD4C62A6EA1FD3497B42CDB0 = {
-                       isa = PBXResourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               5FE50792EDC7638DE9A824B5,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               E8585DDC9F9A0EE2FB82FA52 = {
-                       isa = PBXSourcesBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               D17BAE3D36BB94FC2C8E2438,
-                               0DA13944CF8AD7F862DF03E3,
-                               BFED026CA071070CEB87CFB5,
-                               33D24B475EA928745A87EDDB,
-                               FDDF955477BE7FEBC364E19B,
-                               74EC8AEC296DB2721EB438BF,
-                               3822F598DA7044E5DB7633A9,
-                               1DD34A677AE8AE533BF6DE53,
-                               9B48039CDFD679AD944BAC70,
-                               FC139F56BD13A2C78D21076E,
-                               5CB3596030B0DD3763CAF85C,
-                               FD15EF066F019B57F0601D71,
-                               A4C15593F5B4E1BE338F4F63,
-                               A1A39E64F9E03EFFA10B0A10,
-                               D43289CF624A7B068237C192,
-                               AF1FE82A4A20DCB8944B35C7,
-                               1D06F1A254F84A7AE3E90DF2,
-                               7164274FE42C7EC423455E05,
-                               1B09834E81EAF5BCB87FAAF4,
-                               FD00BAFFDB552AA3EB03B893,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               136E27FD16209F9868093A6C = {
-                       isa = PBXFrameworksBuildPhase;
-                       buildActionMask = 2147483647;
-                       files = (
-                               A70F7F4891DB1CF67653BE74,
-                               96EFF7BA261F57DD829324D8,
-                               6EB1A3B818863EF1787A9CCE,
-                               D82BA4D40F5686DAFF5E11FB,
-                               59004CE43AE081B4A6CE9E17,
-                               AA207299991F85938465BF65,
-                               66FC7F44EEC9044E5C4A21C3,
-                               0C1B9B95BC99382C313BEABC,
-                               8D51903C59161885903F60CC,
-                               32010EA67EEFE024B9CE1CB5,
-                               263250D6F359CE403B0566FF,
-                               17A09B4AF453B148CD7349F4,
-                               1A038A2954FB9A4F208BE3F2,
-                               4BC57B0D2215621D90C8881C,
-                       );
-                       runOnlyForDeploymentPostprocessing = 0;
-               };
-               B0D62ED1051EE9DFD49F6321 = {
-                       isa = PBXNativeTarget;
-                       buildConfigurationList = FCC937D27051A7D36CD9198E;
-                       buildPhases = (
-                               DD4C62A6EA1FD3497B42CDB0,
-                               E8585DDC9F9A0EE2FB82FA52,
-                               136E27FD16209F9868093A6C,
-                       );
-                       buildRules = ( );
-                       dependencies = ( );
-                       name = "UnitTestRunner - ConsoleApp";
-                       productName = UnitTestRunner;
-                       productReference = 080EAB9CF5AB2BD6B2BBB173;
-                       productType = "com.apple.product-type.tool";
-               };
-               E1E93F2B4B2D17E011395520 = {
-                       isa = PBXProject;
-                       buildConfigurationList = 18FC121B1014F7999CD135D3;
-                       attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; };
-                       compatibilityVersion = "Xcode 3.2";
-                       hasScannedForEncodings = 0;
-                       mainGroup = 99F3717D3FEAFDCA3C22E868;
-                       projectDirPath = "";
-                       projectRoot = "";
-                       targets = (B0D62ED1051EE9DFD49F6321);
-               };
+                               ZERO_LINK = NO; }; name = Release; };
+               E65171E718EA0C7E237860FA = {isa = PBXTargetDependency; target = B0D62ED1051EE9DFD49F6321; };
+               18FC121B1014F7999CD135D3 = {isa = XCConfigurationList; buildConfigurations = (
+                                       53146F81C8222491DC6DF2A5,
+                                       A5040BB0AC85722F6D54A948, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               FCC937D27051A7D36CD9198E = {isa = XCConfigurationList; buildConfigurations = (
+                                       A81C9C5D3696F83D5E8CFE11,
+                                       962CC7E0A536C3F56DBE1F8F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+               DD4C62A6EA1FD3497B42CDB0 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       5FE50792EDC7638DE9A824B5, ); runOnlyForDeploymentPostprocessing = 0; };
+               E8585DDC9F9A0EE2FB82FA52 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+                                       D17BAE3D36BB94FC2C8E2438,
+                                       0DA13944CF8AD7F862DF03E3,
+                                       BFED026CA071070CEB87CFB5,
+                                       33D24B475EA928745A87EDDB,
+                                       FDDF955477BE7FEBC364E19B,
+                                       74EC8AEC296DB2721EB438BF,
+                                       3822F598DA7044E5DB7633A9,
+                                       1DD34A677AE8AE533BF6DE53,
+                                       9B48039CDFD679AD944BAC70,
+                                       FC139F56BD13A2C78D21076E,
+                                       5CB3596030B0DD3763CAF85C,
+                                       FD15EF066F019B57F0601D71,
+                                       A4C15593F5B4E1BE338F4F63,
+                                       A1A39E64F9E03EFFA10B0A10,
+                                       D43289CF624A7B068237C192,
+                                       AF1FE82A4A20DCB8944B35C7,
+                                       1D06F1A254F84A7AE3E90DF2,
+                                       7164274FE42C7EC423455E05,
+                                       1B09834E81EAF5BCB87FAAF4,
+                                       FD00BAFFDB552AA3EB03B893, ); runOnlyForDeploymentPostprocessing = 0; };
+               136E27FD16209F9868093A6C = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+                                       A70F7F4891DB1CF67653BE74,
+                                       96EFF7BA261F57DD829324D8,
+                                       6EB1A3B818863EF1787A9CCE,
+                                       D82BA4D40F5686DAFF5E11FB,
+                                       59004CE43AE081B4A6CE9E17,
+                                       AA207299991F85938465BF65,
+                                       66FC7F44EEC9044E5C4A21C3,
+                                       0C1B9B95BC99382C313BEABC,
+                                       8D51903C59161885903F60CC,
+                                       32010EA67EEFE024B9CE1CB5,
+                                       263250D6F359CE403B0566FF,
+                                       17A09B4AF453B148CD7349F4,
+                                       1A038A2954FB9A4F208BE3F2,
+                                       4BC57B0D2215621D90C8881C, ); runOnlyForDeploymentPostprocessing = 0; };
+               B0D62ED1051EE9DFD49F6321 = {isa = PBXNativeTarget; buildConfigurationList = FCC937D27051A7D36CD9198E; buildPhases = (
+                                       DD4C62A6EA1FD3497B42CDB0,
+                                       E8585DDC9F9A0EE2FB82FA52,
+                                       136E27FD16209F9868093A6C, ); buildRules = ( ); dependencies = (  ); name = "UnitTestRunner - ConsoleApp"; productName = UnitTestRunner; productReference = 080EAB9CF5AB2BD6B2BBB173; productType = "com.apple.product-type.tool"; };
+               E1E93F2B4B2D17E011395520 = {isa = PBXProject; buildConfigurationList = 18FC121B1014F7999CD135D3; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 99F3717D3FEAFDCA3C22E868; projectDirPath = ""; projectRoot = ""; targets = (B0D62ED1051EE9DFD49F6321); };
        };
        rootObject = E1E93F2B4B2D17E011395520;
 }
index 247c3ab1997f33ecc5ff6e181d826634ed8e5357..c75113679bf0c696c98cc40b494a9a16395b7b19 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{8059D6DB-7FA3-D129-4ADE-B3C1A560027C}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.exe</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\ConsoleApp\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">UnitTestRunner</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
@@ -74,7 +84,6 @@
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <TreatWarningAsError>true</TreatWarningAsError>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
       <WarningLevel>Level4</WarningLevel>\r
       <SuppressStartupBanner>true</SuppressStartupBanner>\r
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
       <TreatWarningAsError>true</TreatWarningAsError>\r
       <LanguageStandard>stdcpp14</LanguageStandard>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
   <ItemGroup>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
index 38bcba2a404282bf6bd058a16ef4176d1b96c5a4..d8d4e2f08762f6936e299034b1d2100fc3de2cfe 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
       <Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
     </None>\r
index 7d4e58bc06728c8675383c83feb380377f85a0a1..059f7a28f81a199eb2d8e10208955c638dbc4bd2 100644 (file)
 //==============================================================================\r
 // juce_audio_devices flags:\r
 \r
-#ifndef    JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 #ifndef    JUCE_ASIO\r
  //#define JUCE_ASIO 0\r
 #endif\r
  //#define JUCE_USE_ANDROID_OPENSLES 0\r
 #endif\r
 \r
+#ifndef    JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 #ifndef    JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
  //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
 #endif\r
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
  //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define   JUCE_STRICT_REFCOUNTEDPOINTER 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_dsp flags:\r
 \r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_USE_CAMERA\r
  //#define JUCE_USE_CAMERA 0\r
 #endif\r
-\r
-#ifndef    JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index b4cfd548cb52fe9996761e80eca0a3fb0fb18b0c..1b515f86a7c5569712ab3141adcbb9ebd45113a9 100644 (file)
@@ -45,7 +45,6 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "UnitTestRunner";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
     const char* const  versionString  = "1.0.0";\r
     const int          versionNumber  = 0x10000;\r
 }\r
index 67c0d9f5c5c6e81c3bd6bf4075612559d8455d25..41511a3c7d2d57360a005a4345f0e896fe392c47 100644 (file)
@@ -48,40 +48,14 @@ class ConsoleUnitTestRunner : public UnitTestRunner
     }\r
 };\r
 \r
-\r
 //==============================================================================\r
-int main (int argc, char **argv)\r
+int main()\r
 {\r
     ConsoleLogger logger;\r
     Logger::setCurrentLogger (&logger);\r
 \r
     ConsoleUnitTestRunner runner;\r
-\r
-    ArgumentList args (argc, argv);\r
-\r
-    if (args.size() == 0)\r
-    {\r
-        runner.runAllTests();\r
-    }\r
-    else\r
-    {\r
-        if (args.containsOption ("--help|-h"))\r
-        {\r
-            std::cout << argv[0] << " [--help|-h] [--category category] [--list-categories]" << std::endl;\r
-            return 0;\r
-        }\r
-\r
-        if (args.containsOption ("--list-categories"))\r
-        {\r
-            for (auto& category : UnitTest::getAllCategories())\r
-                std::cout << category << std::endl;\r
-\r
-            return  0;\r
-        }\r
-\r
-        if (args.containsOption ("--category"))\r
-            runner.runTestsInCategory (args.getArgumentAfterOption ("--category").text);\r
-    }\r
+    runner.runAllTests();\r
 \r
     Logger::setCurrentLogger (nullptr);\r
 \r
index 672f68ef35c4275ae8108d157b78acfe87db4bc9..3665976905e9a0e6c5d6f81e60f0cf8fec175c45 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="Z2Xzcp" name="UnitTestRunner" projectType="consoleapp" bundleIdentifier="com.roli.UnitTestRunner"\r
-              jucerVersion="5.4.1" defines="JUCE_UNIT_TESTS=1" displaySplashScreen="0"\r
+              jucerVersion="5.3.1" defines="JUCE_UNIT_TESTS=1" displaySplashScreen="0"\r
               reportAppUsage="0" companyName="ROLI Ltd." companyCopyright="ROLI Ltd.">\r
   <MAINGROUP id="GZdWCU" name="UnitTestRunner">\r
     <GROUP id="{22894462-E1A9-036F-ED94-B51A50C87552}" name="Source">\r
@@ -9,7 +9,7 @@
     </GROUP>\r
   </MAINGROUP>\r
   <EXPORTFORMATS>\r
-    <XCODE_MAC targetFolder="Builds/MacOSX" extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
+    <XCODE_MAC targetFolder="Builds/MacOSX" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion  -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
                extraDefs="">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" osxCompatibility="10.10 SDK" isDebug="1" targetName="UnitTestRunner"\r
@@ -66,7 +66,7 @@
         <MODULEPATH id="juce_analytics" path="../../modules"/>\r
       </MODULEPATHS>\r
     </LINUX_MAKE>\r
-    <VS2017 targetFolder="Builds/VisualStudio2017" extraCompilerFlags="/w44265 /w45038 /w44062">\r
+    <VS2017 targetFolder="Builds/VisualStudio2017">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="UnitTestRunner" warningsAreErrors="1"/>\r
         <CONFIGURATION name="Release" isDebug="0" targetName="UnitTestRunner" debugInformationFormat="None"\r
             useGlobalPath="0"/>\r
     <MODULES id="juce_video" showAllCode="1" useLocalCopy="0"/>\r
   </MODULES>\r
-  <JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+  <JUCEOPTIONS/>\r
   <LIVE_SETTINGS>\r
     <OSX enableCxx11="1"/>\r
   </LIVE_SETTINGS>\r
index e6bc8bfa6d5ae571ac594c1a92d37520b7b0879f..97696d4e20c2a7c1c3b42d65ac3c36d9ea6236ee 100644 (file)
@@ -15,6 +15,8 @@
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <ProjectGuid>{B636B53B-C44B-1E04-8668-D61B3900BAA4}</ProjectGuid>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
@@ -23,7 +25,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>false</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
                  Label="Configuration">\r
@@ -31,7 +34,8 @@
     <UseOfMfc>false</UseOfMfc>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
     <PlatformToolset>v141</PlatformToolset>\r
-    <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
   <ImportGroup Label="ExtensionSettings"/>\r
             Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
             Label="LocalAppDataPlatform"/>\r
   </ImportGroup>\r
+  <PropertyGroup Label="UserMacros">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+  </PropertyGroup>\r
   <PropertyGroup>\r
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
     <TargetExt>.lib</TargetExt>\r
@@ -51,6 +59,8 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\Static Library\</IntDir>\r
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">juce_dll</TargetName>\r
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <PlatformToolset>v141</PlatformToolset>\r
+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
   </PropertyGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <Midl>\r
@@ -64,7 +74,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader/>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
   <ItemGroup>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
   </ItemGroup>\r
index 627957d5992b7b916e488c98deb80578f3253bd4..f8c344750309dfacc5c71c7a2621fd25504939e9 100644 (file)
     <Filter Include="JUCE Modules\juce_audio_processors\format">\r
       <UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
-      <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
-      <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
-      <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
-      <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
-      <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
-      <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
-      <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
-      <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
-      <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
-      <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
-      <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
-      <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
-      <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
-      <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
-      <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
       <UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\components">\r
       <UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
-      <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
       <UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
-      <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+      <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
       <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
       <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
-      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
-      <Filter>JUCE Modules\juce_core\containers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
       <Filter>JUCE Modules\juce_core\containers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
-      <Filter>JUCE Modules\juce_core\memory</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
       <Filter>JUCE Modules\juce_core\memory</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
-      <Filter>JUCE Modules\juce_core\misc</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
       <Filter>JUCE Modules\juce_core\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
-      <Filter>JUCE Modules\juce_core\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
       <Filter>JUCE Modules\juce_core\native</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
       <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
-      <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
       <Filter>JUCE Modules\juce_events\messages</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
       <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
-      <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
       <Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
-      <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
       <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
-      <Filter>JUCE Modules\juce_video\native</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
       <Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
     </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
-    <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
-      <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
-    </None>\r
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
       <Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
     </None>\r
index 43dadbd22ed21e4d3f39128effe5ba256337b1b0..8510bde8705f0c2a116b75e66ec3b7c2f3fb674c 100644 (file)
 //==============================================================================\r
 // juce_audio_devices flags:\r
 \r
-#ifndef    JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 #ifndef    JUCE_ASIO\r
  //#define JUCE_ASIO 0\r
 #endif\r
  //#define JUCE_USE_ANDROID_OPENSLES 0\r
 #endif\r
 \r
+#ifndef    JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 #ifndef    JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
  //#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
 #endif\r
  //#define JUCE_USE_CURL 0\r
 #endif\r
 \r
-#ifndef    JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
 #ifndef    JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
  //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
 #endif\r
  //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
-#ifndef    JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_events flags:\r
 \r
  //#define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-#ifndef    JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_basics flags:\r
 \r
  //#define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-#ifndef    JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 // juce_gui_extra flags:\r
 \r
 #ifndef    JUCE_USE_CAMERA\r
  //#define JUCE_USE_CAMERA 0\r
 #endif\r
-\r
-#ifndef    JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
 //==============================================================================\r
 #ifndef    JUCE_STANDALONE_APPLICATION\r
  #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
index c7101cce7dd2ea3e113e66fb225daf9d71ff4ebd..793d2cb2ea004ca1b0f113dc6bf009a82975253a 100644 (file)
@@ -40,7 +40,6 @@
 namespace ProjectInfo\r
 {\r
     const char* const  projectName    = "WindowsDLL";\r
-    const char* const  companyName    = "ROLI Ltd.";\r
     const char* const  versionString  = "1.0.0";\r
     const int          versionNumber  = 0x10000;\r
 }\r
index 2ac24556eb8a5fdea3c448f9d90a8f111491d6ac..adac1845b1bcec003d8df9269234d5e01a5625a6 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="IvabE4" name="WindowsDLL" projectType="library" juceLinkage="none"\r
-              bundleIdentifier="com.roli.jucedll" jucerVersion="5.4.1" defines="JUCE_DLL_BUILD=1"\r
+              bundleIdentifier="com.roli.jucedll" jucerVersion="5.3.1" defines="JUCE_DLL_BUILD=1"\r
               displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd."\r
               companyCopyright="ROLI Ltd.">\r
   <EXPORTFORMATS>\r
index ba3c571731c668afc7f19a1d6303d91aa9dad265..ec53fabb0d0c35e0498506758883ff09cde3b943 100644 (file)
@@ -64,9 +64,9 @@ void ThreadedAnalyticsDestination::stopAnalyticsThread (int timeout)
         saveUnloggedEvents (dispatcher.eventQueue);\r
 }\r
 \r
-ThreadedAnalyticsDestination::EventDispatcher::EventDispatcher (const String& dispatcherThreadName,\r
+ThreadedAnalyticsDestination::EventDispatcher::EventDispatcher (const String& threadName,\r
                                                                 ThreadedAnalyticsDestination& destination)\r
-    : Thread (dispatcherThreadName),\r
+    : Thread (threadName),\r
       parent (destination)\r
 {}\r
 \r
index 378848af93039f7f25f86ce5f59a2a0f80c2c8d7..546a3f096c238071231b5a174495ce006d6b949a 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_analytics\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE analytics classes\r
   description:      Classes to collect analytics and send to destinations\r
   website:          http://www.juce.com/juce\r
diff --git a/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp b/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp
deleted file mode 100644 (file)
index 1795949..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-AudioProcessLoadMeasurer::AudioProcessLoadMeasurer() {}\r
-AudioProcessLoadMeasurer::~AudioProcessLoadMeasurer() {}\r
-\r
-void AudioProcessLoadMeasurer::reset()\r
-{\r
-    reset (0, 0);\r
-}\r
-\r
-void AudioProcessLoadMeasurer::reset (double sampleRate, int blockSize)\r
-{\r
-    cpuUsageMs = 0;\r
-    xruns = 0;\r
-\r
-    if (sampleRate > 0.0 && blockSize > 0)\r
-    {\r
-        msPerBlock = 1000.0 * blockSize / sampleRate;\r
-        timeToCpuScale = (msPerBlock > 0.0) ? (1.0 / msPerBlock) : 0.0;\r
-    }\r
-    else\r
-    {\r
-        msPerBlock = 0;\r
-        timeToCpuScale = 0;\r
-    }\r
-}\r
-\r
-void AudioProcessLoadMeasurer::registerBlockRenderTime (double milliseconds)\r
-{\r
-    const double filterAmount = 0.2;\r
-    cpuUsageMs += filterAmount * (milliseconds - cpuUsageMs);\r
-\r
-    if (milliseconds > msPerBlock)\r
-        ++xruns;\r
-}\r
-\r
-double AudioProcessLoadMeasurer::getLoadAsProportion() const   { return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs); }\r
-double AudioProcessLoadMeasurer::getLoadAsPercentage() const   { return 100.0 * getLoadAsProportion(); }\r
-\r
-int AudioProcessLoadMeasurer::getXRunCount() const             { return xruns; }\r
-\r
-AudioProcessLoadMeasurer::ScopedTimer::ScopedTimer (AudioProcessLoadMeasurer& p)\r
-   : owner (p), startTime (Time::getMillisecondCounterHiRes())\r
-{\r
-}\r
-\r
-AudioProcessLoadMeasurer::ScopedTimer::~ScopedTimer()\r
-{\r
-    owner.registerBlockRenderTime (Time::getMillisecondCounterHiRes() - startTime);\r
-}\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h b/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h
deleted file mode 100644 (file)
index 53a3377..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
-    Maintains an ongoing measurement of the proportion of time which is being\r
-    spent inside an audio callback.\r
-*/\r
-class JUCE_API  AudioProcessLoadMeasurer\r
-{\r
-public:\r
-    /** */\r
-    AudioProcessLoadMeasurer();\r
-\r
-    /** Destructor. */\r
-    ~AudioProcessLoadMeasurer();\r
-\r
-    //==============================================================================\r
-    /** Resets the state. */\r
-    void reset();\r
-\r
-    /** Resets the counter, in preparation for use with the given sample rate and block size. */\r
-    void reset (double sampleRate, int blockSize);\r
-\r
-    /** Returns the current load as a proportion 0 to 1.0 */\r
-    double getLoadAsProportion() const;\r
-\r
-    /** Returns the current load as a percentage 0 to 100.0 */\r
-    double getLoadAsPercentage() const;\r
-\r
-    /** Returns the number of over- (or under-) runs recorded since the state was reset. */\r
-    int getXRunCount() const;\r
-\r
-    //==============================================================================\r
-    /** This class measures the time between its construction and destruction and\r
-        adds it to an AudioProcessLoadMeasurer.\r
-\r
-        e.g.\r
-        @code\r
-        {\r
-            AudioProcessLoadMeasurer::ScopedTimer timer (myProcessLoadMeasurer);\r
-            myCallback->doTheCallback();\r
-        }\r
-        @endcode\r
-    */\r
-    struct JUCE_API  ScopedTimer\r
-    {\r
-        ScopedTimer (AudioProcessLoadMeasurer&);\r
-        ~ScopedTimer();\r
-\r
-    private:\r
-        AudioProcessLoadMeasurer& owner;\r
-        double startTime;\r
-\r
-        JUCE_DECLARE_NON_COPYABLE (ScopedTimer)\r
-    };\r
-\r
-    /** Can be called manually to add the time of a callback to the stats.\r
-        Normally you probably would never call this - it's simpler and more robust to\r
-        use a ScopedTimer to measure the time using an RAII pattern.\r
-    */\r
-    void registerBlockRenderTime (double millisecondsTaken);\r
-\r
-private:\r
-    double cpuUsageMs = 0, timeToCpuScale = 0, msPerBlock = 0;\r
-    int xruns = 0;\r
-};\r
-\r
-\r
-} // namespace juce\r
index 952327c72a7a59238ba48dad338a293885ab1629..60227f545d8cf8465cb85ef32a588217780b5608 100644 (file)
@@ -242,10 +242,6 @@ namespace
         }\r
 \r
         subSamplePos = pos;\r
-\r
-        if (wrap == 0)\r
-            return (int) (in - originalIn);\r
-\r
         return ((int) (in - originalIn) + wrap) % wrap;\r
     }\r
 \r
@@ -357,10 +353,6 @@ namespace
         }\r
 \r
         subSamplePos = pos;\r
-\r
-        if (wrap == 0)\r
-            return (int) (in - originalIn);\r
-\r
         return ((int) (in - originalIn) + wrap) % wrap;\r
     }\r
 \r
index e586f92e77c7330e4620b5852a7a79932b7806dc..80dd6fc09e95dd2810dc08cbc3330a94d04d396e 100644 (file)
@@ -164,16 +164,16 @@ public:
         {\r
             if (buffer.getNumChannels() == 1)\r
             {\r
-                auto samples = buffer.getWritePointer(0);\r
+                FloatType* samples = buffer.getWritePointer(0);\r
 \r
-                for (int i = 0; i < numSamples; ++i)\r
+                for (int i = 0; i < numSamples; i++)\r
                     samples[i] *= getNextValue();\r
             }\r
             else\r
             {\r
-                for (int i = 0; i < numSamples; ++i)\r
+                for (int i = 0; i < numSamples; i++)\r
                 {\r
-                    auto gain = getNextValue();\r
+                    const FloatType gain = getNextValue();\r
 \r
                     for (int channel = 0; channel < buffer.getNumChannels(); channel++)\r
                         buffer.setSample (channel, i, buffer.getSample (channel, i) * gain);\r
@@ -188,22 +188,22 @@ public:
 \r
     //==============================================================================\r
     /** Skip the next numSamples samples.\r
-        This is identical to calling getNextValue numSamples times. It returns\r
-        the new current value.\r
+\r
+        This is identical to calling getNextValue numSamples times.\r
         @see getNextValue\r
     */\r
-    FloatType skip (int numSamples) noexcept\r
+    void skip (int numSamples) noexcept\r
     {\r
         if (numSamples >= countdown)\r
         {\r
             currentValue = target;\r
             countdown = 0;\r
-            return target;\r
         }\r
-\r
-        currentValue += (step * static_cast<FloatType> (numSamples));\r
-        countdown -= numSamples;\r
-        return currentValue;\r
+        else\r
+        {\r
+            currentValue += (step * static_cast<FloatType> (numSamples));\r
+            countdown -= numSamples;\r
+        }\r
     }\r
 \r
 private:\r
index 3b00dee363ed36b19f53153804b7839f4b0d49db..56371d0d10f49f68fe13931bdb90ee9e716344b8 100644 (file)
@@ -56,7 +56,6 @@
 #include "buffers/juce_AudioDataConverters.cpp"\r
 #include "buffers/juce_FloatVectorOperations.cpp"\r
 #include "buffers/juce_AudioChannelSet.cpp"\r
-#include "buffers/juce_AudioProcessLoadMeasurer.cpp"\r
 #include "effects/juce_IIRFilter.cpp"\r
 #include "effects/juce_LagrangeInterpolator.cpp"\r
 #include "effects/juce_CatmullRomInterpolator.cpp"\r
index a3eb065c8d6f4a35bcbdbba54b67ed2e48c0ce7f..3662bc3604a3c6fa98486d5e02a10ed002c1f579 100644 (file)
@@ -31,7 +31,7 @@
 \r
   ID:               juce_audio_basics\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE audio and MIDI data classes\r
   description:      Classes for audio buffer manipulation, midi message handling, synthesis, etc.\r
   website:          http://www.juce.com/juce\r
@@ -84,7 +84,6 @@
 #include "buffers/juce_FloatVectorOperations.h"\r
 #include "buffers/juce_AudioSampleBuffer.h"\r
 #include "buffers/juce_AudioChannelSet.h"\r
-#include "buffers/juce_AudioProcessLoadMeasurer.h"\r
 #include "effects/juce_Decibels.h"\r
 #include "effects/juce_IIRFilter.h"\r
 #include "effects/juce_LagrangeInterpolator.h"\r
index 55e2597b3642ead893b90c781b491efb657b7097..91689d332c78a3749397ae29388ac441d87eb973 100644 (file)
@@ -57,16 +57,9 @@ namespace MidiBufferHelpers
         }\r
         else if (byte == 0xff)\r
         {\r
-            if (maxBytes == 1)\r
-            {\r
-                size = 1;\r
-            }\r
-            else\r
-            {\r
-                int n;\r
-                const int bytesLeft = MidiMessage::readVariableLengthVal (data + 1, n);\r
-                size = jmin (maxBytes, n + 2 + bytesLeft);\r
-            }\r
+            int n;\r
+            const int bytesLeft = MidiMessage::readVariableLengthVal (data + 1, n);\r
+            size = jmin (maxBytes, n + 2 + bytesLeft);\r
         }\r
         else if (byte >= 0x80)\r
         {\r
index d6aef7944a52f306fa879825a898ebbda0aa4606..65e7b0edd2c68270231acb0714605055ac5c9efc 100644 (file)
@@ -245,7 +245,7 @@ double MidiFile::getLastTimestamp() const
 }\r
 \r
 //==============================================================================\r
-bool MidiFile::readFrom (InputStream& sourceStream, bool createMatchingNoteOffs)\r
+bool MidiFile::readFrom (InputStream& sourceStream)\r
 {\r
     clear();\r
     MemoryBlock data;\r
@@ -276,7 +276,7 @@ bool MidiFile::readFrom (InputStream& sourceStream, bool createMatchingNoteOffs)
                     break;\r
 \r
                 if (chunkType == (int) ByteOrder::bigEndianInt ("MTrk"))\r
-                    readNextTrack (d, chunkSize, createMatchingNoteOffs);\r
+                    readNextTrack (d, chunkSize);\r
 \r
                 size -= (size_t) chunkSize + 8;\r
                 d += chunkSize;\r
@@ -290,7 +290,7 @@ bool MidiFile::readFrom (InputStream& sourceStream, bool createMatchingNoteOffs)
     return false;\r
 }\r
 \r
-void MidiFile::readNextTrack (const uint8* data, int size, bool createMatchingNoteOffs)\r
+void MidiFile::readNextTrack (const uint8* data, int size)\r
 {\r
     double time = 0;\r
     uint8 lastStatusByte = 0;\r
@@ -337,9 +337,7 @@ void MidiFile::readNextTrack (const uint8* data, int size, bool createMatchingNo
     });\r
 \r
     addTrack (result);\r
-\r
-    if (createMatchingNoteOffs)\r
-        tracks.getLast()->updateMatchedPairs();\r
+    tracks.getLast()->updateMatchedPairs();\r
 }\r
 \r
 //==============================================================================\r
index 8c3c930d5bd4b59813f6ae068d3f6e893e4c8c8b..2226b320efc83d991a03728742136046123e9f69 100644 (file)
@@ -156,22 +156,13 @@ public:
         terms of midi ticks. To convert them to seconds, use the convertTimestampTicksToSeconds()\r
         method.\r
 \r
-        @param sourceStream              the source stream\r
-        @param createMatchingNoteOffs    if true, any missing note-offs for previous note-ons will\r
-                                         be automatically added at the end of the file by calling\r
-                                         MidiMessageSequence::updateMatchedPairs on each track.\r
-\r
         @returns true if the stream was read successfully\r
     */\r
-    bool readFrom (InputStream& sourceStream, bool createMatchingNoteOffs = true);\r
+    bool readFrom (InputStream& sourceStream);\r
 \r
     /** Writes the midi tracks as a standard midi file.\r
         The midiFileType value is written as the file's format type, which can be 0, 1\r
         or 2 - see the midi file spec for more info about that.\r
-\r
-        @param destStream        the destination stream\r
-        @param midiFileType      the type of midi file\r
-\r
         @returns true if the operation succeeded.\r
     */\r
     bool writeTo (OutputStream& destStream, int midiFileType = 1);\r
@@ -189,7 +180,7 @@ private:
     OwnedArray<MidiMessageSequence> tracks;\r
     short timeFormat;\r
 \r
-    void readNextTrack (const uint8*, int, bool);\r
+    void readNextTrack (const uint8*, int size);\r
     bool writeTrack (OutputStream&, const MidiMessageSequence&);\r
 \r
     JUCE_LEAK_DETECTOR (MidiFile)\r
index 9ccccfacd804198759d8c5b2fad983efdc1428c7..d1ad95058314f1a61a9f268351fa6ae799961050 100644 (file)
@@ -224,16 +224,9 @@ MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const
         }\r
         else if (byte == 0xff)\r
         {\r
-            if (sz == 1)\r
-            {\r
-                size = 1;\r
-            }\r
-            else\r
-            {\r
-                int n;\r
-                const int bytesLeft = readVariableLengthVal (src + 1, n);\r
-                size = jmin (sz + 1, n + 2 + bytesLeft);\r
-            }\r
+            int n;\r
+            const int bytesLeft = readVariableLengthVal (src + 1, n);\r
+            size = jmin (sz + 1, n + 2 + bytesLeft);\r
 \r
             auto dest = allocateSpace (size);\r
             *dest = (uint8) byte;\r
index 5628c3ae924cd927de5c695701f15fbcc5d5d217..bc7669622b1ad097db49cbfe429177afc0d844e0 100644 (file)
@@ -83,19 +83,19 @@ public:
         complete message, and will return the number of bytes it used. This lets\r
         you read a sequence of midi messages from a file or stream.\r
 \r
-        @param data                     the data to read from\r
-        @param maxBytesToUse            the maximum number of bytes it's allowed to read\r
-        @param numBytesUsed             returns the number of bytes that were actually needed\r
-        @param lastStatusByte           in a sequence of midi messages, the initial byte\r
-                                        can be dropped from a message if it's the same as the\r
-                                        first byte of the previous message, so this lets you\r
-                                        supply the byte to use if the first byte of the message\r
-                                        has in fact been dropped.\r
-        @param timeStamp                the time to give the midi message - this value doesn't\r
-                                        use any particular units, so will be application-specific\r
+        @param data             the data to read from\r
+        @param maxBytesToUse    the maximum number of bytes it's allowed to read\r
+        @param numBytesUsed     returns the number of bytes that were actually needed\r
+        @param lastStatusByte   in a sequence of midi messages, the initial byte\r
+                                can be dropped from a message if it's the same as the\r
+                                first byte of the previous message, so this lets you\r
+                                supply the byte to use if the first byte of the message\r
+                                has in fact been dropped.\r
+        @param timeStamp        the time to give the midi message - this value doesn't\r
+                                use any particular units, so will be application-specific\r
         @param sysexHasEmbeddedLength   when reading sysexes, this flag indicates whether\r
-                                        to expect the data to begin with a variable-length\r
-                                        field indicating its size\r
+                                to expect the data to begin with a variable-length field\r
+                                indicating its size\r
     */\r
     MidiMessage (const void* data, int maxBytesToUse,\r
                  int& numBytesUsed, uint8 lastStatusByte,\r
index a9a0075dc947f76e1eccd404f585d6ba289dc6fb..b2f2cb6a6d98510212d76e710f31bf440f78e1f2 100644 (file)
@@ -129,12 +129,12 @@ void MPEInstrument::setTimbreTrackingMode (TrackingMode modeToUse)
 }\r
 \r
 //==============================================================================\r
-void MPEInstrument::addListener (Listener* listenerToAdd)\r
+void MPEInstrument::addListener (Listener* const listenerToAdd) noexcept\r
 {\r
     listeners.add (listenerToAdd);\r
 }\r
 \r
-void MPEInstrument::removeListener (Listener* listenerToRemove)\r
+void MPEInstrument::removeListener (Listener* const listenerToRemove) noexcept\r
 {\r
     listeners.remove (listenerToRemove);\r
 }\r
@@ -156,7 +156,7 @@ void MPEInstrument::processNextMidiEvent (const MidiMessage& message)
 //==============================================================================\r
 void MPEInstrument::processMidiNoteOnMessage (const MidiMessage& message)\r
 {\r
-    // Note: If a note-on with velocity = 0 is used to convey a note-off,\r
+    // Note: if a note-on with velocity = 0 is used to convey a note-off,\r
     // then the actual note-off velocity is not known. In this case,\r
     // the MPE convention is to use note-off velocity = 64.\r
 \r
index 59b070bfef16a02de0f46ef3648af0fd03983818..4582065df340f2f3bf210e7ebf34bb77c0282224 100644 (file)
@@ -271,7 +271,7 @@ public:
             MPE note's key state (whether the key is down and/or the note is\r
             sustained) has changed.\r
 \r
-            Note: If the key state changes to MPENote::off, noteReleased is\r
+            Note: if the key state changes to MPENote::off, noteReleased is\r
             called instead.\r
         */\r
         virtual void noteKeyStateChanged (MPENote changedNote) = 0;\r
@@ -286,10 +286,10 @@ public:
 \r
     //==============================================================================\r
     /** Adds a listener. */\r
-    void addListener (Listener* listenerToAdd);\r
+    void addListener (Listener* listenerToAdd) noexcept;\r
 \r
     /** Removes a listener. */\r
-    void removeListener (Listener* listenerToRemove);\r
+    void removeListener (Listener* listenerToRemove) noexcept;\r
 \r
     //==============================================================================\r
     /** Puts the instrument into legacy mode.\r
index 37c332fbafbea74dd06e2ac1dc8ccd8a0d5f365a..f694944285cecd6075da4c0205f8da7dc0dd6059 100644 (file)
@@ -215,7 +215,7 @@ private:
         std::size_t pos = 0;\r
         MidiBuffer::Iterator iter (midiBuffer);\r
         MidiMessage midiMessage;\r
-        int samplePosition; // Note: Not actually used, so no need to initialise.\r
+        int samplePosition; // Note: not actually used, so no need to initialise.\r
 \r
         while (iter.getNextEvent (midiMessage, samplePosition))\r
         {\r
index a6e31e854d647d98ebd0b4f74fb6fef57dbbd810..133ce3d87bb6c131a91a32039700b996097a6645 100644 (file)
@@ -35,7 +35,7 @@ namespace juce
     class instead. You just need to take care to send them to the appropriate\r
     per-note MIDI channel.\r
 \r
-    Note: If you are working with an MPEZoneLayout object inside your app,\r
+    Note: if you are working with an MPEZoneLayout object inside your app,\r
     you should not use the message sequences provided here. Instead, you should\r
     change the zone layout programmatically with the member functions provided in the\r
     MPEZoneLayout class itself. You should also make sure that the Expressive\r
index 0a99745188414b71e4265f2b470c79f928f76a29..33d992b48edea4527a2cb428e6a5521ca21558d2 100644 (file)
@@ -132,7 +132,7 @@ struct JUCE_API  MPENote
     */\r
     MPEValue pressure        { MPEValue::centreValue() };\r
 \r
-    /** Initial value of timbre when the note was triggered.\r
+    /** Inital value of timbre when the note was triggered.\r
         This should never change during the lifetime of an MPENote object.\r
     */\r
     MPEValue initialTimbre   { MPEValue::centreValue() };\r
index fc76d407a315e035cde329313f3fe05e157d08ee..ea0028e4772f8e326546c94fa316ef32e73f7ae8 100644 (file)
@@ -42,16 +42,13 @@ MPESynthesiser::~MPESynthesiser()
 void MPESynthesiser::startVoice (MPESynthesiserVoice* voice, MPENote noteToStart)\r
 {\r
     jassert (voice != nullptr);\r
-\r
     voice->currentlyPlayingNote = noteToStart;\r
-    voice->noteOnTime = lastNoteOnCounter++;\r
     voice->noteStarted();\r
 }\r
 \r
 void MPESynthesiser::stopVoice (MPESynthesiserVoice* voice, MPENote noteToStop, bool allowTailOff)\r
 {\r
     jassert (voice != nullptr);\r
-\r
     voice->currentlyPlayingNote = noteToStop;\r
     voice->noteStopped (allowTailOff);\r
 }\r
@@ -200,7 +197,7 @@ MPESynthesiserVoice* MPESynthesiser::findVoiceToSteal (MPENote noteToStealVoiceF
         // compilers generating code containing heap allocations..\r
         struct Sorter\r
         {\r
-            bool operator() (const MPESynthesiserVoice* a, const MPESynthesiserVoice* b) const noexcept { return a->noteOnTime < b->noteOnTime; }\r
+            bool operator() (const MPESynthesiserVoice* a, const MPESynthesiserVoice* b) const noexcept { return a->wasStartedBefore (*b); }\r
         };\r
 \r
         std::sort (usableVoices.begin(), usableVoices.end(), Sorter());\r
index c49bbcdeb69c96df7c2154d9c02e29de6f9edff6..d30269375f9c9c99114ce5d9b64779ed29263e5d 100644 (file)
@@ -304,7 +304,6 @@ protected:
 private:\r
     //==============================================================================\r
     bool shouldStealVoices = false;\r
-    uint32 lastNoteOnCounter = 0;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESynthesiser)\r
 };\r
index b20e13d661fff6d67397048e6a10a848104b2be5..5cb03eee50a4b8aa1c2a422a318de4ca3068761d 100644 (file)
@@ -42,6 +42,11 @@ bool MPESynthesiserVoice::isPlayingButReleased() const noexcept
     return isActive() && currentlyPlayingNote.keyState == MPENote::off;\r
 }\r
 \r
+bool MPESynthesiserVoice::wasStartedBefore (const MPESynthesiserVoice& other) const noexcept\r
+{\r
+    return noteStartTime < other.noteStartTime;\r
+}\r
+\r
 void MPESynthesiserVoice::clearCurrentNote() noexcept\r
 {\r
     currentlyPlayingNote = MPENote();\r
index febd84f036255b3ff325f0f025e4baeb87623bf4..f1603d5f44dae5b9b2cb61b1d824fa1aa66d5aac 100644 (file)
@@ -156,10 +156,8 @@ public:
     */\r
     double getSampleRate() const noexcept                 { return currentSampleRate; }\r
 \r
-    /** This will be set to an incrementing counter value in MPESynthesiser::startVoice()\r
-        and can be used to determine the order in which voices started.\r
-    */\r
-    uint32 noteOnTime = 0;\r
+    /** Returns true if this voice started playing its current note before the other voice did. */\r
+    bool wasStartedBefore (const MPESynthesiserVoice& other) const noexcept;\r
 \r
 protected:\r
     //==============================================================================\r
@@ -184,6 +182,7 @@ protected:
 private:\r
     //==============================================================================\r
     friend class MPESynthesiser;\r
+    uint32 noteStartTime = 0;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESynthesiserVoice)\r
 };\r
index a987d7f575bd9a4a14441ddc664ed271f93e1e32..6adec04448bbefdec174d183301621b8bf92645e 100644 (file)
@@ -49,8 +49,7 @@ void MemoryAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferT
     auto max = 0, pos = 0;\r
     auto n = buffer.getNumSamples(), m = bufferToFill.numSamples;\r
 \r
-    int i;\r
-    for (i = position; (i < n || isLooping) && (pos < m); i += max)\r
+    for (auto i = position; (i < n || isLooping) && (pos < m); i += max)\r
     {\r
         max = jmin (m - pos, n - (i % n));\r
 \r
@@ -66,8 +65,6 @@ void MemoryAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferT
 \r
     if (pos < m)\r
         dst.clear (bufferToFill.startSample + pos, m - pos);\r
-\r
-    position = (i % n);\r
 }\r
 \r
 } // namespace juce\r
index ba6f818d6ecf82ab0e11607d79c8dc8c62e1be5f..fa047d1496c80bda8345a2332c98374f66b8794e 100644 (file)
@@ -323,7 +323,7 @@ void Synthesiser::stopVoice (SynthesiserVoice* voice, float velocity, const bool
     voice->stopNote (velocity, allowTailOff);\r
 \r
     // the subclass MUST call clearCurrentNote() if it's not tailing off! RTFM for stopNote()!\r
-    jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == nullptr));\r
+    jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == 0));\r
 }\r
 \r
 void Synthesiser::noteOff (const int midiChannel,\r
@@ -338,7 +338,7 @@ void Synthesiser::noteOff (const int midiChannel,
         if (voice->getCurrentlyPlayingNote() == midiNoteNumber\r
               && voice->isPlayingChannel (midiChannel))\r
         {\r
-            if (auto sound = voice->getCurrentlyPlayingSound())\r
+            if (SynthesiserSound* const sound = voice->getCurrentlyPlayingSound())\r
             {\r
                 if (sound->appliesToNote (midiNoteNumber)\r
                      && sound->appliesToChannel (midiChannel))\r
index 62e8cc1a2efd40a8aac4f0b845cf1939b2d422d3..3215d1000222a67cd0b545d8f897fe2f7c46626a 100644 (file)
@@ -352,7 +352,7 @@ public:
     int getNumSounds() const noexcept                               { return sounds.size(); }\r
 \r
     /** Returns one of the sounds. */\r
-    SynthesiserSound::Ptr getSound (int index) const noexcept       { return sounds[index]; }\r
+    SynthesiserSound* getSound (int index) const noexcept           { return sounds [index]; }\r
 \r
     /** Adds a new sound to the synthesiser.\r
 \r
index bbbcbbe6230d4392ae086307bfa03e24b2153a9c..e2fb0b41a6d09f17a569c34106459ec3245fcaef 100644 (file)
 namespace juce\r
 {\r
 \r
+AudioDeviceManager::AudioDeviceSetup::AudioDeviceSetup()\r
+    : sampleRate (0),\r
+      bufferSize (0),\r
+      useDefaultInputChannels (true),\r
+      useDefaultOutputChannels (true)\r
+{\r
+}\r
+\r
 bool AudioDeviceManager::AudioDeviceSetup::operator== (const AudioDeviceManager::AudioDeviceSetup& other) const\r
 {\r
     return outputDeviceName == other.outputDeviceName\r
@@ -359,11 +367,6 @@ AudioIODeviceType* AudioDeviceManager::findType (const String& inputName, const
     return {};\r
 }\r
 \r
-AudioDeviceManager::AudioDeviceSetup AudioDeviceManager::getAudioDeviceSetup() const\r
-{\r
-    return currentSetup;\r
-}\r
-\r
 void AudioDeviceManager::getAudioDeviceSetup (AudioDeviceSetup& setup) const\r
 {\r
     setup = currentSetup;\r
@@ -579,7 +582,7 @@ void AudioDeviceManager::closeAudioDevice()
 {\r
     stopDevice();\r
     currentAudioDevice.reset();\r
-    loadMeasurer.reset();\r
+    cpuUsageMs = 0;\r
 }\r
 \r
 void AudioDeviceManager::restartLastAudioDevice()\r
@@ -691,7 +694,7 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat
 \r
     if (callbacks.size() > 0)\r
     {\r
-        AudioProcessLoadMeasurer::ScopedTimer timer (loadMeasurer);\r
+        auto callbackStartTime = Time::getMillisecondCounterHiRes();\r
 \r
         tempBuffer.setSize (jmax (1, numOutputChannels), jmax (1, numSamples), false, false, true);\r
 \r
@@ -713,6 +716,13 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat
                             dst[j] += src[j];\r
             }\r
         }\r
+\r
+        auto msTaken = Time::getMillisecondCounterHiRes() - callbackStartTime;\r
+        const double filterAmount = 0.2;\r
+        cpuUsageMs += filterAmount * (msTaken - cpuUsageMs);\r
+\r
+        if (msTaken > msPerBlock)\r
+            ++xruns;\r
     }\r
     else\r
     {\r
@@ -738,8 +748,17 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat
 \r
 void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device)\r
 {\r
-    loadMeasurer.reset (device->getCurrentSampleRate(),\r
-                        device->getCurrentBufferSizeSamples());\r
+    cpuUsageMs = 0;\r
+    xruns = 0;\r
+\r
+    auto sampleRate = device->getCurrentSampleRate();\r
+    auto blockSize = device->getCurrentBufferSizeSamples();\r
+\r
+    if (sampleRate > 0.0 && blockSize > 0)\r
+    {\r
+        msPerBlock = 1000.0 * blockSize / sampleRate;\r
+        timeToCpuScale = (msPerBlock > 0.0) ? (1.0 / msPerBlock) : 0.0;\r
+    }\r
 \r
     {\r
         const ScopedLock sl (audioCallbackLock);\r
@@ -753,12 +772,13 @@ void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device
 \r
 void AudioDeviceManager::audioDeviceStoppedInt()\r
 {\r
+    cpuUsageMs = 0;\r
+    timeToCpuScale = 0;\r
+    xruns = 0;\r
     sendChangeMessage();\r
 \r
     const ScopedLock sl (audioCallbackLock);\r
 \r
-    loadMeasurer.reset();\r
-\r
     for (int i = callbacks.size(); --i >= 0;)\r
         callbacks.getUnchecked(i)->audioDeviceStopped();\r
 }\r
@@ -773,7 +793,7 @@ void AudioDeviceManager::audioDeviceErrorInt (const String& message)
 \r
 double AudioDeviceManager::getCpuUsage() const\r
 {\r
-    return loadMeasurer.getLoadAsProportion();\r
+    return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs);\r
 }\r
 \r
 //==============================================================================\r
@@ -960,7 +980,7 @@ void AudioDeviceManager::playTestSound()
 \r
         auto phasePerSample = MathConstants<double>::twoPi / (sampleRate / frequency);\r
 \r
-        std::unique_ptr<AudioBuffer<float>> newSound (new AudioBuffer<float> (1, soundLength));\r
+        auto* newSound = new AudioBuffer<float> (1, soundLength);\r
 \r
         for (int i = 0; i < soundLength; ++i)\r
             newSound->setSample (0, i, amplitude * (float) std::sin (i * phasePerSample));\r
@@ -968,17 +988,15 @@ void AudioDeviceManager::playTestSound()
         newSound->applyGainRamp (0, 0, soundLength / 10, 0.0f, 1.0f);\r
         newSound->applyGainRamp (0, soundLength - soundLength / 4, soundLength / 4, 1.0f, 0.0f);\r
 \r
-        {\r
-            const ScopedLock sl (audioCallbackLock);\r
-            std::swap (testSound, newSound);\r
-        }\r
+        const ScopedLock sl (audioCallbackLock);\r
+        testSound.reset (newSound);\r
     }\r
 }\r
 \r
 int AudioDeviceManager::getXRunCount() const noexcept\r
 {\r
     auto deviceXRuns = (currentAudioDevice != nullptr ? currentAudioDevice->getXRunCount() : -1);\r
-    return jmax (0, deviceXRuns) + loadMeasurer.getXRunCount();\r
+    return jmax (0, deviceXRuns) + xruns;\r
 }\r
 \r
 } // namespace juce\r
index 80e268d89a34dd673190fd37f30fe8410762d51d..adbfa99fdb372ed024a373ba60408529ddab039d 100644 (file)
@@ -89,6 +89,17 @@ public:
     */\r
     struct JUCE_API  AudioDeviceSetup\r
     {\r
+        /** Creates an AudioDeviceSetup object.\r
+\r
+            The default constructor sets all the member variables to indicate default values.\r
+            You can then fill-in any values you want to before passing the object to\r
+            AudioDeviceManager::initialise().\r
+        */\r
+        AudioDeviceSetup();\r
+\r
+        bool operator== (const AudioDeviceSetup& other) const;\r
+        bool operator!= (const AudioDeviceSetup& other) const;\r
+\r
         /** The name of the audio device used for output.\r
             The name has to be one of the ones listed by the AudioDeviceManager's currently\r
             selected device type.\r
@@ -108,13 +119,13 @@ public:
             A value of 0 indicates that you don't care what rate is used, and the\r
             device will choose a sensible rate for you.\r
         */\r
-        double sampleRate = 0;\r
+        double sampleRate;\r
 \r
         /** The buffer size, in samples.\r
             This buffer size is used for both the input and output devices.\r
             A value of 0 indicates the default buffer size.\r
         */\r
-        int bufferSize = 0;\r
+        int bufferSize;\r
 \r
         /** The set of active input channels.\r
             The bits that are set in this array indicate the channels of the\r
@@ -127,7 +138,7 @@ public:
             should be ignored, and instead, the device's default channels\r
             should be used.\r
         */\r
-        bool useDefaultInputChannels = true;\r
+        bool useDefaultInputChannels;\r
 \r
         /** The set of active output channels.\r
             The bits that are set in this array indicate the channels of the\r
@@ -140,10 +151,7 @@ public:
             should be ignored, and instead, the device's default channels\r
             should be used.\r
         */\r
-        bool useDefaultOutputChannels = true;\r
-\r
-        bool operator== (const AudioDeviceSetup&) const;\r
-        bool operator!= (const AudioDeviceSetup&) const;\r
+        bool useDefaultOutputChannels;\r
     };\r
 \r
 \r
@@ -203,13 +211,6 @@ public:
     /** Returns the current device properties that are in use.\r
         @see setAudioDeviceSetup\r
     */\r
-    AudioDeviceSetup getAudioDeviceSetup() const;\r
-\r
-    /** Returns the current device properties that are in use.\r
-        This is an old method, kept around for compatibility, but you should prefer the new\r
-        version which returns the result rather than taking an out-parameter.\r
-        @see getAudioDeviceSetup()\r
-    */\r
     void getAudioDeviceSetup (AudioDeviceSetup& result) const;\r
 \r
     /** Changes the current device or its settings.\r
@@ -231,7 +232,8 @@ public:
 \r
         @see getAudioDeviceSetup\r
     */\r
-    String setAudioDeviceSetup (const AudioDeviceSetup& newSetup, bool treatAsChosenDevice);\r
+    String setAudioDeviceSetup (const AudioDeviceSetup& newSetup,\r
+                                bool treatAsChosenDevice);\r
 \r
 \r
     /** Returns the currently-active audio device. */\r
@@ -255,7 +257,8 @@ public:
 \r
         For a list of types, see getAvailableDeviceTypes().\r
     */\r
-    void setCurrentAudioDeviceType (const String& type, bool treatAsChosenDevice);\r
+    void setCurrentAudioDeviceType (const String& type,\r
+                                    bool treatAsChosenDevice);\r
 \r
     /** Closes the currently-open device.\r
         You can call restartLastAudioDevice() later to reopen it in the same state\r
@@ -432,10 +435,10 @@ public:
     */\r
     LevelMeter::Ptr getInputLevelGetter() noexcept          { return inputLevelGetter; }\r
 \r
-    /** Returns a reference-counted object that can be used to get the current output level.\r
+    /** Returns a reference-counted object that can be used to get the current input level.\r
 \r
         You need to store this object locally to ensure that the reference count is incremented\r
-        and decremented properly. The current output level value can be read using getCurrentLevel().\r
+        and decremented properly. The current input level value can be read using getCurrentLevel().\r
     */\r
     LevelMeter::Ptr getOutputLevelGetter() noexcept         { return outputLevelGetter; }\r
 \r
@@ -493,13 +496,16 @@ private:
     std::unique_ptr<AudioBuffer<float>> testSound;\r
     int testSoundPosition = 0;\r
 \r
-    AudioProcessLoadMeasurer loadMeasurer;\r
+    double cpuUsageMs = 0, timeToCpuScale = 0, msPerBlock = 0;\r
+    int xruns = 0;\r
 \r
     LevelMeter::Ptr inputLevelGetter   { new LevelMeter() },\r
                     outputLevelGetter  { new LevelMeter() };\r
 \r
     //==============================================================================\r
     class CallbackHandler;\r
+    friend class CallbackHandler;\r
+    friend struct ContainerDeletePolicy<CallbackHandler>;\r
     std::unique_ptr<CallbackHandler> callbackHandler;\r
 \r
     void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels,\r
index 11636db0b7dbec5aec308e0dccd104437ffc27e7..67f36912dd956583194af802c45401ec769f9249 100644 (file)
   #include <mmreg.h>\r
  #endif\r
 \r
- #if JUCE_USE_WINRT_MIDI && JUCE_MSVC\r
+ #if JUCE_USE_WINRT_MIDI\r
   /* If you cannot find any of the header files below then you are probably\r
      attempting to use the Windows 10 Bluetooth Low Energy API. For this to work you\r
-     need to install version 10.0.14393.0 of the Windows Standalone SDK and you may\r
-     need to add the path to the WinRT headers to your build system. This path should\r
-     have the form "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
+     need to install version 10.0.14393.0 of the Windows Standalone SDK and add the\r
+     path to the WinRT headers to your build system. This path should have the form\r
+     "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
 \r
      Also please note that Microsoft's Bluetooth MIDI stack has multiple issues, so\r
      this API is EXPERIMENTAL - use at your own risk!\r
   #include <windows.devices.h>\r
   #include <windows.devices.midi.h>\r
   #include <windows.devices.enumeration.h>\r
-\r
-  #pragma warning (push)\r
-  #pragma warning (disable: 4265)\r
   #include <wrl/event.h>\r
-  #pragma warning (pop)\r
-\r
-  #pragma warning (push)\r
-  #pragma warning (disable: 4467)\r
+  #if JUCE_MSVC\r
+   #pragma warning (push)\r
+   #pragma warning (disable: 4467)\r
+  #endif\r
   #include <robuffer.h>\r
-  #pragma warning (pop)\r
+  #if JUCE_MSVC\r
+   #pragma warning (pop)\r
+  #endif\r
  #endif\r
 \r
  #if JUCE_ASIO\r
      installed, or you've not got your paths set up correctly to find its header\r
      files.\r
   */\r
-  #include <rtdk.h>\r
   #include <Bela.h>\r
-  #include <Midi.h>\r
  #endif\r
 \r
  #undef SIZEOF\r
  #endif\r
 \r
  #if JUCE_USE_ANDROID_OBOE\r
-  #if JUCE_USE_ANDROID_OPENSLES\r
-   #error "Oboe cannot be enabled at the same time as openSL! Please disable JUCE_USE_ANDROID_OPENSLES"\r
-  #endif\r
-\r
   #include <oboe/Oboe.h>\r
  #endif\r
 \r
   #include "native/juce_linux_ALSA.cpp"\r
  #endif\r
 \r
+ #include "native/juce_linux_Midi.cpp"\r
+\r
  #if JUCE_JACK\r
   #include "native/juce_linux_JackAudio.cpp"\r
  #endif\r
 \r
  #if JUCE_BELA\r
   #include "native/juce_linux_Bela.cpp"\r
- #else\r
-  #include "native/juce_linux_Midi.cpp"\r
  #endif\r
 \r
 //==============================================================================\r
index 330efb530e176ac6b455fc7bd6dbaa168d153fcb..1ab48aa5a81c07aa3592fabbcef37e907dccbbe0 100644 (file)
@@ -31,7 +31,7 @@
 \r
   ID:               juce_audio_devices\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE audio and MIDI I/O device classes\r
   description:      Classes to play and record from audio and MIDI I/O devices\r
   website:          http://www.juce.com/juce\r
 #endif\r
 \r
 //==============================================================================\r
-/** Config: JUCE_USE_WINRT_MIDI\r
-    Enables the use of the Windows Runtime API for MIDI, allowing connections\r
-    to Bluetooth Low Energy devices on Windows 10 version 1809 (October 2018\r
-    Update) and later. If you enable this flag then older, unsupported,\r
-    versions of Windows will automatically fall back to using the regualar\r
-    Win32 MIDI API.\r
-\r
-    You will need version 10.0.14393.0 of the Windows Standalone SDK to compile\r
-    and you may need to add the path to the WinRT headers. The path to the\r
-    headers will be something similar to\r
-    "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
-*/\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- #define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
 /** Config: JUCE_ASIO\r
     Enables ASIO audio devices (MS Windows only).\r
     Turning this on means that you'll need to have the Steinberg ASIO SDK installed\r
  #endif\r
 #endif\r
 \r
+/** Config: JUCE_USE_WINRT_MIDI\r
+    ***\r
+    EXPERIMENTAL - Microsoft's Bluetooth MIDI stack has multiple issues,\r
+    use at your own risk!\r
+    ***\r
+\r
+    Enables the use of the Windows Runtime API for MIDI, which supports\r
+    Bluetooth Low Energy connections on computers with the Anniversary Update\r
+    of Windows 10.\r
+\r
+    To compile with this flag requires version 10.0.14393.0 of the Windows\r
+    Standalone SDK and you must add the path to the WinRT headers. This path\r
+    should be something similar to\r
+    "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
+*/\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ #define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
 /** Config: JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
     Turning this on gives your app exclusive access to the system's audio\r
     on platforms which support it (currently iOS only).\r
index a707997aa0c85511853e9fe535757f9ee9cad84f..98fdd6cd12bab4bf4d28efc027e5c63a0a08e94f 100644 (file)
@@ -42,7 +42,7 @@ void MidiOutput::sendBlockOfMessagesNow (const MidiBuffer& buffer)
 {\r
     MidiBuffer::Iterator i (buffer);\r
     MidiMessage message;\r
-    int samplePosition; // Note: Not actually used, so no need to initialise.\r
+    int samplePosition; // Note: not actually used, so no need to initialise.\r
 \r
     while (i.getNextEvent (message, samplePosition))\r
         sendMessageNow (message);\r
index 148a7f211927be46267f2e95c8252c1cf80dd632..fa8080fa4266fe1691276fec040aefe6dd9dcc45 100644 (file)
@@ -33,68 +33,79 @@ namespace juce
 class MidiDataConcatenator\r
 {\r
 public:\r
+    //==============================================================================\r
     MidiDataConcatenator (int initialBufferSize)\r
-        : pendingSysexData ((size_t) initialBufferSize)\r
+        : pendingData ((size_t) initialBufferSize)\r
     {\r
     }\r
 \r
     void reset()\r
     {\r
-        currentMessageLen = 0;\r
-        pendingSysexSize = 0;\r
-        pendingSysexTime = 0;\r
+        pendingBytes = 0;\r
+        runningStatus = 0;\r
+        pendingDataTime = 0;\r
     }\r
 \r
     template <typename UserDataType, typename CallbackType>\r
     void pushMidiData (const void* inputData, int numBytes, double time,\r
                        UserDataType* input, CallbackType& callback)\r
     {\r
-        auto d = static_cast<const uint8*> (inputData);\r
+        const uint8* d = static_cast<const uint8*> (inputData);\r
 \r
         while (numBytes > 0)\r
         {\r
-            auto nextByte = *d;\r
-\r
-            if (pendingSysexSize != 0 || nextByte == 0xf0)\r
+            if (pendingBytes > 0 || d[0] == 0xf0)\r
             {\r
                 processSysex (d, numBytes, time, input, callback);\r
-                currentMessageLen = 0;\r
-                continue;\r
+                runningStatus = 0;\r
             }\r
+            else\r
+            {\r
+                int len = 0;\r
+                uint8 data[3];\r
 \r
-            ++d;\r
-            --numBytes;\r
+                while (numBytes > 0)\r
+                {\r
+                    // If there's a realtime message embedded in the middle of\r
+                    // the normal message, handle it now..\r
+                    if (*d >= 0xf8 && *d <= 0xfe)\r
+                    {\r
+                        callback.handleIncomingMidiMessage (input, MidiMessage (*d++, time));\r
+                        --numBytes;\r
+                    }\r
+                    else\r
+                    {\r
+                        if (len == 0 && *d < 0x80 && runningStatus >= 0x80)\r
+                            data[len++] = runningStatus;\r
 \r
-            if (isRealtimeMessage (nextByte))\r
-            {\r
-                callback.handleIncomingMidiMessage (input, MidiMessage (nextByte, time));\r
-                // These can be embedded in the middle of a normal message, so we won't\r
-                // reset the currentMessageLen here.\r
-                continue;\r
-            }\r
+                        data[len++] = *d++;\r
+                        --numBytes;\r
 \r
-            if (isInitialByte (nextByte))\r
-            {\r
-                currentMessage[0] = nextByte;\r
-                currentMessageLen = 1;\r
-            }\r
-            else if (currentMessageLen > 0 && currentMessageLen < 3)\r
-            {\r
-                currentMessage[currentMessageLen++] = nextByte;\r
-            }\r
-            else\r
-            {\r
-                // message is too long or invalid MIDI - abandon it and start again with the next byte\r
-                currentMessageLen = 0;\r
-                continue;\r
-            }\r
+                        const uint8 firstByte = data[0];\r
 \r
-            auto expectedLength = MidiMessage::getMessageLengthFromFirstByte (currentMessage[0]);\r
+                        if (firstByte < 0x80 || firstByte == 0xf7)\r
+                        {\r
+                            len = 0;\r
+                            break;   // ignore this malformed MIDI message..\r
+                        }\r
 \r
-            if (expectedLength == currentMessageLen)\r
-            {\r
-                callback.handleIncomingMidiMessage (input, MidiMessage (currentMessage, expectedLength, time));\r
-                currentMessageLen = 1; // reset, but leave the first byte to use as the running status byte\r
+                        if (len >= MidiMessage::getMessageLengthFromFirstByte (firstByte))\r
+                            break;\r
+                    }\r
+                }\r
+\r
+                if (len > 0)\r
+                {\r
+                    int used = 0;\r
+                    const MidiMessage m (data, len, used, 0, time);\r
+\r
+                    if (used <= 0)\r
+                        break; // malformed message..\r
+\r
+                    jassert (used == len);\r
+                    callback.handleIncomingMidiMessage (input, m);\r
+                    runningStatus = data[0];\r
+                }\r
             }\r
         }\r
     }\r
@@ -106,22 +117,22 @@ private:
     {\r
         if (*d == 0xf0)\r
         {\r
-            pendingSysexSize = 0;\r
-            pendingSysexTime = time;\r
+            pendingBytes = 0;\r
+            pendingDataTime = time;\r
         }\r
 \r
-        pendingSysexData.ensureSize ((size_t) (pendingSysexSize + numBytes), false);\r
-        auto totalMessage = static_cast<uint8*> (pendingSysexData.getData());\r
-        auto dest = totalMessage + pendingSysexSize;\r
+        pendingData.ensureSize ((size_t) (pendingBytes + numBytes), false);\r
+        uint8* totalMessage = static_cast<uint8*> (pendingData.getData());\r
+        uint8* dest = totalMessage + pendingBytes;\r
 \r
         do\r
         {\r
-            if (pendingSysexSize > 0 && isInitialByte (*d))\r
+            if (pendingBytes > 0 && *d >= 0x80)\r
             {\r
                 if (*d == 0xf7)\r
                 {\r
                     *dest++ = *d++;\r
-                    ++pendingSysexSize;\r
+                    ++pendingBytes;\r
                     --numBytes;\r
                     break;\r
                 }\r
@@ -134,7 +145,7 @@ private:
                 }\r
                 else\r
                 {\r
-                    pendingSysexSize = 0;\r
+                    pendingBytes = 0;\r
                     int used = 0;\r
                     const MidiMessage m (d, numBytes, used, 0, time);\r
 \r
@@ -151,35 +162,30 @@ private:
             else\r
             {\r
                 *dest++ = *d++;\r
-                ++pendingSysexSize;\r
+                ++pendingBytes;\r
                 --numBytes;\r
             }\r
         }\r
         while (numBytes > 0);\r
 \r
-        if (pendingSysexSize > 0)\r
+        if (pendingBytes > 0)\r
         {\r
-            if (totalMessage [pendingSysexSize - 1] == 0xf7)\r
+            if (totalMessage [pendingBytes - 1] == 0xf7)\r
             {\r
-                callback.handleIncomingMidiMessage (input, MidiMessage (totalMessage, pendingSysexSize, pendingSysexTime));\r
-                pendingSysexSize = 0;\r
+                callback.handleIncomingMidiMessage (input, MidiMessage (totalMessage, pendingBytes, pendingDataTime));\r
+                pendingBytes = 0;\r
             }\r
             else\r
             {\r
-                callback.handlePartialSysexMessage (input, totalMessage, pendingSysexSize, pendingSysexTime);\r
+                callback.handlePartialSysexMessage (input, totalMessage, pendingBytes, pendingDataTime);\r
             }\r
         }\r
     }\r
 \r
-    static bool isRealtimeMessage (uint8 byte)  { return byte >= 0xf8 && byte <= 0xfe; }\r
-    static bool isInitialByte (uint8 byte)      { return byte >= 0x80; }\r
-\r
-    uint8 currentMessage[3];\r
-    int currentMessageLen = 0;\r
-\r
-    MemoryBlock pendingSysexData;\r
-    double pendingSysexTime = 0;\r
-    int pendingSysexSize = 0;\r
+    MemoryBlock pendingData;\r
+    double pendingDataTime = 0;\r
+    int pendingBytes = 0;\r
+    uint8 runningStatus = 0;\r
 \r
     JUCE_DECLARE_NON_COPYABLE (MidiDataConcatenator)\r
 };\r
index fe995ae4334a2ce22ed1159db741d43c050294ee..7a58d65bf709140cb6b2a4b9a455280bed93058b 100644 (file)
@@ -34,7 +34,7 @@ namespace juce
  METHOD (flush,         "flush",    "()V") \\r
  METHOD (write,         "write",    "([SII)I") \\r
 \r
-DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack")\r
+DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -47,14 +47,14 @@ DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack")
  METHOD (read,              "read",             "([SII)I") \\r
  METHOD (release,           "release",          "()V") \\r
 \r
-DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord")\r
+DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  STATICFIELD (SDK_INT, "SDK_INT", "I") \\r
 \r
- DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION")\r
+ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
index 0798687c104a4cffd64a5413e8eaba38a092907c..09f3530eb8ff0d5d6cbf49edf28a24d76f67b221 100644 (file)
@@ -125,12 +125,6 @@ struct OboeAudioIODeviceBufferHelpers<float>
     }\r
 };\r
 \r
-template <typename Type>\r
-static String getOboeString (const Type& value)\r
-{\r
-    return String (oboe::convertToText (value));\r
-}\r
-\r
 //==============================================================================\r
 class OboeAudioIODevice  : public AudioIODevice\r
 {\r
@@ -278,7 +272,7 @@ public:
         // by default. We need to be more conservative on other devices\r
         // as they may be low-latency, but still have a crappy CPU.\r
         return (isProAudioDevice() ? 1 : 6)\r
-                 * getNativeBufferSize();\r
+                 * defaultBufferSizeIsMultipleOfNative * getNativeBufferSize();\r
     }\r
 \r
     double getCurrentSampleRate() override\r
@@ -397,9 +391,9 @@ private:
         // Setting nullptr callback is allowed only when playback is stopped.\r
         jassert (callbackToUse != nullptr);\r
 \r
-        for (;;)\r
+        while (true)\r
         {\r
-            auto old = callback.get();\r
+            AudioIODeviceCallback* old = callback.get();\r
 \r
             if (old == callbackToUse)\r
                 break;\r
@@ -415,7 +409,7 @@ private:
     void process (const float** inputChannelData, int numInputChannels,\r
                   float** outputChannelData, int numOutputChannels, int32_t numFrames)\r
     {\r
-        if (auto* cb = callback.exchange (nullptr))\r
+        if (AudioIODeviceCallback* cb = callback.exchange (nullptr))\r
         {\r
             cb->audioDeviceIOCallback (inputChannelData, numInputChannels,\r
                                        outputChannelData, numOutputChannels, numFrames);\r
@@ -444,8 +438,8 @@ private:
 \r
         ~OboeStream()\r
         {\r
+            // AudioStreamCallback can only be deleted when stream has been closed\r
             close();\r
-            delete stream;\r
         }\r
 \r
         bool openedOk() const noexcept\r
@@ -464,47 +458,37 @@ private:
                 int64 timeoutNanos = 1000 * oboe::kNanosPerMillisecond;\r
 \r
                 auto startResult = stream->requestStart();\r
-                JUCE_OBOE_LOG ("Requested Oboe stream start with result: " + getOboeString (startResult));\r
+                JUCE_OBOE_LOG ("Requested Oboe stream start with result: " + String (oboe::convertToText (startResult)));\r
 \r
                 startResult = stream->waitForStateChange (expectedState, &nextState, timeoutNanos);\r
-\r
-                JUCE_OBOE_LOG ("Starting Oboe stream with result: " + getOboeString (startResult);\r
-                                 + "\nUses AAudio = " + String ((int) stream->usesAAudio())\r
-                                 + "\nDirection = " + getOboeString (stream->getDirection())\r
-                                 + "\nSharingMode = " + getOboeString (stream->getSharingMode())\r
-                                 + "\nChannelCount = " + String (stream->getChannelCount())\r
-                                 + "\nFormat = " + getOboeString (stream->getFormat())\r
-                                 + "\nSampleRate = " + String (stream->getSampleRate())\r
-                                 + "\nBufferSizeInFrames = " + String (stream->getBufferSizeInFrames())\r
-                                 + "\nBufferCapacityInFrames = " + String (stream->getBufferCapacityInFrames())\r
-                                 + "\nFramesPerBurst = " + String (stream->getFramesPerBurst())\r
-                                 + "\nFramesPerCallback = " + String (stream->getFramesPerCallback())\r
-                                 + "\nBytesPerFrame = " + String (stream->getBytesPerFrame())\r
-                                 + "\nBytesPerSample = " + String (stream->getBytesPerSample())\r
-                                 + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency)\r
-                                 + "\ngetDeviceId = " + String (stream->getDeviceId()));\r
+                JUCE_OBOE_LOG ("Starting Oboe stream with result: " + String (oboe::convertToText (startResult));\r
+                     + "\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
+                     + "\nDirection = " + (stream != nullptr ? String (oboe::convertToText (stream->getDirection())) : String ("?"))\r
+                     + "\nSharingMode = " + (stream != nullptr ? String (oboe::convertToText (stream->getSharingMode())) : String ("?"))\r
+                     + "\nChannelCount = " + (stream != nullptr ? String (stream->getChannelCount()) : String ("?"))\r
+                     + "\nFormat = " + (stream != nullptr ? String (oboe::convertToText (stream->getFormat())) : String ("?"))\r
+                     + "\nSampleRate = " + (stream != nullptr ? String (stream->getSampleRate()) : String ("?"))\r
+                     + "\nBufferSizeInFrames = " + (stream != nullptr ? String (stream->getBufferSizeInFrames()) : String ("?"))\r
+                     + "\nBufferCapacityInFrames = " + (stream != nullptr ? String (stream->getBufferCapacityInFrames()) : String ("?"))\r
+                     + "\nFramesPerBurst = " + (stream != nullptr ? String (stream->getFramesPerBurst()) : String ("?"))\r
+                     + "\nFramesPerCallback = " + (stream != nullptr ? String (stream->getFramesPerCallback()) : String ("?"))\r
+                     + "\nBytesPerFrame = " + (stream != nullptr ? String (stream->getBytesPerFrame()) : String ("?"))\r
+                     + "\nBytesPerSample = " + (stream != nullptr ? String (stream->getBytesPerSample()) : String ("?"))\r
+                     + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency))\r
+                     + "\ngetDeviceId = " + (stream != nullptr ? String (stream->getDeviceId()) : String ("?")));\r
             }\r
         }\r
 \r
-        oboe::AudioStream* getNativeStream() const\r
+        oboe::AudioStream* getNativeStream()\r
         {\r
             jassert (openedOk());\r
+\r
             return stream;\r
         }\r
 \r
         int getXRunCount() const\r
         {\r
-            if (stream != nullptr)\r
-            {\r
-                auto count = stream->getXRunCount();\r
-\r
-                if (count)\r
-                    return count.value();\r
-\r
-                JUCE_OBOE_LOG ("Failed to get Xrun count: " + getOboeString (count.error()));\r
-            }\r
-\r
-            return 0;\r
+            return stream != nullptr ? stream->getXRunCount() : 0;\r
         }\r
 \r
     private:\r
@@ -514,50 +498,50 @@ private:
                    int32 sampleRate, int32 bufferSize,\r
                    oboe::AudioStreamCallback* callback = nullptr)\r
         {\r
-            oboe::DefaultStreamValues::FramesPerBurst = getDefaultFramesPerBurst();\r
-\r
             oboe::AudioStreamBuilder builder;\r
 \r
             if (deviceId != -1)\r
                 builder.setDeviceId (deviceId);\r
 \r
+            static int defaultFramesPerBurst = getDefaultFramesPerBurst();\r
+\r
             // Note: letting OS to choose the buffer capacity & frames per callback.\r
             builder.setDirection (direction);\r
             builder.setSharingMode (sharingMode);\r
             builder.setChannelCount (channelCount);\r
             builder.setFormat (format);\r
             builder.setSampleRate (sampleRate);\r
+            builder.setDefaultFramesPerBurst ((int32) defaultFramesPerBurst);\r
             builder.setPerformanceMode (oboe::PerformanceMode::LowLatency);\r
             builder.setCallback (callback);\r
 \r
             JUCE_OBOE_LOG (String ("Preparing Oboe stream with params:")\r
                  + "\nAAudio supported = " + String (int (builder.isAAudioSupported()))\r
-                 + "\nAPI = " + getOboeString (builder.getAudioApi())\r
+                 + "\nAPI = " + String (oboe::convertToText (builder.getAudioApi()))\r
                  + "\nDeviceId = " + String (deviceId)\r
-                 + "\nDirection = " + getOboeString (direction)\r
-                 + "\nSharingMode = " + getOboeString (sharingMode)\r
+                 + "\nDirection = " + String (oboe::convertToText (direction))\r
+                 + "\nSharingMode = " + String (oboe::convertToText (sharingMode))\r
                  + "\nChannelCount = " + String (channelCount)\r
-                 + "\nFormat = " + getOboeString (format)\r
+                 + "\nFormat = " + String (oboe::convertToText (format))\r
                  + "\nSampleRate = " + String (sampleRate)\r
-                 + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency));\r
+                 + "\nBufferSizeInFrames = " + String (bufferSize)\r
+                 + "\nFramesPerBurst = " + String (defaultFramesPerBurst)\r
+                 + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency)));\r
 \r
             openResult = builder.openStream (&stream);\r
-            JUCE_OBOE_LOG ("Building Oboe stream with result: " + getOboeString (openResult)\r
-                 + "\nStream state = " + (stream != nullptr ? getOboeString (stream->getState()) : String ("?")));\r
+            JUCE_OBOE_LOG ("Building Oboe stream with result: " + String (oboe::convertToText (openResult))\r
+                 + "\nStream state = " + (stream != nullptr ? String (oboe::convertToText (stream->getState())) : String ("?")));\r
 \r
-            if (stream != nullptr && bufferSize != 0)\r
-            {\r
-                JUCE_OBOE_LOG ("Setting the bufferSizeInFrames to " + String (bufferSize));\r
+            if (stream != nullptr)\r
                 stream->setBufferSizeInFrames (bufferSize);\r
-            }\r
 \r
             JUCE_OBOE_LOG (String ("Stream details:")\r
                  + "\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
                  + "\nDeviceId = " + (stream != nullptr ? String (stream->getDeviceId()) : String ("?"))\r
-                 + "\nDirection = " + (stream != nullptr ? getOboeString (stream->getDirection()) : String ("?"))\r
-                 + "\nSharingMode = " + (stream != nullptr ? getOboeString (stream->getSharingMode()) : String ("?"))\r
+                 + "\nDirection = " + (stream != nullptr ? String (oboe::convertToText (stream->getDirection())) : String ("?"))\r
+                 + "\nSharingMode = " + (stream != nullptr ? String (oboe::convertToText (stream->getSharingMode())) : String ("?"))\r
                  + "\nChannelCount = " + (stream != nullptr ? String (stream->getChannelCount()) : String ("?"))\r
-                 + "\nFormat = " + (stream != nullptr ? getOboeString (stream->getFormat()) : String ("?"))\r
+                 + "\nFormat = " + (stream != nullptr ? String (oboe::convertToText (stream->getFormat())) : String ("?"))\r
                  + "\nSampleRate = " + (stream != nullptr ? String (stream->getSampleRate()) : String ("?"))\r
                  + "\nBufferSizeInFrames = " + (stream != nullptr ? String (stream->getBufferSizeInFrames()) : String ("?"))\r
                  + "\nBufferCapacityInFrames = " + (stream != nullptr ? String (stream->getBufferCapacityInFrames()) : String ("?"))\r
@@ -565,7 +549,7 @@ private:
                  + "\nFramesPerCallback = " + (stream != nullptr ? String (stream->getFramesPerCallback()) : String ("?"))\r
                  + "\nBytesPerFrame = " + (stream != nullptr ? String (stream->getBytesPerFrame()) : String ("?"))\r
                  + "\nBytesPerSample = " + (stream != nullptr ? String (stream->getBytesPerSample()) : String ("?"))\r
-                 + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency));\r
+                 + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency)));\r
         }\r
 \r
         void close()\r
@@ -573,10 +557,27 @@ private:
             if (stream != nullptr)\r
             {\r
                 oboe::Result result = stream->close();\r
-                JUCE_OBOE_LOG ("Requested Oboe stream close with result: " + getOboeString (result));\r
+                JUCE_OBOE_LOG ("Requested Oboe stream close with result: " + String (oboe::convertToText (result)));\r
             }\r
         }\r
 \r
+        int getDefaultFramesPerBurst() const\r
+        {\r
+            // NB: this function only works for inbuilt speakers and headphones\r
+            auto* env = getEnv();\r
+\r
+            auto audioManager = LocalRef<jobject> (env->CallObjectMethod (android.activity,\r
+                                                                          JuceAppActivity.getSystemService,\r
+                                                                          javaString ("audio").get()));\r
+\r
+            auto propertyJavaString = javaString ("android.media.property.OUTPUT_FRAMES_PER_BUFFER");\r
+\r
+            auto framesPerBurstString = LocalRef<jstring> ((jstring) android.activity.callObjectMethod (JuceAppActivity.audioManagerGetProperty,\r
+                                                                                                        propertyJavaString.get()));\r
+\r
+            return framesPerBurstString != 0 ? env->CallStaticIntMethod (JavaInteger, JavaInteger.parseInt, framesPerBurstString.get(), 10) : 192;\r
+        }\r
+\r
         oboe::AudioStream* stream = nullptr;\r
         oboe::Result openResult;\r
     };\r
@@ -668,14 +669,20 @@ private:
         void checkStreamSetup (OboeStream* stream, int deviceId, int numChannels, int sampleRate,\r
                                int bufferSize, oboe::AudioFormat format)\r
         {\r
-            if (auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr)\r
+            auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr;\r
+\r
+            if (nativeStream != nullptr)\r
             {\r
                 ignoreUnused (deviceId, numChannels, sampleRate, bufferSize);\r
                 ignoreUnused (streamFormat, bitDepth);\r
 \r
-                jassert (numChannels == nativeStream->getChannelCount());\r
-                jassert (sampleRate == 0 || sampleRate == nativeStream->getSampleRate());\r
+                jassert (deviceId = nativeStream->getDeviceId());\r
+                jassert (numChannels = nativeStream->getChannelCount());\r
+                jassert (sampleRate == nativeStream->getSampleRate());\r
                 jassert (format == nativeStream->getFormat());\r
+\r
+                if (nativeStream->usesAAudio())\r
+                    jassert (bufferSize == nativeStream->getBufferSizeInFrames());\r
             }\r
         }\r
 \r
@@ -730,8 +737,7 @@ private:
 \r
             outputStream->start();\r
 \r
-            isInputLatencyDetectionSupported  = isLatencyDetectionSupported (inputStream.get());\r
-            isOutputLatencyDetectionSupported = isLatencyDetectionSupported (outputStream.get());\r
+            checkIsOutputLatencyDetectionSupported();\r
         }\r
 \r
         void stop() override\r
@@ -746,16 +752,19 @@ private:
         }\r
 \r
         int getOutputLatencyInSamples() override    { return outputLatency; }\r
-        int getInputLatencyInSamples() override     { return inputLatency; }\r
+        int getInputLatencyInSamples() override     { return -1; }\r
 \r
     private:\r
-        bool isLatencyDetectionSupported (OboeStream* stream)\r
+        void checkIsOutputLatencyDetectionSupported()\r
         {\r
-            if (stream == nullptr || ! openedOk())\r
-                return false;\r
+            if (! openedOk())\r
+            {\r
+                isOutputLatencyDetectionSupported = false;\r
+                return;\r
+            }\r
 \r
-            auto result = stream->getNativeStream()->getTimestamp (CLOCK_MONOTONIC, 0, 0);\r
-            return result != oboe::Result::ErrorUnimplemented;\r
+            auto result = outputStream->getNativeStream()->getTimestamp (CLOCK_MONOTONIC, 0, 0);\r
+            isOutputLatencyDetectionSupported = result != oboe::Result::ErrorUnimplemented;\r
         }\r
 \r
         oboe::DataCallbackResult onAudioReady (oboe::AudioStream* stream, void* audioData, int32_t numFrames) override\r
@@ -781,28 +790,26 @@ private:
 \r
                     if (nativeInputStream->getFormat() != oboe::AudioFormat::I16 && nativeInputStream->getFormat() != oboe::AudioFormat::Float)\r
                     {\r
-                        JUCE_OBOE_LOG ("Unsupported input stream audio format: " + getOboeString (nativeInputStream->getFormat()));\r
+                        JUCE_OBOE_LOG ("Unsupported input stream audio format: " + String (oboe::convertToText (nativeInputStream->getFormat())));\r
                         jassertfalse;\r
                         return oboe::DataCallbackResult::Continue;\r
                     }\r
 \r
                     auto result = inputStream->getNativeStream()->read (inputStreamNativeBuffer.getData(), numFrames, 0);\r
 \r
-                    if (result)\r
+                    if (result >= 0)\r
                     {\r
                         OboeAudioIODeviceBufferHelpers<SampleType>::referAudioBufferDirectlyToOboeIfPossible (inputStreamNativeBuffer.get(),\r
                                                                                                               inputStreamSampleBuffer,\r
-                                                                                                              result.value());\r
+                                                                                                              result);\r
 \r
-                        OboeAudioIODeviceBufferHelpers<SampleType>::convertFromOboe (inputStreamNativeBuffer.get(), inputStreamSampleBuffer, result.value());\r
+                        OboeAudioIODeviceBufferHelpers<SampleType>::convertFromOboe (inputStreamNativeBuffer.get(), inputStreamSampleBuffer, result);\r
                     }\r
                     else\r
                     {\r
-                        JUCE_OBOE_LOG ("Failed to read from input stream: " + getOboeString (result.error()));\r
+                        // Failed to read from input stream.\r
+                        jassertfalse;\r
                     }\r
-\r
-                    if (isInputLatencyDetectionSupported)\r
-                        inputLatency = getLatencyFor (*inputStream);\r
                 }\r
 \r
                 //-----------------\r
@@ -825,7 +832,7 @@ private:
                 OboeAudioIODeviceBufferHelpers<SampleType>::convertToOboe (outputStreamSampleBuffer, static_cast<SampleType*> (audioData), numFrames);\r
 \r
                 if (isOutputLatencyDetectionSupported)\r
-                    outputLatency = getLatencyFor (*outputStream);\r
+                    calculateOutputLatency();\r
 \r
                 audioCallbackGuard.set (0);\r
             }\r
@@ -838,10 +845,10 @@ private:
             ignoreUnused (stream);\r
 \r
             JUCE_OBOE_LOG ("\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
-                 + "\nDirection = " + (stream != nullptr ? getOboeString (stream->getDirection()) : String ("?"))\r
-                 + "\nSharingMode = " + (stream != nullptr ? getOboeString (stream->getSharingMode()) : String ("?"))\r
+                 + "\nDirection = " + (stream != nullptr ? String (oboe::convertToText (stream->getDirection())) : String ("?"))\r
+                 + "\nSharingMode = " + (stream != nullptr ? String (oboe::convertToText (stream->getSharingMode())) : String ("?"))\r
                  + "\nChannelCount = " + (stream != nullptr ? String (stream->getChannelCount()) : String ("?"))\r
-                 + "\nFormat = " + (stream != nullptr ? getOboeString (stream->getFormat()) : String ("?"))\r
+                 + "\nFormat = " + (stream != nullptr ? String (oboe::convertToText (stream->getFormat())) : String ("?"))\r
                  + "\nSampleRate = " + (stream != nullptr ? String (stream->getSampleRate()) : String ("?"))\r
                  + "\nBufferSizeInFrames = " + (stream != nullptr ? String (stream->getBufferSizeInFrames()) : String ("?"))\r
                  + "\nBufferCapacityInFrames = " + (stream != nullptr ? String (stream->getBufferCapacityInFrames()) : String ("?"))\r
@@ -849,48 +856,34 @@ private:
                  + "\nFramesPerCallback = " + (stream != nullptr ? String (stream->getFramesPerCallback()) : String ("?"))\r
                  + "\nBytesPerFrame = " + (stream != nullptr ? String (stream->getBytesPerFrame()) : String ("?"))\r
                  + "\nBytesPerSample = " + (stream != nullptr ? String (stream->getBytesPerSample()) : String ("?"))\r
-                 + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency)\r
+                 + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency))\r
                  + "\ngetDeviceId = " + (stream != nullptr ? String (stream->getDeviceId()) : String ("?")));\r
         }\r
 \r
-        int getLatencyFor (OboeStream& stream)\r
+        void calculateOutputLatency()\r
         {\r
-            auto& nativeStream = *stream.getNativeStream();\r
-\r
-            if (auto latency = nativeStream.calculateLatencyMillis())\r
-                return static_cast<int> ((latency.value() * sampleRate) / 1000);\r
+            // Sadly, Oboe uses non-portable int64_t (a.k.a. long on LP64 and long long on LLP64)\r
+            int64_t lastWrittenAndPresentedFrameIndex = 0;\r
+            int64_t lastFramePresentationTimeNanos = 0;\r
 \r
-            // Get the time that a known audio frame was presented.\r
-            int64_t hardwareFrameIndex = 0;\r
-            int64_t hardwareFrameHardwareTime = 0;\r
-\r
-            auto result = nativeStream.getTimestamp (CLOCK_MONOTONIC,\r
-                                                     &hardwareFrameIndex,\r
-                                                     &hardwareFrameHardwareTime);\r
+            auto result = outputStream->getNativeStream()->getTimestamp (CLOCK_MONOTONIC,\r
+                                                                         &lastWrittenAndPresentedFrameIndex,\r
+                                                                         &lastFramePresentationTimeNanos);\r
 \r
             if (result != oboe::Result::OK)\r
-                return 0;\r
+                return;\r
 \r
-            // Get counter closest to the app.\r
-            const bool isOutput = nativeStream.getDirection() == oboe::Direction::Output;\r
-            const int64_t appFrameIndex = isOutput ? nativeStream.getFramesWritten() : nativeStream.getFramesRead();\r
+            int64_t currentNumFramesWritten = outputStream->getNativeStream()->getFramesWritten();\r
+            int64_t framesDelta = currentNumFramesWritten - lastWrittenAndPresentedFrameIndex;\r
+            int64_t timeDeltaNanos = framesDelta * oboe::kNanosPerSecond / sampleRate;\r
 \r
-            // Assume that the next frame will be processed at the current time\r
-            using namespace std::chrono;\r
-            int64_t appFrameAppTime = getCurrentTimeNanos();//duration_cast<nanoseconds> (steady_clock::now().time_since_epoch()).count();\r
-            int64_t appFrameAppTime2 = duration_cast<nanoseconds> (steady_clock::now().time_since_epoch()).count();\r
+            int64_t nextPresentationTimeNanos = lastFramePresentationTimeNanos + timeDeltaNanos;\r
+            int64_t nextFrameWriteTimeNanos = getCurrentTimeNanos();\r
 \r
-            // Calculate the number of frames between app and hardware\r
-            int64_t frameIndexDelta = appFrameIndex - hardwareFrameIndex;\r
+            if (nextFrameWriteTimeNanos < 0)\r
+                return;\r
 \r
-            // Calculate the time which the next frame will be or was presented\r
-            int64_t frameTimeDelta = (frameIndexDelta * oboe::kNanosPerSecond) / sampleRate;\r
-            int64_t appFrameHardwareTime = hardwareFrameHardwareTime + frameTimeDelta;\r
-\r
-            // Calculate latency as a difference in time between when the current frame is at the app\r
-            // and when it is at the hardware.\r
-            auto latencyNanos = isOutput ? (appFrameHardwareTime - appFrameAppTime) : (appFrameAppTime - appFrameHardwareTime);\r
-            return static_cast<int> ((latencyNanos  * sampleRate) / oboe::kNanosPerSecond);\r
+            outputLatency = (int) ((nextPresentationTimeNanos - nextFrameWriteTimeNanos) * sampleRate / oboe::kNanosPerSecond);\r
         }\r
 \r
         int64_t getCurrentTimeNanos()\r
@@ -905,23 +898,19 @@ private:
 \r
         void onErrorBeforeClose (oboe::AudioStream* stream, oboe::Result error) override\r
         {\r
-            attachAndroidJNI();\r
-\r
             // only output stream should be the master stream receiving callbacks\r
             jassert (stream->getDirection() == oboe::Direction::Output);\r
 \r
-            JUCE_OBOE_LOG ("Oboe stream onErrorBeforeClose(): " + getOboeString (error));\r
+            JUCE_OBOE_LOG ("Oboe stream onErrorBeforeClose(): " + String (oboe::convertToText (error)));\r
             printStreamDebugInfo (stream);\r
         }\r
 \r
         void onErrorAfterClose (oboe::AudioStream* stream, oboe::Result error) override\r
         {\r
-            attachAndroidJNI();\r
-\r
             // only output stream should be the master stream receiving callbacks\r
             jassert (stream->getDirection() == oboe::Direction::Output);\r
 \r
-            JUCE_OBOE_LOG ("Oboe stream onErrorAfterClose(): " + getOboeString (error));\r
+            JUCE_OBOE_LOG ("Oboe stream onErrorAfterClose(): " + String (oboe::convertToText (error)));\r
 \r
             if (error == oboe::Result::ErrorDisconnected)\r
             {\r
@@ -957,10 +946,7 @@ private:
         Atomic<int> audioCallbackGuard { 0 },\r
                     streamRestartGuard { 0 };\r
 \r
-        bool isInputLatencyDetectionSupported = false;\r
-        int inputLatency = -1;\r
-\r
-        bool isOutputLatencyDetectionSupported = false;\r
+        bool isOutputLatencyDetectionSupported = true;\r
         int outputLatency = -1;\r
     };\r
 \r
@@ -986,6 +972,14 @@ private:
 \r
     bool running = false;\r
 \r
+    enum\r
+    {\r
+        // These at the moment correspond to OpenSL settings.\r
+        bufferSizeMultForLowLatency = 4,\r
+        bufferSizeMultForSlowAudio = 8,\r
+        defaultBufferSizeIsMultipleOfNative = 1\r
+    };\r
+\r
     //==============================================================================\r
     static String audioManagerGetProperty (const String& property)\r
     {\r
@@ -1020,23 +1014,6 @@ private:
         return androidHasSystemFeature ("android.hardware.audio.pro");\r
     }\r
 \r
-    static int getDefaultFramesPerBurst()\r
-    {\r
-        // NB: this function only works for inbuilt speakers and headphones\r
-        auto* env = getEnv();\r
-\r
-        auto audioManager = LocalRef<jobject> (env->CallObjectMethod (android.activity,\r
-                                                                      JuceAppActivity.getSystemService,\r
-                                                                      javaString ("audio").get()));\r
-\r
-        auto propertyJavaString = javaString ("android.media.property.OUTPUT_FRAMES_PER_BUFFER");\r
-\r
-        auto framesPerBurstString = LocalRef<jstring> ((jstring) android.activity.callObjectMethod (JuceAppActivity.audioManagerGetProperty,\r
-                                                                                                    propertyJavaString.get()));\r
-\r
-        return framesPerBurstString != 0 ? env->CallStaticIntMethod (JavaInteger, JavaInteger.parseInt, framesPerBurstString.get(), 10) : 192;\r
-    }\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OboeAudioIODevice)\r
 };\r
 \r
@@ -1119,7 +1096,7 @@ public:
                                forInput ? oboe::Direction::Input : oboe::Direction::Output,\r
                                oboe::SharingMode::Shared,\r
                                forInput ? 1 : 2,\r
-                               getSDKVersion() >= 21 ? oboe::AudioFormat::Float : oboe::AudioFormat::I16,\r
+                               getSdkVersion() >= 21 ? oboe::AudioFormat::Float : oboe::AudioFormat::I16,\r
                                (int) OboeAudioIODevice::getNativeSampleRate(),\r
                                OboeAudioIODevice::getNativeBufferSize(),\r
                                nullptr);\r
@@ -1138,17 +1115,18 @@ public:
 \r
     int getIndexOfDevice (AudioIODevice* device, bool asInput) const override\r
     {\r
-        if (auto oboeDevice = static_cast<OboeAudioIODevice*> (device))\r
-        {\r
-            auto oboeDeviceId = asInput ? oboeDevice->inputDeviceId\r
-                                        : oboeDevice->outputDeviceId;\r
+        if (device == nullptr)\r
+            return -1;\r
 \r
-            auto& devices = asInput ? inputDevices : outputDevices;\r
+        auto* oboeDevice = static_cast<OboeAudioIODevice*> (device);\r
+        auto oboeDeviceId = asInput ? oboeDevice->inputDeviceId\r
+                                    : oboeDevice->outputDeviceId;\r
 \r
-            for (int i = 0; i < devices.size(); ++i)\r
-                if (devices.getReference (i).id == oboeDeviceId)\r
-                    return i;\r
-        }\r
+        auto& devices = asInput ? inputDevices : outputDevices;\r
+\r
+        for (int i = 0; i < devices.size(); ++i)\r
+            if (devices.getReference (i).id == oboeDeviceId)\r
+                return i;\r
 \r
         return -1;\r
     }\r
@@ -1253,11 +1231,11 @@ public:
 \r
     bool supportsDevicesInfo() const\r
     {\r
-        static auto result = getSDKVersion() >= 23;\r
+        static auto result = getSdkVersion() >= 23;\r
         return result;\r
     }\r
 \r
-    int getSDKVersion() const\r
+    int getSdkVersion() const\r
     {\r
         static auto sdkVersion = getEnv()->GetStaticIntField (AndroidBuildVersion, AndroidBuildVersion.SDK_INT);\r
         return sdkVersion;\r
@@ -1419,7 +1397,7 @@ public:
         return testStream != nullptr && testStream->openedOk();\r
     }\r
 \r
-    pthread_t startThread (void*(*entry)(void*), void* userPtr)\r
+    pthread_t startThread (void* (*entry) (void*), void* userPtr)\r
     {\r
         pthread_mutex_lock (&threadReadyMutex);\r
 \r
@@ -1459,16 +1437,26 @@ public:
 \r
     void onErrorBeforeClose (oboe::AudioStream*, oboe::Result error) override\r
     {\r
-        JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorBeforeClose(): " + getOboeString (error));\r
-        ignoreUnused (error);\r
-        jassertfalse;  // Should never get here!\r
+        JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorBeforeClose(): " + String (oboe::convertToText (error)));\r
     }\r
 \r
-    void onErrorAfterClose (oboe::AudioStream*, oboe::Result error) override\r
+    void onErrorAfterClose (oboe::AudioStream* stream, oboe::Result error) override\r
     {\r
-        JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorAfterClose(): " + getOboeString (error));\r
-        ignoreUnused (error);\r
-        jassertfalse;  // Should never get here!\r
+        JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorAfterClose(): " + String (oboe::convertToText (error)));\r
+\r
+        if (error == oboe::Result::ErrorDisconnected)\r
+        {\r
+            testStream.reset();\r
+            testStream.reset (new OboeStream (-1,\r
+                                              oboe::Direction::Output,\r
+                                              oboe::SharingMode::Exclusive,\r
+                                              1,\r
+                                              formatUsed,\r
+                                              (int) OboeAudioIODevice::getNativeSampleRate(),\r
+                                              OboeAudioIODevice::getNativeBufferSize(),\r
+                                              this));\r
+            testStream->start();\r
+        }\r
     }\r
 \r
 private:\r
@@ -1492,7 +1480,10 @@ pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr)
         return {};\r
 \r
     auto threadID = thread->startThread (entry, userPtr);\r
-    thread.release();  // the thread will de-allocate itself\r
+\r
+    // the thread will de-allocate itself\r
+    thread.release();\r
+\r
     return threadID;\r
 }\r
 \r
index d24b5b0285eaa8396ebfceb75a93a81a6bea206b..fa610109b8201f0f9a516875ecb1d1b4ecfd5332 100644 (file)
@@ -60,22 +60,6 @@ SLInterfaceID_ IntfIID<SLRecordItf_>::iid                   = { 0xc5657aa0, 0xdd
 SLInterfaceID_ IntfIID<SLAndroidSimpleBufferQueueItf_>::iid = { 0x198e4940, 0xc5d7, 0x11df, 0xa2a6, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} };\r
 SLInterfaceID_ IntfIID<SLAndroidConfigurationItf_>::iid     = { 0x89f6a7e0, 0xbeac, 0x11df, 0x8b5c, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} };\r
 \r
-template <typename SLObjectType>\r
-static void destroyObject (SLObjectType object)\r
-{\r
-    if (object != nullptr && *object != nullptr)\r
-        (*object)->Destroy (object);\r
-}\r
-\r
-template <>\r
-struct ContainerDeletePolicy<const SLObjectItf_* const>\r
-{\r
-    static void destroy (SLObjectItf object)\r
-    {\r
-        destroyObject (object);\r
-    }\r
-};\r
-\r
 //==============================================================================\r
 // Some life-time and type management of OpenSL objects\r
 class SlObjectRef\r
@@ -83,34 +67,27 @@ class SlObjectRef
 public:\r
     //==============================================================================\r
     SlObjectRef() noexcept {}\r
-    SlObjectRef (const SlObjectRef& obj) noexcept : cb (obj.cb) {}\r
+    SlObjectRef (const SlObjectRef&  obj) noexcept : cb (obj.cb) {}\r
     SlObjectRef (SlObjectRef&& obj) noexcept : cb (static_cast<ReferenceCountedObjectPtr<ControlBlock>&&> (obj.cb)) { obj.cb = nullptr; }\r
     explicit SlObjectRef (SLObjectItf o) : cb (new ControlBlock (o)) {}\r
 \r
     //==============================================================================\r
-    SlObjectRef& operator= (const SlObjectRef& r) noexcept  { cb = r.cb; return *this; }\r
-    SlObjectRef& operator= (SlObjectRef&& r) noexcept       { cb = static_cast<ReferenceCountedObjectPtr<ControlBlock>&&> (r.cb); r.cb = nullptr; return *this; }\r
-    SlObjectRef& operator= (std::nullptr_t) noexcept        { cb = nullptr; return *this; }\r
+    SlObjectRef& operator=(const SlObjectRef& r)   noexcept { cb = r.cb; return *this; }\r
+    SlObjectRef& operator=(SlObjectRef&& r)        noexcept { cb = static_cast<ReferenceCountedObjectPtr<ControlBlock>&&> (r.cb); r.cb = nullptr; return *this; }\r
+    SlObjectRef& operator=(std::nullptr_t) noexcept   { cb = nullptr; return *this; }\r
 \r
     //==============================================================================\r
-    const SLObjectItf_* operator*() noexcept                { return *cb->ptr.get(); }\r
-    SLObjectItf operator->() noexcept                       { return (cb == nullptr ? nullptr :  cb->ptr.get()); }\r
-    operator SLObjectItf() noexcept                         { return (cb == nullptr ? nullptr :  cb->ptr.get()); }\r
+    const SLObjectItf_* const  operator*()  noexcept  { return *cb->ptr.get(); }\r
+    SLObjectItf operator->() noexcept  { return (cb == nullptr ? nullptr :  cb->ptr.get()); }\r
+    operator SLObjectItf()   noexcept  { return (cb == nullptr ? nullptr :  cb->ptr.get()); }\r
 \r
     //==============================================================================\r
-    bool operator== (nullptr_t) const noexcept              { return (cb == nullptr || cb->ptr == nullptr); }\r
-    bool operator!= (nullptr_t) const noexcept              { return (cb != nullptr && cb->ptr != nullptr); }\r
-\r
+    bool operator== (nullptr_t) const noexcept  { return (cb == nullptr || cb->ptr == nullptr); }\r
+    bool operator!= (nullptr_t) const noexcept  { return (cb != nullptr && cb->ptr != nullptr); }\r
 private:\r
-    //==============================================================================\r
-    struct ControlBlock : ReferenceCountedObject\r
-    {\r
-        ControlBlock() = default;\r
-        ControlBlock (SLObjectItf o) : ptr (o) {}\r
-\r
-        std::unique_ptr<const SLObjectItf_* const> ptr;\r
-    };\r
 \r
+    //==============================================================================\r
+    struct ControlBlock : ReferenceCountedObject { std::unique_ptr<const SLObjectItf_* const> ptr; ControlBlock() {} ControlBlock (SLObjectItf o) : ptr (o) {} };\r
     ReferenceCountedObjectPtr<ControlBlock> cb;\r
 };\r
 \r
@@ -119,53 +96,53 @@ class SlRef : public SlObjectRef
 {\r
 public:\r
     //==============================================================================\r
-    SlRef() noexcept {}\r
-    SlRef (const SlRef& r) noexcept : SlObjectRef (r), type (r.type) {}\r
+    SlRef() noexcept : type (nullptr) {}\r
+    SlRef (SlRef& r)  noexcept : SlObjectRef (r), type (r.type) {}\r
     SlRef (SlRef&& r) noexcept : SlObjectRef (static_cast<SlRef&&> (r)), type (r.type) { r.type = nullptr; }\r
 \r
     //==============================================================================\r
     SlRef& operator= (const SlRef& r)  noexcept { SlObjectRef::operator= (r); type = r.type; return *this; }\r
-    SlRef& operator= (SlRef&& r) noexcept       { SlObjectRef::operator= (static_cast<SlObjectRef&&> (r)); type = r.type; r.type = nullptr; return *this; }\r
-    SlRef& operator= (std::nullptr_t) noexcept  { SlObjectRef::operator= (nullptr); type = nullptr; return *this; }\r
+    SlRef& operator= (SlRef&& r) noexcept { SlObjectRef::operator= (static_cast<SlObjectRef&&> (r)); type = r.type; r.type = nullptr; return *this; }\r
+    SlRef& operator= (std::nullptr_t) noexcept { SlObjectRef::operator= (nullptr); type = nullptr; return *this; }\r
 \r
     //==============================================================================\r
-    T* const operator*() noexcept               { return *type; }\r
-    T* const* operator->() noexcept             { return type; }\r
-    operator T* const*() noexcept               { return type; }\r
+    T* const operator*()  noexcept { return *type; }\r
+    T* const * operator->() noexcept { return type; }\r
+    operator T* const *()   noexcept { return type; }\r
 \r
     //==============================================================================\r
-    static SlRef cast (SlObjectRef&  base)      { return SlRef (base); }\r
-    static SlRef cast (SlObjectRef&& base)      { return SlRef (static_cast<SlObjectRef&&> (base)); }\r
-\r
+    static SlRef cast (SlObjectRef&  base) { return SlRef (base); }\r
+    static SlRef cast (SlObjectRef&& base) { return SlRef (static_cast<SlObjectRef&&> (base)); }\r
 private:\r
+    //==============================================================================\r
     SlRef (SlObjectRef& base) : SlObjectRef (base)\r
     {\r
-        if (auto obj = SlObjectRef::operator->())\r
-        {\r
-            auto err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
-\r
-            if (type != nullptr && err == SL_RESULT_SUCCESS)\r
-                return;\r
-        }\r
-\r
-        *this = nullptr;\r
+        SLObjectItf obj = SlObjectRef::operator->();\r
+        SLresult err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
+        if (type == nullptr || err != SL_RESULT_SUCCESS)\r
+            *this = nullptr;\r
     }\r
 \r
     SlRef (SlObjectRef&& base) : SlObjectRef (static_cast<SlObjectRef&&> (base))\r
     {\r
-        if (auto obj = SlObjectRef::operator->())\r
-        {\r
-            auto err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
-            base = nullptr;\r
+        SLObjectItf obj = SlObjectRef::operator->();\r
+        SLresult err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
+        base = nullptr;\r
 \r
-            if (type != nullptr && err == SL_RESULT_SUCCESS)\r
-                return;\r
-        }\r
-\r
-        *this = nullptr;\r
+        if (type == nullptr || err != SL_RESULT_SUCCESS)\r
+            *this = nullptr;\r
     }\r
+    T* const * type;\r
+};\r
 \r
-    T* const* type = nullptr;\r
+template <>\r
+struct ContainerDeletePolicy<const SLObjectItf_* const>\r
+{\r
+    static void destroy (SLObjectItf object)\r
+    {\r
+        if (object != nullptr)\r
+            (*object)->Destroy (object);\r
+    }\r
 };\r
 \r
 //==============================================================================\r
@@ -304,7 +281,8 @@ public:
               numChannels (numChannelsToUse),\r
               nativeBuffer (static_cast<size_t> (numChannels * owner.bufferSize * owner.numBuffers)),\r
               scratchBuffer (numChannelsToUse, owner.bufferSize),\r
-              sampleBuffer (scratchBuffer.getArrayOfWritePointers(), numChannelsToUse, owner.bufferSize)\r
+              sampleBuffer (scratchBuffer.getArrayOfWritePointers(), numChannelsToUse, owner.bufferSize),\r
+              nextBlock (0), numBlocksOut (0)\r
         {}\r
 \r
         ~OpenSLQueueRunner()\r
@@ -319,7 +297,6 @@ public:
         bool init()\r
         {\r
             runner = crtp().createPlayerOrRecorder();\r
-\r
             if (runner == nullptr)\r
                 return false;\r
 \r
@@ -342,13 +319,13 @@ public:
             }\r
 \r
             queue = SlRef<SLAndroidSimpleBufferQueueItf_>::cast (runner);\r
-\r
             if (queue == nullptr)\r
                 return false;\r
 \r
             return ((*queue)->RegisterCallback (queue, staticFinished, this) == SL_RESULT_SUCCESS);\r
         }\r
 \r
+\r
         void clear()\r
         {\r
             nextBlock.set (0);\r
@@ -399,7 +376,7 @@ public:
         HeapBlock<T> nativeBuffer;\r
         AudioBuffer<float> scratchBuffer, sampleBuffer;\r
 \r
-        Atomic<int> nextBlock { 0 }, numBlocksOut { 0 };\r
+        Atomic<int> nextBlock, numBlocksOut;\r
     };\r
 \r
     //==============================================================================\r
@@ -408,36 +385,35 @@ public:
     {\r
         using Base = OpenSLQueueRunner<T, OpenSLQueueRunnerPlayer<T>, SLPlayItf_>;\r
 \r
+        enum { isPlayer = 1 };\r
+\r
         OpenSLQueueRunnerPlayer (OpenSLSessionT<T>& sessionToUse, int numChannelsToUse)\r
             : Base (sessionToUse, numChannelsToUse)\r
         {}\r
 \r
         SlRef<SLPlayItf_> createPlayerOrRecorder()\r
         {\r
-            SLDataLocator_AndroidSimpleBufferQueue queueLocator = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers) };\r
-            SLDataLocator_OutputMix outputMix = { SL_DATALOCATOR_OUTPUTMIX, Base::owner.outputMix };\r
+            SLDataLocator_AndroidSimpleBufferQueue queueLocator = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers)};\r
+            SLDataLocator_OutputMix outputMix = {SL_DATALOCATOR_OUTPUTMIX, Base::owner.outputMix};\r
 \r
             PCMDataFormatEx dataFormat;\r
             BufferHelpers<T>::initPCMDataFormat (dataFormat, Base::numChannels, Base::owner.sampleRate);\r
 \r
-            SLDataSource source = { &queueLocator, &dataFormat };\r
-            SLDataSink   sink   = { &outputMix,    nullptr };\r
+            SLDataSource source = {&queueLocator, &dataFormat};\r
+            SLDataSink   sink   = {&outputMix,    nullptr};\r
 \r
             SLInterfaceID queueInterfaces[] = { &IntfIID<SLAndroidSimpleBufferQueueItf_>::iid, &IntfIID<SLAndroidConfigurationItf_>::iid };\r
             SLboolean interfaceRequired[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE};\r
 \r
             SLObjectItf obj = nullptr;\r
 \r
-            if (auto e = *Base::owner.engine)\r
+            SLresult status = (*Base::owner.engine)->CreateAudioPlayer (Base::owner.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired);\r
+            if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
             {\r
-                auto status = e->CreateAudioPlayer (Base::owner.engine, &obj, &source, &sink, 2,\r
-                                                    queueInterfaces, interfaceRequired);\r
+                if (obj != nullptr)\r
+                    (*obj)->Destroy (obj);\r
 \r
-                if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize(obj, 0) != SL_RESULT_SUCCESS)\r
-                {\r
-                    destroyObject (obj);\r
-                    return {};\r
-                }\r
+                return SlRef<SLPlayItf_>();\r
             }\r
 \r
             return SlRef<SLPlayItf_>::cast (SlObjectRef (obj));\r
@@ -447,42 +423,44 @@ public:
     };\r
 \r
     template <typename T>\r
-    struct OpenSLQueueRunnerRecorder  : public OpenSLQueueRunner<T, OpenSLQueueRunnerRecorder<T>, SLRecordItf_>\r
+    struct OpenSLQueueRunnerRecorder      : OpenSLQueueRunner<T, OpenSLQueueRunnerRecorder<T>, SLRecordItf_>\r
     {\r
         using Base = OpenSLQueueRunner<T, OpenSLQueueRunnerRecorder<T>, SLRecordItf_>;\r
 \r
+        enum { isPlayer = 0 };\r
+\r
         OpenSLQueueRunnerRecorder (OpenSLSessionT<T>& sessionToUse, int numChannelsToUse)\r
             : Base (sessionToUse, numChannelsToUse)\r
         {}\r
 \r
         SlRef<SLRecordItf_> createPlayerOrRecorder()\r
         {\r
-            SLDataLocator_IODevice ioDeviceLocator = { SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, nullptr };\r
-            SLDataLocator_AndroidSimpleBufferQueue queueLocator = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers) };\r
+            SLDataLocator_IODevice ioDeviceLocator = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, nullptr};\r
+            SLDataLocator_AndroidSimpleBufferQueue queueLocator = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers)};\r
 \r
             PCMDataFormatEx dataFormat;\r
             BufferHelpers<T>::initPCMDataFormat (dataFormat, Base::numChannels, Base::owner.sampleRate);\r
 \r
-            SLDataSource source = { &ioDeviceLocator, nullptr };\r
-            SLDataSink   sink   = { &queueLocator,    &dataFormat };\r
+            SLDataSource source = {&ioDeviceLocator, nullptr};\r
+            SLDataSink   sink   = {&queueLocator,    &dataFormat};\r
 \r
             SLInterfaceID queueInterfaces[] = { &IntfIID<SLAndroidSimpleBufferQueueItf_>::iid, &IntfIID<SLAndroidConfigurationItf_>::iid };\r
-            SLboolean interfaceRequired[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE };\r
+            SLboolean interfaceRequired[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE};\r
 \r
             SLObjectItf obj = nullptr;\r
 \r
-            if (auto e = *Base::owner.engine)\r
+            SLresult status = (*Base::owner.engine)->CreateAudioRecorder (Base::owner.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired);\r
+            if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
             {\r
-                auto status = e->CreateAudioRecorder (Base::owner.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired);\r
+                if (obj != nullptr)\r
+                    (*obj)->Destroy (obj);\r
 \r
-                if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
-                {\r
-                    destroyObject (obj);\r
-                    return {};\r
-                }\r
+                return SlRef<SLRecordItf_>();\r
             }\r
 \r
-            return SlRef<SLRecordItf_>::cast (SlObjectRef (obj));\r
+            SlRef<SLRecordItf_> recorder = SlRef<SLRecordItf_>::cast (SlObjectRef (obj));\r
+\r
+            return recorder;\r
         }\r
 \r
         bool setAudioPreprocessingEnabled (bool shouldEnable)\r
@@ -490,14 +468,13 @@ public:
             if (Base::config != nullptr)\r
             {\r
                 const bool supportsUnprocessed = (getEnv()->GetStaticIntField (AndroidBuildVersion, AndroidBuildVersion.SDK_INT) >= 25);\r
-\r
                 const SLuint32 recordingPresetValue\r
                     = (shouldEnable ? SL_ANDROID_RECORDING_PRESET_GENERIC\r
                                     : (supportsUnprocessed ? SL_ANDROID_RECORDING_PRESET_UNPROCESSED\r
                                                            : SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION));\r
 \r
-                auto status = (*Base::config)->SetConfiguration (Base::config, SL_ANDROID_KEY_RECORDING_PRESET,\r
-                                                                 &recordingPresetValue, sizeof (recordingPresetValue));\r
+                SLresult status = (*Base::config)->SetConfiguration (Base::config, SL_ANDROID_KEY_RECORDING_PRESET,\r
+                                                                     &recordingPresetValue, sizeof (recordingPresetValue));\r
 \r
                 return (status == SL_RESULT_SUCCESS);\r
             }\r
@@ -505,8 +482,7 @@ public:
             return false;\r
         }\r
 \r
-        void setState (bool running)    { (*Base::runner)->SetRecordState (Base::runner, running ? SL_RECORDSTATE_RECORDING\r
-                                                                                                 : SL_RECORDSTATE_STOPPED); }\r
+        void setState (bool running)    { (*Base::runner)->SetRecordState (Base::runner, running ? SL_RECORDSTATE_RECORDING : SL_RECORDSTATE_STOPPED); }\r
     };\r
 \r
     //==============================================================================\r
@@ -518,19 +494,21 @@ public:
                        double samleRateToUse, int bufferSizeToUse,\r
                        int numBuffersToUse)\r
             : inputChannels (numInputChannels), outputChannels (numOutputChannels),\r
-              sampleRate (samleRateToUse), bufferSize (bufferSizeToUse), numBuffers (numBuffersToUse)\r
+              sampleRate (samleRateToUse), bufferSize (bufferSizeToUse), numBuffers (numBuffersToUse),\r
+              running (false), audioProcessingEnabled (true), callback (nullptr)\r
         {\r
             jassert (numInputChannels > 0 || numOutputChannels > 0);\r
 \r
-            if (auto createEngine = (CreateEngineFunc) slLibraryToUse.getFunction ("slCreateEngine"))\r
+            if (CreateEngineFunc createEngine = (CreateEngineFunc) slLibraryToUse.getFunction ("slCreateEngine"))\r
             {\r
                 SLObjectItf obj = nullptr;\r
-                auto err = createEngine (&obj, 0, nullptr, 0, nullptr, nullptr);\r
 \r
-                if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr\r
-                     || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
+                SLresult err = createEngine (&obj, 0, nullptr, 0, nullptr, nullptr);\r
+                if (err != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
                 {\r
-                    destroyObject (obj);\r
+                    if (obj != nullptr)\r
+                        (*obj)->Destroy (obj);\r
+\r
                     return;\r
                 }\r
 \r
@@ -540,12 +518,13 @@ public:
             if (outputChannels > 0)\r
             {\r
                 SLObjectItf obj = nullptr;\r
-                auto err = (*engine)->CreateOutputMix (engine, &obj, 0, nullptr, nullptr);\r
 \r
-                if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr\r
-                     || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
+                SLresult err = (*engine)->CreateOutputMix (engine, &obj, 0, nullptr, nullptr);\r
+                if (err != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
                 {\r
-                    destroyObject (obj);\r
+                    if (obj != nullptr)\r
+                        (*obj)->Destroy (obj);\r
+\r
                     return;\r
                 }\r
 \r
@@ -558,7 +537,6 @@ public:
         virtual bool openedOK() const    { return (engine != nullptr && (outputChannels == 0 || (outputMix != nullptr))); }\r
         virtual void start()             { stop(); jassert (callback.get() != nullptr); running = true; }\r
         virtual void stop()              { running = false; }\r
-\r
         virtual bool setAudioPreprocessingEnabled (bool shouldEnable) = 0;\r
         virtual bool supportsFloatingPoint() const noexcept = 0;\r
         virtual int getXRunCount() const noexcept = 0;\r
@@ -575,10 +553,9 @@ public:
             jassert (callbackToUse != nullptr);\r
 \r
             // spin-lock until we can set the callback\r
-            for (;;)\r
+            while (true)\r
             {\r
-                auto old = callback.get();\r
-\r
+                AudioIODeviceCallback* old = callback.get();\r
                 if (old == callbackToUse)\r
                     break;\r
 \r
@@ -591,7 +568,7 @@ public:
 \r
         void process (const float** inputChannelData, float** outputChannelData)\r
         {\r
-            if (auto* cb = callback.exchange (nullptr))\r
+            if (AudioIODeviceCallback* cb = callback.exchange(nullptr))\r
             {\r
                 cb->audioDeviceIOCallback (inputChannelData, inputChannels, outputChannelData, outputChannels, bufferSize);\r
                 callback.set (cb);\r
@@ -609,19 +586,19 @@ public:
                                       int numBuffersToUse);\r
 \r
         //==============================================================================\r
-        using CreateEngineFunc = SLresult (*) (SLObjectItf*, SLuint32, const SLEngineOption*,\r
-                                               SLuint32, const SLInterfaceID*, const SLboolean*);\r
+        typedef SLresult (*CreateEngineFunc)(SLObjectItf*, SLuint32, const SLEngineOption*, SLuint32, const SLInterfaceID*, const SLboolean*);\r
 \r
         //==============================================================================\r
         int inputChannels, outputChannels;\r
         double sampleRate;\r
         int bufferSize, numBuffers;\r
-        bool running = false, audioProcessingEnabled = true;\r
+\r
+        bool running, audioProcessingEnabled;\r
 \r
         SlRef<SLEngineItf_> engine;\r
         SlRef<SLOutputMixItf_> outputMix;\r
 \r
-        Atomic<AudioIODeviceCallback*> callback { nullptr };\r
+        Atomic<AudioIODeviceCallback*> callback;\r
     };\r
 \r
     template <typename T>\r
@@ -632,8 +609,7 @@ public:
                         int numInputChannels, int numOutputChannels,\r
                         double samleRateToUse, int bufferSizeToUse,\r
                         int numBuffersToUse)\r
-            : OpenSLSession (slLibraryToUse, numInputChannels, numOutputChannels,\r
-                             samleRateToUse, bufferSizeToUse, numBuffersToUse)\r
+            : OpenSLSession (slLibraryToUse, numInputChannels, numOutputChannels, samleRateToUse, bufferSizeToUse, numBuffersToUse)\r
         {\r
             jassert (numInputChannels > 0 || numOutputChannels > 0);\r
 \r
@@ -668,8 +644,8 @@ public:
 \r
         bool openedOK() const override\r
         {\r
-            return OpenSLSession::openedOK() && (inputChannels == 0  || recorder != nullptr)\r
-                                             && (outputChannels == 0 || player   != nullptr);\r
+            return (OpenSLSession::openedOK() && (inputChannels == 0  || recorder != nullptr)\r
+                                              && (outputChannels == 0 || player   != nullptr));\r
         }\r
 \r
         void start() override\r
@@ -786,7 +762,11 @@ public:
     };\r
 \r
     //==============================================================================\r
-    OpenSLAudioIODevice (const String& deviceName)  : AudioIODevice (deviceName, openSLTypeName)\r
+    OpenSLAudioIODevice (const String& deviceName)\r
+        : AudioIODevice (deviceName, openSLTypeName),\r
+          actualBufferSize (0), sampleRate (0), audioBuffersToEnqueue (0),\r
+          audioProcessingEnabled (true),\r
+          callback (nullptr)\r
     {\r
         // OpenSL has piss-poor support for determining latency, so the only way I can find to\r
         // get a number for this is by asking the AudioTrack/AudioRecord classes..\r
@@ -833,7 +813,7 @@ public:
 \r
     Array<double> getAvailableSampleRates() override\r
     {\r
-        // see https://developer.android.com/ndk/guides/audio/opensl-for-android.html\r
+        //see https://developer.android.com/ndk/guides/audio/opensl-for-android.html\r
 \r
         static const double rates[] = { 8000.0, 11025.0, 12000.0, 16000.0,\r
                                         22050.0, 24000.0, 32000.0, 44100.0, 48000.0 };\r
@@ -841,7 +821,6 @@ public:
 \r
         // make sure the native sample rate is pafrt of the list\r
         double native = getNativeSampleRate();\r
-\r
         if (native != 0.0 && ! retval.contains (native))\r
             retval.add (native);\r
 \r
@@ -871,8 +850,7 @@ public:
         close();\r
 \r
         lastError.clear();\r
-\r
-        sampleRate = (int) (requestedSampleRate > 0 ? requestedSampleRate : getNativeSampleRate());\r
+        sampleRate = (int) requestedSampleRate;\r
 \r
         auto totalPreferredBufferSize    = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize;\r
         auto nativeBufferSize            = getNativeBufferSize();\r
@@ -884,11 +862,11 @@ public:
 \r
         activeOutputChans = outputChannels;\r
         activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false);\r
-        auto numOutputChannels = activeOutputChans.countNumberOfSetBits();\r
+        int numOutputChannels = activeOutputChans.countNumberOfSetBits();\r
 \r
         activeInputChans = inputChannels;\r
         activeInputChans.setRange (1, activeInputChans.getHighestBit(), false);\r
-        auto numInputChannels = activeInputChans.countNumberOfSetBits();\r
+        int numInputChannels = activeInputChans.countNumberOfSetBits();\r
 \r
         if (numInputChannels > 0 && (! RuntimePermissions::isGranted (RuntimePermissions::recordAudio)))\r
         {\r
@@ -901,9 +879,7 @@ public:
         session.reset (OpenSLSession::create (slLibrary, numInputChannels, numOutputChannels,\r
                                               sampleRate, actualBufferSize, audioBuffersToEnqueue));\r
         if (session != nullptr)\r
-        {\r
             session->setAudioPreprocessingEnabled (audioProcessingEnabled);\r
-        }\r
         else\r
         {\r
             if (numInputChannels > 0 && numOutputChannels > 0 && RuntimePermissions::isGranted (RuntimePermissions::recordAudio))\r
@@ -969,7 +945,7 @@ public:
     {\r
         if (session != nullptr && callback != newCallback)\r
         {\r
-            auto oldCallback = callback;\r
+            AudioIODeviceCallback* oldCallback = callback;\r
 \r
             if (newCallback != nullptr)\r
                 newCallback->audioDeviceAboutToStart (this);\r
@@ -1025,12 +1001,12 @@ private:
 \r
     //==============================================================================\r
     DynamicLibrary slLibrary;\r
-    int actualBufferSize = 0, sampleRate = 0, audioBuffersToEnqueue = 0;\r
+    int actualBufferSize, sampleRate, audioBuffersToEnqueue;\r
     int inputLatency, outputLatency;\r
-    bool deviceOpen = false, audioProcessingEnabled = true;\r
+    bool deviceOpen, audioProcessingEnabled;\r
     String lastError;\r
     BigInteger activeOutputChans, activeInputChans;\r
-    AudioIODeviceCallback* callback = nullptr;\r
+    AudioIODeviceCallback* callback;\r
 \r
     std::unique_ptr<OpenSLSession> session;\r
 \r
@@ -1234,12 +1210,12 @@ public:
             SLObjectItf obj = nullptr;\r
             auto err = createEngine (&obj, 0, nullptr, 0, nullptr, nullptr);\r
 \r
-            if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr)\r
+            if (err != SL_RESULT_SUCCESS || obj == nullptr)\r
                 return;\r
 \r
             if ((*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
             {\r
-                destroyObject (obj);\r
+                (*obj)->Destroy (obj);\r
                 return;\r
             }\r
 \r
@@ -1247,7 +1223,7 @@ public:
 \r
             if (engine == nullptr)\r
             {\r
-                destroyObject (obj);\r
+                (*obj)->Destroy (obj);\r
                 return;\r
             }\r
 \r
@@ -1256,7 +1232,7 @@ public:
 \r
             if (err != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
             {\r
-                destroyObject (obj);\r
+                (*obj)->Destroy (obj);\r
                 return;\r
             }\r
 \r
@@ -1264,7 +1240,7 @@ public:
 \r
             if (outputMix == nullptr)\r
             {\r
-                destroyObject (obj);\r
+                (*obj)->Destroy (obj);\r
                 return;\r
             }\r
 \r
@@ -1288,7 +1264,7 @@ public:
 \r
             if ((*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
             {\r
-                destroyObject (obj);\r
+                (*obj)->Destroy (obj);\r
                 return;\r
             }\r
 \r
@@ -1296,7 +1272,7 @@ public:
 \r
             if (player == nullptr)\r
             {\r
-                destroyObject (obj);\r
+                (*obj)->Destroy (obj);\r
                 return;\r
             }\r
 \r
index 58bcb9a5b975e3a9d8ca04eccdcbfb5391570781..23d8d4ffb0c65c7ae786a249164db520c2018c77 100644 (file)
@@ -255,9 +255,10 @@ struct iOSAudioIODevice::Pimpl      : public AudioPlayHead,
 \r
         setAudioSessionActive (true);\r
         updateHardwareInfo();\r
-        channelData.reconfigure ({}, {});\r
         setAudioSessionActive (false);\r
 \r
+        channelData.reconfigure ({}, {});\r
+\r
         sessionHolder->activeDevices.add (this);\r
     }\r
 \r
@@ -450,11 +451,10 @@ struct iOSAudioIODevice::Pimpl      : public AudioPlayHead,
                             << ", targetSampleRate: " << targetSampleRate\r
                             << ", targetBufferSize: " << targetBufferSize);\r
 \r
-        setAudioSessionActive (true);\r
-\r
         channelData.reconfigure (requestedInputChannels, requestedOutputChannels);\r
 \r
         setAudioSessionCategory (channelData.areInputChannelsAvailable() ? AVAudioSessionCategoryPlayAndRecord : AVAudioSessionCategoryPlayback);\r
+        setAudioSessionActive (true);\r
 \r
         setTargetSampleRateAndBufferSize();\r
 \r
index d1ecf48333d1ab0db3b339db956f45aa80edb3b2..b971afc725ab4905558a90aceac0d105745e8c11 100644 (file)
@@ -1115,7 +1115,7 @@ private:
             if (cardNum < 0)\r
                 break;\r
 \r
-            if (JUCE_CHECKED_RESULT (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toRawUTF8(), SND_CTL_NONBLOCK)) >= 0)\r
+            if (JUCE_CHECKED_RESULT (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toUTF8(), SND_CTL_NONBLOCK)) >= 0)\r
             {\r
                 if (JUCE_CHECKED_RESULT (snd_ctl_card_info (handle, info)) >= 0)\r
                 {\r
index a4d000eab435c9f2e4afeb829d984c3bf3d4a70f..cfe8dc891f591d2f3c7b19e8e35b0440b043b7d0 100644 (file)
 namespace juce\r
 {\r
 \r
-//==============================================================================\r
-class BelaMidiInput\r
-{\r
-public:\r
-    static Array<BelaMidiInput*> midiInputs;\r
-\r
-    BelaMidiInput (const String& port, MidiInput* input, MidiInputCallback* callback)\r
-        : midiInput (input), midiPort (port), midiCallback (callback)\r
-    {\r
-        jassert (midiCallback != nullptr);\r
-        midiInputs.add (this);\r
-    }\r
-\r
-    ~BelaMidiInput()\r
-    {\r
-        stop();\r
-        midiInputs.removeAllInstancesOf (this);\r
-    }\r
-\r
-    void start()\r
-    {\r
-        midi.readFrom (midiPort.toRawUTF8());\r
-    }\r
-\r
-    void stop()\r
-    {\r
-        midi.enableParser (false);\r
-    }\r
-\r
-    void poll()\r
-    {\r
-        for (;;)\r
-        {\r
-            auto data = midi.getInput();\r
-\r
-            if (data < 0)\r
-                break;\r
-\r
-            auto byte = (uint8) data;\r
-            concatenator.pushMidiData (&byte, 1, 0.0, midiInput, *midiCallback);\r
-        }\r
-    }\r
-\r
-    static StringArray getDevices (bool input)\r
-    {\r
-        StringArray devices;\r
-\r
-        for (auto& card : findAllALSACardIDs())\r
-            findMidiDevices (devices, input, card);\r
-\r
-        return devices;\r
-    }\r
-\r
-private:\r
-    static Array<int> findAllALSACardIDs()\r
-    {\r
-        Array<int> cards;\r
-        int card = -1;\r
-\r
-        for (;;)\r
-        {\r
-            auto status = snd_card_next (&card);\r
-\r
-            if (status != 0 || card < 0)\r
-                break;\r
-\r
-            cards.add (card);\r
-        }\r
-\r
-        return cards;\r
-    }\r
-\r
-    // Adds all midi devices to the devices array of the given input/output type on the given card\r
-    static void findMidiDevices (StringArray& devices, bool input, int cardNum)\r
-    {\r
-        snd_ctl_t* ctl = nullptr;\r
-        auto status = snd_ctl_open (&ctl, ("hw:" + String (cardNum)).toRawUTF8(), 0);\r
-\r
-        if (status < 0)\r
-            return;\r
-\r
-        int device = -1;\r
-\r
-        for (;;)\r
-        {\r
-            status = snd_ctl_rawmidi_next_device (ctl, &device);\r
-\r
-            if (status < 0 || device < 0)\r
-                break;\r
-\r
-            snd_rawmidi_info_t* info;\r
-            snd_rawmidi_info_alloca (&info);\r
-\r
-            snd_rawmidi_info_set_device (info, device);\r
-            snd_rawmidi_info_set_stream (info, input ? SND_RAWMIDI_STREAM_INPUT\r
-                                                     : SND_RAWMIDI_STREAM_OUTPUT);\r
-\r
-            snd_ctl_rawmidi_info (ctl, info);\r
-\r
-            auto subCount = snd_rawmidi_info_get_subdevices_count (info);\r
-\r
-            for (int sub = 0; sub < subCount; ++sub)\r
-            {\r
-                snd_rawmidi_info_set_subdevice (info, sub);\r
-\r
-                status = snd_ctl_rawmidi_info (ctl, info);\r
-\r
-                if (status == 0)\r
-                    devices.add ("hw:" + String (cardNum) + ","\r
-                                       + String (device) + ","\r
-                                       + String (sub));\r
-            }\r
-        }\r
-\r
-        snd_ctl_close (ctl);\r
-    }\r
-\r
-    String midiPort;\r
-    MidiInput* const midiInput;\r
-    MidiInputCallback* const midiCallback;\r
-\r
-    Midi midi;\r
-    MidiDataConcatenator concatenator { 512 };\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BelaMidiInput)\r
-};\r
-\r
-Array<BelaMidiInput*> BelaMidiInput::midiInputs;\r
-\r
-\r
 //==============================================================================\r
 class BelaAudioIODevice   : public AudioIODevice\r
 {\r
@@ -163,10 +33,7 @@ public:
         Bela_defaultSettings (&defaultSettings);\r
     }\r
 \r
-    ~BelaAudioIODevice()\r
-    {\r
-        close();\r
-    }\r
+    ~BelaAudioIODevice() {}\r
 \r
     //==============================================================================\r
     StringArray getOutputChannelNames() override           { return { "Out #1", "Out #2" }; }\r
@@ -356,10 +223,6 @@ private:
 \r
         ScopedLock lock (callbackLock);\r
 \r
-        // Check for and process and midi\r
-        for (auto midiInput : BelaMidiInput::midiInputs)\r
-            midiInput->poll();\r
-\r
         if (callback != nullptr)\r
         {\r
             jassert (context.audioFrames <= actualBufferSize);\r
@@ -507,58 +370,4 @@ AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()
     return new BelaAudioIODeviceType();\r
 }\r
 \r
-\r
-//==============================================================================\r
-// TODO: Add Bela MidiOutput support\r
-\r
-StringArray MidiOutput::getDevices()                                { return {}; }\r
-int MidiOutput::getDefaultDeviceIndex()                             { return 0; }\r
-MidiOutput* MidiOutput::openDevice (int)                            { return {}; }\r
-MidiOutput* MidiOutput::createNewDevice (const String&)             { return {}; }\r
-MidiOutput::~MidiOutput() {}\r
-void MidiOutput::sendMessageNow (const MidiMessage&) {}\r
-\r
-\r
-//==============================================================================\r
-MidiInput::MidiInput (const String& nm) : name (nm) {}\r
-\r
-MidiInput::~MidiInput()\r
-{\r
-    delete static_cast<BelaMidiInput*> (internal);\r
-}\r
-\r
-void MidiInput::start()     { static_cast<BelaMidiInput*> (internal)->start(); }\r
-void MidiInput::stop()      { static_cast<BelaMidiInput*> (internal)->stop(); }\r
-\r
-int MidiInput::getDefaultDeviceIndex()\r
-{\r
-    return 0;\r
-}\r
-\r
-StringArray MidiInput::getDevices()\r
-{\r
-    return BelaMidiInput::getDevices (true);\r
-}\r
-\r
-MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)\r
-{\r
-    auto devices = getDevices();\r
-\r
-    if (index >= 0 && index < devices.size())\r
-    {\r
-        auto deviceName = devices[index];\r
-        auto result = new MidiInput (deviceName);\r
-        result->internal = new BelaMidiInput (deviceName, result, callback);\r
-        return result;\r
-    }\r
-\r
-    return {};\r
-}\r
-\r
-MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)\r
-{\r
-    jassertfalse; // N/A on Bela\r
-    return {};\r
-}\r
-\r
 } // namespace juce\r
index 8fa26434fd2d429493a91618d62640048d046e46..289bb414da77b5edd77419c240e9907f4082eb8f 100644 (file)
@@ -25,6 +25,11 @@ namespace juce
 \r
 #if JUCE_ALSA\r
 \r
+// You can define these strings in your app if you want to override the default names:\r
+#ifndef JUCE_ALSA_MIDI_NAME\r
+ #define JUCE_ALSA_MIDI_NAME  JUCEApplicationBase::getInstance()->getApplicationName().toUTF8()\r
+#endif\r
+\r
 //==============================================================================\r
 namespace\r
 {\r
@@ -33,49 +38,6 @@ namespace
 class AlsaClient  : public ReferenceCountedObject\r
 {\r
 public:\r
-    AlsaClient()\r
-    {\r
-        jassert (instance == nullptr);\r
-\r
-        snd_seq_open (&handle, "default", SND_SEQ_OPEN_DUPLEX, 0);\r
-\r
-        if (handle != nullptr)\r
-        {\r
-            snd_seq_nonblock (handle, SND_SEQ_NONBLOCK);\r
-            snd_seq_set_client_name (handle, getAlsaMidiName().toRawUTF8());\r
-            clientId = snd_seq_client_id (handle);\r
-\r
-            // It's good idea to pre-allocate a good number of elements\r
-            ports.ensureStorageAllocated (32);\r
-        }\r
-    }\r
-\r
-    ~AlsaClient()\r
-    {\r
-        jassert (instance != nullptr);\r
-        instance = nullptr;\r
-\r
-        if (handle != nullptr)\r
-            snd_seq_close (handle);\r
-\r
-        jassert (activeCallbacks.get() == 0);\r
-\r
-        if (inputThread)\r
-            inputThread->stopThread (3000);\r
-    }\r
-\r
-    static String getAlsaMidiName()\r
-    {\r
-        #ifdef JUCE_ALSA_MIDI_NAME\r
-            return JUCE_ALSA_MIDI_NAME;\r
-        #else\r
-            if (auto* app = JUCEApplicationBase::getInstance())\r
-                return app->getApplicationName();\r
-\r
-            return "JUCE";\r
-        #endif\r
-    }\r
-\r
     using Ptr = ReferenceCountedObjectPtr<AlsaClient>;\r
 \r
     //==============================================================================\r
@@ -151,9 +113,9 @@ public:
             snd_seq_ev_clear (&event);\r
 \r
             auto numBytes = (long) message.getRawDataSize();\r
-            auto* data = message.getRawData();\r
+            const uint8* data = message.getRawData();\r
 \r
-            auto seqHandle = client.get();\r
+            auto* seqHandle = client.get();\r
             bool success = true;\r
 \r
             while (numBytes > 0)\r
@@ -192,12 +154,12 @@ public:
 \r
         void createPort (const String& name, bool enableSubscription)\r
         {\r
-            if (auto seqHandle = client.get())\r
+            if (auto* seqHandle = client.get())\r
             {\r
                 const unsigned int caps =\r
-                    isInput ? (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_WRITE : 0))\r
-                            : (SND_SEQ_PORT_CAP_READ  | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_READ : 0));\r
-\r
+                    isInput\r
+                    ? (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_WRITE : 0))\r
+                    : (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_READ : 0));\r
                 portId = snd_seq_create_simple_port (seqHandle, name.toUTF8(), caps,\r
                                                      SND_SEQ_PORT_TYPE_MIDI_GENERIC |\r
                                                      SND_SEQ_PORT_TYPE_APPLICATION);\r
@@ -289,6 +251,38 @@ private:
 \r
     static AlsaClient* instance;\r
 \r
+    //==============================================================================\r
+    friend class ReferenceCountedObjectPtr<AlsaClient>;\r
+    friend struct ContainerDeletePolicy<AlsaClient>;\r
+\r
+    AlsaClient()\r
+    {\r
+        jassert (instance == nullptr);\r
+\r
+        snd_seq_open (&handle, "default", SND_SEQ_OPEN_DUPLEX, 0);\r
+        snd_seq_nonblock (handle, SND_SEQ_NONBLOCK);\r
+        snd_seq_set_client_name (handle, JUCE_ALSA_MIDI_NAME);\r
+        clientId = snd_seq_client_id(handle);\r
+\r
+        // It's good idea to pre-allocate a good number of elements\r
+        ports.ensureStorageAllocated (32);\r
+    }\r
+\r
+    ~AlsaClient()\r
+    {\r
+        jassert (instance != nullptr);\r
+\r
+        instance = nullptr;\r
+\r
+        if (handle != nullptr)\r
+            snd_seq_close (handle);\r
+\r
+        jassert (activeCallbacks.get() == 0);\r
+\r
+        if (inputThread)\r
+            inputThread->stopThread (3000);\r
+    }\r
+\r
     //==============================================================================\r
     class MidiInputThread   : public Thread\r
     {\r
@@ -301,10 +295,9 @@ private:
 \r
         void run() override\r
         {\r
-            auto seqHandle = client.get();\r
-\r
             const int maxEventSize = 16 * 1024;\r
             snd_midi_event_t* midiParser;\r
+            snd_seq_t* seqHandle = client.get();\r
 \r
             if (snd_midi_event_new (maxEventSize, &midiParser) >= 0)\r
             {\r
@@ -328,8 +321,8 @@ private:
                             if (snd_seq_event_input (seqHandle, &inputEvent) >= 0)\r
                             {\r
                                 // xxx what about SYSEXes that are too big for the buffer?\r
-                                auto numBytes = snd_midi_event_decode (midiParser, buffer,\r
-                                                                       maxEventSize, inputEvent);\r
+                                const long numBytes = snd_midi_event_decode (midiParser, buffer,\r
+                                                                            maxEventSize, inputEvent);\r
 \r
                                 snd_midi_event_reset_decode (midiParser);\r
 \r
@@ -367,7 +360,7 @@ static AlsaClient::Port* iterateMidiClient (const AlsaClient::Ptr& client,
 {\r
     AlsaClient::Port* port = nullptr;\r
 \r
-    auto seqHandle = client->get();\r
+    snd_seq_t* seqHandle = client->get();\r
     snd_seq_port_info_t* portInfo = nullptr;\r
 \r
     snd_seq_port_info_alloca (&portInfo);\r
@@ -413,7 +406,7 @@ static AlsaClient::Port* iterateMidiDevices (bool forInput,
     AlsaClient::Port* port = nullptr;\r
     auto client = AlsaClient::getInstance();\r
 \r
-    if (auto seqHandle = client->get())\r
+    if (auto* seqHandle = client->get())\r
     {\r
         snd_seq_system_info_t* systemInfo = nullptr;\r
         snd_seq_client_info_t* clientInfo = nullptr;\r
@@ -510,7 +503,8 @@ void MidiOutput::sendMessageNow (const MidiMessage& message)
 }\r
 \r
 //==============================================================================\r
-MidiInput::MidiInput (const String& nm)  : name (nm)\r
+MidiInput::MidiInput (const String& nm)\r
+    : name (nm), internal (nullptr)\r
 {\r
 }\r
 \r
@@ -544,6 +538,8 @@ StringArray MidiInput::getDevices()
 \r
 MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback)\r
 {\r
+    MidiInput* newDevice = nullptr;\r
+\r
     StringArray devices;\r
     auto* port = iterateMidiDevices (true, devices, deviceIndex);\r
 \r
@@ -552,22 +548,26 @@ MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback)
 \r
     jassert (port->isValid());\r
 \r
-    auto newDevice = new MidiInput (devices [deviceIndex]);\r
+    newDevice = new MidiInput (devices [deviceIndex]);\r
     port->setupInput (newDevice, callback);\r
     newDevice->internal = port;\r
+\r
     return newDevice;\r
 }\r
 \r
 MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)\r
 {\r
+    MidiInput* newDevice = nullptr;\r
+\r
     auto client = AlsaClient::getInstance();\r
     auto* port = client->createPort (deviceName, true, true);\r
 \r
     jassert (port->isValid());\r
 \r
-    auto newDevice = new MidiInput (deviceName);\r
+    newDevice = new MidiInput (deviceName);\r
     port->setupInput (newDevice, callback);\r
     newDevice->internal = port;\r
+\r
     return newDevice;\r
 }\r
 \r
@@ -584,7 +584,7 @@ MidiOutput* MidiOutput::createNewDevice (const String&)             { return nul
 MidiOutput::~MidiOutput()   {}\r
 void MidiOutput::sendMessageNow (const MidiMessage&)    {}\r
 \r
-MidiInput::MidiInput (const String& nm) : name (nm)  {}\r
+MidiInput::MidiInput (const String& nm) : name (nm), internal (nullptr)  {}\r
 MidiInput::~MidiInput() {}\r
 void MidiInput::start() {}\r
 void MidiInput::stop()  {}\r
index fdf234e809cf4f3d57810a0ddeeb70eec7d0ed35..e08b170b901d29bd96be77e44674d0f04b6f2c90 100644 (file)
@@ -289,17 +289,15 @@ public:
 \r
             if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges)))\r
             {\r
-                for (auto r : { 8000, 11025, 16000, 22050, 32000,\r
-                                44100, 48000, 88200, 96000, 176400,\r
-                                192000, 352800, 384000, 705600, 768000 })\r
-                {\r
-                    auto rate = (double) r;\r
+                static const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 384000.0 };\r
 \r
+                for (int i = 0; i < numElementsInArray (possibleRates); ++i)\r
+                {\r
                     for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;)\r
                     {\r
-                        if (rate >= ranges[j].mMinimum - 2 && rate <= ranges[j].mMaximum + 2)\r
+                        if (possibleRates[i] >= ranges[j].mMinimum - 2 && possibleRates[i] <= ranges[j].mMaximum + 2)\r
                         {\r
-                            newSampleRates.add (rate);\r
+                            newSampleRates.add (possibleRates[i]);\r
                             break;\r
                         }\r
                     }\r
@@ -464,9 +462,6 @@ public:
             inputChannelInfo.swapWith (newInChans);\r
             outputChannelInfo.swapWith (newOutChans);\r
 \r
-            numInputChans  = inputChannelInfo.size();\r
-            numOutputChans = outputChannelInfo.size();\r
-\r
             allocateTempBuffers();\r
         }\r
 \r
@@ -579,7 +574,7 @@ public:
 \r
                 OSType typeId = types[index];\r
 \r
-                OK (AudioObjectSetPropertyData (deviceID, &pa, 0, nullptr, sizeof (typeId), &typeId));\r
+                OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (typeId), &typeId));\r
             }\r
         }\r
     }\r
@@ -605,7 +600,7 @@ public:
         pa.mScope = kAudioObjectPropertyScopeGlobal;\r
         pa.mElement = kAudioObjectPropertyElementMaster;\r
         Float64 sr = newSampleRate;\r
-        return OK (AudioObjectSetPropertyData (deviceID, &pa, 0, nullptr, sizeof (sr), &sr));\r
+        return OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (sr), &sr));\r
     }\r
 \r
     //==============================================================================\r
@@ -648,7 +643,7 @@ public:
             pa.mElement = kAudioObjectPropertyElementMaster;\r
             UInt32 framesPerBuf = (UInt32) bufferSizeSamples;\r
 \r
-            if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, nullptr, sizeof (framesPerBuf), &framesPerBuf)))\r
+            if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (framesPerBuf), &framesPerBuf)))\r
             {\r
                 updateDetailsFromDevice();\r
                 error = "Couldn't change buffer size";\r
@@ -691,7 +686,7 @@ public:
                     else\r
                     {\r
                         OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID));\r
-                        audioProcID = {};\r
+                        audioProcID = 0;\r
                     }\r
                 }\r
             }\r
@@ -717,7 +712,7 @@ public:
         {\r
             OK (AudioDeviceStop (deviceID, audioIOProc));\r
             OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID));\r
-            audioProcID = {};\r
+            audioProcID = 0;\r
 \r
             started = false;\r
 \r
@@ -781,7 +776,7 @@ public:
 \r
             for (int i = numOutputChans; --i >= 0;)\r
             {\r
-                auto& info = outputChannelInfo.getReference (i);\r
+                auto& info = outputChannelInfo.getReference(i);\r
                 auto src = tempOutputBuffers[i];\r
                 auto dest = ((float*) outOutputData->mBuffers[info.streamNum].mData) + info.dataOffsetSamples;\r
                 auto stride = info.dataStrideSamples;\r
@@ -836,7 +831,7 @@ public:
     Array<double> sampleRates;\r
     Array<int> bufferSizes;\r
     AudioIODeviceCallback* callback = nullptr;\r
-    AudioDeviceIOProcID audioProcID = {};\r
+    AudioDeviceIOProcID audioProcID = 0;\r
 \r
 private:\r
     CriticalSection callbackLock;\r
index ec48fdf793b3ded9e9befdec698807a3df5c94a1..f285b0c2a6ae881bea18c409c7c97374eae553f2 100644 (file)
@@ -222,7 +222,7 @@ namespace CoreMidiHelpers
     {\r
         // It seems that OSX can be a bit picky about the thread that's first used to\r
         // search for devices. It's safest to use the message thread for calling this.\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
         StringArray s;\r
         enableSimulatorMidiSession();\r
@@ -268,7 +268,7 @@ namespace CoreMidiHelpers
         {\r
             // Since OSX 10.6, the MIDIClientCreate function will only work\r
             // correctly when called from the message thread!\r
-            JUCE_ASSERT_MESSAGE_THREAD\r
+            jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
             enableSimulatorMidiSession();\r
 \r
@@ -344,8 +344,8 @@ namespace CoreMidiHelpers
 \r
                 for (unsigned int i = 0; i < pktlist->numPackets; ++i)\r
                 {\r
-                    auto len = readUnaligned<decltype (packet->length)> (&(packet->length));\r
-                    concatenator.pushMidiData (packet->data, (int) len, time, input, callback);\r
+                    concatenator.pushMidiData (packet->data, (int) packet->length, time,\r
+                                               input, callback);\r
 \r
                     packet = MIDIPacketNext (packet);\r
                 }\r
index b08d741f5ec13b39f71fad015af09c7381735304..35c357d0dc86ef39e6c33024b6d3febb8084db79 100644 (file)
@@ -346,11 +346,11 @@ public:
 \r
         if (asioObject != nullptr)\r
         {\r
-            for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
-                               44100, 48000, 88200, 96000, 176400,\r
-                               192000, 352800, 384000, 705600, 768000 })\r
-                if (asioObject->canSampleRate ((double) rate) == 0)\r
-                    newRates.add ((double) rate);\r
+            const int possibleSampleRates[] = { 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 };\r
+\r
+            for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index)\r
+                if (asioObject->canSampleRate ((double) possibleSampleRates[index]) == 0)\r
+                    newRates.add ((double) possibleSampleRates[index]);\r
         }\r
 \r
         if (newRates.isEmpty())\r
@@ -787,14 +787,9 @@ private:
 \r
     void reloadChannelNames()\r
     {\r
-        long totalInChannels = 0, totalOutChannels = 0;\r
-\r
         if (asioObject != nullptr\r
-             && asioObject->getChannels (&totalInChannels, &totalOutChannels) == ASE_OK)\r
+             && asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans) == ASE_OK)\r
         {\r
-            totalNumInputChans  = totalInChannels;\r
-            totalNumOutputChans = totalOutChannels;\r
-\r
             inputChannelNames.clear();\r
             outputChannelNames.clear();\r
 \r
index 0864a053cec6e5d9e22b3ffcc78a79ae348f1bba..f820dce8067c42c70d59840afafe973deadf1e0e 100644 (file)
@@ -608,31 +608,15 @@ Array<Win32MidiService::MidiInCollector*, CriticalSection> Win32MidiService::Mid
 //==============================================================================\r
 //==============================================================================\r
 #if JUCE_USE_WINRT_MIDI\r
-\r
-#ifndef JUCE_FORCE_WINRT_MIDI\r
- #define JUCE_FORCE_WINRT_MIDI 0\r
-#endif\r
-\r
-#ifndef JUCE_WINRT_MIDI_LOGGING\r
- #define JUCE_WINRT_MIDI_LOGGING 0\r
-#endif\r
-\r
-#if JUCE_WINRT_MIDI_LOGGING\r
- #define JUCE_WINRT_MIDI_LOG(x)  DBG(x)\r
-#else\r
- #define JUCE_WINRT_MIDI_LOG(x)\r
-#endif\r
-\r
 using namespace Microsoft::WRL;\r
 \r
 using namespace ABI::Windows::Foundation;\r
-using namespace ABI::Windows::Foundation::Collections;\r
 using namespace ABI::Windows::Devices::Midi;\r
 using namespace ABI::Windows::Devices::Enumeration;\r
 using namespace ABI::Windows::Storage::Streams;\r
 \r
 //==============================================================================\r
-struct WinRTMidiService  : public MidiServiceType\r
+class WinRTMidiService  : public MidiServiceType\r
 {\r
 public:\r
     //==============================================================================\r
@@ -651,26 +635,19 @@ public:
         if (midiOutFactory == nullptr)\r
             throw std::runtime_error ("Failed to create midi out factory");\r
 \r
-        // The WinRT BLE MIDI API doesn't provide callbacks when devices become disconnected,\r
-        // but it does require a disconnection via the API before a device will reconnect again.\r
-        // We can monitor the BLE connection state of paired devices to get callbacks when\r
-        // connections are broken.\r
-        bleDeviceWatcher.reset (new BLEDeviceWatcher());\r
-\r
-        if (! bleDeviceWatcher->start())\r
-            throw std::runtime_error ("Failed to start the BLE device watcher");\r
-\r
         inputDeviceWatcher.reset (new MidiIODeviceWatcher<IMidiInPortStatics> (midiInFactory));\r
 \r
         if (! inputDeviceWatcher->start())\r
-            throw std::runtime_error ("Failed to start the midi input device watcher");\r
+            throw std::runtime_error ("Failed to start midi input device watcher");\r
 \r
         outputDeviceWatcher.reset (new MidiIODeviceWatcher<IMidiOutPortStatics> (midiOutFactory));\r
 \r
         if (! outputDeviceWatcher->start())\r
-            throw std::runtime_error ("Failed to start the midi output device watcher");\r
+            throw std::runtime_error ("Failed to start midi output device watcher");\r
     }\r
 \r
+    ~WinRTMidiService() {}\r
+\r
     StringArray getDevices (bool isInput) override\r
     {\r
         return isInput ? inputDeviceWatcher ->getDevices()\r
@@ -693,542 +670,185 @@ public:
         return new WinRTOutputWrapper (*this, index);\r
     }\r
 \r
-private:\r
-    //==============================================================================\r
-    class DeviceCallbackHandler\r
+    template <typename COMFactoryType>\r
+    struct MidiIODeviceWatcher\r
     {\r
-    public:\r
-        virtual ~DeviceCallbackHandler() {};\r
-\r
-        virtual HRESULT addDevice (IDeviceInformation*) = 0;\r
-        virtual HRESULT removeDevice (IDeviceInformationUpdate*) = 0;\r
-        virtual HRESULT updateDevice (IDeviceInformationUpdate*) = 0;\r
-\r
-        bool attach (HSTRING deviceSelector, DeviceInformationKind infoKind)\r
+        struct DeviceInfo\r
         {\r
-            auto deviceInfoFactory = WinRTWrapper::getInstance()->getWRLFactory<IDeviceInformationStatics2> (&RuntimeClass_Windows_Devices_Enumeration_DeviceInformation[0]);\r
-\r
-            if (deviceInfoFactory == nullptr)\r
-                return false;\r
-\r
-            // A quick way of getting an IVector<HSTRING>...\r
-            auto requestedProperties = []\r
-            {\r
-                auto devicePicker = WinRTWrapper::getInstance()->activateInstance<IDevicePicker> (&RuntimeClass_Windows_Devices_Enumeration_DevicePicker[0],\r
-                                                                                                  __uuidof (IDevicePicker));\r
-                jassert (devicePicker != nullptr);\r
-\r
-                IVector<HSTRING>* result;\r
-                auto hr = devicePicker->get_RequestedProperties (&result);\r
-                jassert (SUCCEEDED (hr));\r
-\r
-                hr = result->Clear();\r
-                jassert (SUCCEEDED (hr));\r
-\r
-                return result;\r
-            }();\r
-\r
-            StringArray propertyKeys = { "System.Devices.ContainerId",\r
-                                         "System.Devices.Aep.ContainerId",\r
-                                         "System.Devices.Aep.IsConnected" };\r
-\r
-            for (auto& key : propertyKeys)\r
-            {\r
-                WinRTWrapper::ScopedHString hstr (key);\r
-                auto hr = requestedProperties->Append (hstr.get());\r
-\r
-                if (FAILED (hr))\r
-                {\r
-                    jassertfalse;\r
-                    return false;\r
-                }\r
-            }\r
-\r
-            WinRTWrapper::ComPtr<IIterable<HSTRING>> iter;\r
-            auto hr = requestedProperties->QueryInterface (__uuidof (IIterable<HSTRING>), (void**) iter.resetAndGetPointerAddress());\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
-                return false;\r
-            }\r
-\r
-            hr = deviceInfoFactory->CreateWatcherWithKindAqsFilterAndAdditionalProperties (deviceSelector, iter, infoKind,\r
-                                                                                           watcher.resetAndGetPointerAddress());\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
-                return false;\r
-            }\r
-\r
-            enumerationThread.startThread();\r
-\r
-            return true;\r
+            String name, id;\r
+            bool isDefault = false;\r
         };\r
 \r
-        void detach()\r
+        MidiIODeviceWatcher (ComSmartPtr<COMFactoryType>& comFactory)  : factory (comFactory)\r
         {\r
-            enumerationThread.stopThread (2000);\r
-\r
-            if (watcher == nullptr)\r
-                return;\r
-\r
-            auto hr = watcher->Stop();\r
-            jassert (SUCCEEDED (hr));\r
-\r
-            if (deviceAddedToken.value != 0)\r
-            {\r
-                hr = watcher->remove_Added (deviceAddedToken);\r
-                jassert (SUCCEEDED (hr));\r
-                deviceAddedToken.value = 0;\r
-            }\r
-\r
-            if (deviceUpdatedToken.value != 0)\r
-            {\r
-                hr = watcher->remove_Updated (deviceUpdatedToken);\r
-                jassert (SUCCEEDED (hr));\r
-                deviceUpdatedToken.value = 0;\r
-            }\r
-\r
-            if (deviceRemovedToken.value != 0)\r
-            {\r
-                hr = watcher->remove_Removed (deviceRemovedToken);\r
-                jassert (SUCCEEDED (hr));\r
-                deviceRemovedToken.value = 0;\r
-            }\r
-\r
-            watcher = nullptr;\r
         }\r
 \r
-        template<typename InfoType>\r
-        IInspectable* getValueFromDeviceInfo (String key, InfoType* info)\r
-        {\r
-            __FIMapView_2_HSTRING_IInspectable* properties;\r
-            info->get_Properties (&properties);\r
-\r
-            boolean found = false;\r
-            WinRTWrapper::ScopedHString keyHstr (key);\r
-            auto hr = properties->HasKey (keyHstr.get(), &found);\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
-                return nullptr;\r
-            }\r
-\r
-            if (! found)\r
-                return nullptr;\r
-\r
-            IInspectable* inspectable;\r
-            hr = properties->Lookup (keyHstr.get(), &inspectable);\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
-                return nullptr;\r
-            }\r
-\r
-            return inspectable;\r
-        }\r
-\r
-        String getGUIDFromInspectable (IInspectable& inspectable)\r
+        ~MidiIODeviceWatcher()\r
         {\r
-            WinRTWrapper::ComPtr<IReference<GUID>> guidRef;\r
-            auto hr = inspectable.QueryInterface (__uuidof (IReference<GUID>),\r
-                                                  (void**) guidRef.resetAndGetPointerAddress());\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
-                return {};\r
-            }\r
-\r
-            GUID result;\r
-            hr = guidRef->get_Value (&result);\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
-                return {};\r
-            }\r
-\r
-            OLECHAR* resultString;\r
-            StringFromCLSID (result, &resultString);\r
-\r
-            return resultString;\r
+            stop();\r
         }\r
 \r
-        bool getBoolFromInspectable (IInspectable& inspectable)\r
+        bool start()\r
         {\r
-            WinRTWrapper::ComPtr<IReference<bool>> boolRef;\r
-            auto hr = inspectable.QueryInterface (__uuidof (IReference<bool>),\r
-                                                  (void**) boolRef.resetAndGetPointerAddress());\r
+            HSTRING deviceSelector;\r
+            auto hr = factory->GetDeviceSelector (&deviceSelector);\r
 \r
             if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
                 return false;\r
-            }\r
 \r
-            boolean result;\r
-            hr = boolRef->get_Value (&result);\r
+            auto deviceInformationFactory = WinRTWrapper::getInstance()->getWRLFactory<IDeviceInformationStatics> (&RuntimeClass_Windows_Devices_Enumeration_DeviceInformation[0]);\r
 \r
-            if (FAILED (hr))\r
-            {\r
-                jassertfalse;\r
+            if (deviceInformationFactory == nullptr)\r
                 return false;\r
-            }\r
 \r
-            return result;\r
-        }\r
-\r
-    private:\r
-        //==============================================================================\r
-        struct DeviceEnumerationThread   : public Thread\r
-        {\r
-            DeviceEnumerationThread (DeviceCallbackHandler& h,\r
-                                     WinRTWrapper::ComPtr<IDeviceWatcher>& w,\r
-                                     EventRegistrationToken& added,\r
-                                     EventRegistrationToken& removed,\r
-                                     EventRegistrationToken& updated)\r
-                    : Thread ("WinRT Device Enumeration Thread"), handler (h), watcher (w),\r
-                      deviceAddedToken (added), deviceRemovedToken (removed), deviceUpdatedToken (updated)\r
-            {}\r
-\r
-            void run() override\r
-            {\r
-                auto handlerPtr = std::addressof (handler);\r
-\r
-                watcher->add_Added (\r
-                    Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformation*>> (\r
-                        [handlerPtr](IDeviceWatcher*, IDeviceInformation* info) { return handlerPtr->addDevice (info); }\r
-                    ).Get(),\r
-                    &deviceAddedToken);\r
-\r
-                watcher->add_Removed (\r
-                    Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformationUpdate*>> (\r
-                        [handlerPtr](IDeviceWatcher*, IDeviceInformationUpdate* infoUpdate) { return handlerPtr->removeDevice (infoUpdate); }\r
-                    ).Get(),\r
-                    &deviceRemovedToken);\r
-\r
-                watcher->add_Updated (\r
-                    Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformationUpdate*>> (\r
-                        [handlerPtr](IDeviceWatcher*, IDeviceInformationUpdate* infoUpdate) { return handlerPtr->updateDevice (infoUpdate); }\r
-                    ).Get(),\r
-                    &deviceRemovedToken);\r
-\r
-                watcher->Start();\r
-            }\r
-\r
-            DeviceCallbackHandler& handler;\r
-            WinRTWrapper::ComPtr<IDeviceWatcher>& watcher;\r
-            EventRegistrationToken& deviceAddedToken, deviceRemovedToken, deviceUpdatedToken;\r
-        };\r
-\r
-        //==============================================================================\r
-        WinRTWrapper::ComPtr<IDeviceWatcher> watcher;\r
-\r
-        EventRegistrationToken deviceAddedToken   { 0 },\r
-                               deviceRemovedToken { 0 },\r
-                               deviceUpdatedToken { 0 };\r
-\r
-        DeviceEnumerationThread enumerationThread { *this, watcher,\r
-                                                    deviceAddedToken,\r
-                                                    deviceRemovedToken,\r
-                                                    deviceUpdatedToken };\r
-    };\r
-\r
-    //==============================================================================\r
-    struct BLEDeviceWatcher final   : private DeviceCallbackHandler\r
-    {\r
-        struct DeviceInfo\r
-        {\r
-            String containerID;\r
-            bool isConnected = false;\r
-        };\r
-\r
-        BLEDeviceWatcher() = default;\r
-\r
-        ~BLEDeviceWatcher()\r
-        {\r
-            detach();\r
-        }\r
-\r
-        //==============================================================================\r
-        HRESULT addDevice (IDeviceInformation* addedDeviceInfo) override\r
-        {\r
-            HSTRING deviceIDHst;\r
-            auto hr = addedDeviceInfo->get_Id (&deviceIDHst);\r
+            hr = deviceInformationFactory->CreateWatcherAqsFilter (deviceSelector, watcher.resetAndGetPointerAddress());\r
 \r
             if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query added BLE device ID!");\r
-                return S_OK;\r
-            }\r
-\r
-            auto deviceID = WinRTWrapper::getInstance()->hStringToString (deviceIDHst);\r
-            JUCE_WINRT_MIDI_LOG ("Detected paired BLE device: " << deviceID);\r
+                return false;\r
 \r
-            if (auto* containerIDValue = getValueFromDeviceInfo ("System.Devices.Aep.ContainerId", addedDeviceInfo))\r
+            struct DeviceEnumerationThread  : public Thread\r
             {\r
-                auto containerID = getGUIDFromInspectable (*containerIDValue);\r
+                DeviceEnumerationThread (String threadName, MidiIODeviceWatcher<COMFactoryType>& p)\r
+                    : Thread (threadName), parent (p)\r
+                {}\r
 \r
-                if (containerID.isNotEmpty())\r
+                void run() override\r
                 {\r
-                    DeviceInfo info = { containerID };\r
-\r
-                    if (auto* connectedValue = getValueFromDeviceInfo ("System.Devices.Aep.IsConnected", addedDeviceInfo))\r
-                        info.isConnected = getBoolFromInspectable (*connectedValue);\r
-\r
-                    JUCE_WINRT_MIDI_LOG ("Adding BLE device: " << deviceID << " " << info.containerID\r
-                                         << " " << (info.isConnected ? "connected" : "disconnected"));\r
-                    devices.set (deviceID, info);\r
-\r
-                    return S_OK;\r
+                    auto parentPtr = &parent;\r
+\r
+                    parent.watcher->add_Added (\r
+                        Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformation*>> (\r
+                            [parentPtr](IDeviceWatcher*, IDeviceInformation* info) { return parentPtr->addDevice (info); }\r
+                        ).Get(),\r
+                        &parent.deviceAddedToken);\r
+\r
+                    parent.watcher->add_Removed (\r
+                        Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformationUpdate*>> (\r
+                            [parentPtr](IDeviceWatcher*, IDeviceInformationUpdate* info) { return parentPtr->removeDevice (info); }\r
+                        ).Get(),\r
+                        &parent.deviceRemovedToken);\r
+\r
+                    EventRegistrationToken deviceEnumerationCompletedToken { 0 };\r
+                    parent.watcher->add_EnumerationCompleted (\r
+                        Callback<ITypedEventHandler<DeviceWatcher*, IInspectable*>> (\r
+                            [this](IDeviceWatcher*, IInspectable*) { enumerationCompleted.signal(); return S_OK; }\r
+                        ).Get(),\r
+                        &deviceEnumerationCompletedToken);\r
+\r
+                    parent.watcher->Start();\r
+                    enumerationCompleted.wait();\r
+\r
+                    if (deviceEnumerationCompletedToken.value != 0)\r
+                        parent.watcher->remove_EnumerationCompleted (deviceEnumerationCompletedToken);\r
                 }\r
-            }\r
 \r
-            JUCE_WINRT_MIDI_LOG ("Failed to get a container ID for BLE device: " << deviceID);\r
-            return S_OK;\r
-        }\r
+                MidiIODeviceWatcher<COMFactoryType>& parent;\r
+                WaitableEvent enumerationCompleted;\r
+            };\r
 \r
-        HRESULT removeDevice (IDeviceInformationUpdate* removedDeviceInfo) override\r
-        {\r
-            HSTRING removedDeviceIdHstr;\r
-            auto hr = removedDeviceInfo->get_Id (&removedDeviceIdHstr);\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query removed BLE device ID!");\r
-                return S_OK;\r
-            }\r
-\r
-            auto removedDeviceId = WinRTWrapper::getInstance()->hStringToString (removedDeviceIdHstr);\r
-\r
-            JUCE_WINRT_MIDI_LOG ("Removing BLE device: " << removedDeviceId);\r
-\r
-            {\r
-                const ScopedLock lock (deviceChanges);\r
-\r
-                if (devices.contains (removedDeviceId))\r
-                {\r
-                    auto& info = devices.getReference (removedDeviceId);\r
-                    listeners.call ([&info](Listener& l) { l.bleDeviceDisconnected (info.containerID); });\r
-                    devices.remove (removedDeviceId);\r
-                    JUCE_WINRT_MIDI_LOG ("Removed BLE device: " << removedDeviceId);\r
-                }\r
-            }\r
+            DeviceEnumerationThread enumerationThread ("WinRT Device Enumeration Thread", *this);\r
+            enumerationThread.startThread();\r
+            enumerationThread.waitForThreadToExit (4000);\r
 \r
-            return S_OK;\r
+            return true;\r
         }\r
 \r
-        HRESULT updateDevice (IDeviceInformationUpdate* updatedDeviceInfo) override\r
+        bool stop()\r
         {\r
-            HSTRING updatedDeviceIdHstr;\r
-            auto hr = updatedDeviceInfo->get_Id (&updatedDeviceIdHstr);\r
+            if (watcher == nullptr)\r
+                return true;\r
 \r
-            if (FAILED (hr))\r
+            if (deviceAddedToken.value != 0)\r
             {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query updated BLE device ID!");\r
-                return S_OK;\r
-            }\r
+                auto hr = watcher->remove_Added (deviceAddedToken);\r
 \r
-            auto updatedDeviceId = WinRTWrapper::getInstance()->hStringToString (updatedDeviceIdHstr);\r
+                if (FAILED (hr))\r
+                    return false;\r
 \r
-            JUCE_WINRT_MIDI_LOG ("Updating BLE device: " << updatedDeviceId);\r
+                deviceAddedToken.value = 0;\r
+            }\r
 \r
-            if (auto* connectedValue = getValueFromDeviceInfo ("System.Devices.Aep.IsConnected", updatedDeviceInfo))\r
+            if (deviceRemovedToken.value != 0)\r
             {\r
-                auto isConnected = getBoolFromInspectable (*connectedValue);\r
-\r
-                {\r
-                    const ScopedLock lock (deviceChanges);\r
-\r
-                    if (! devices.contains (updatedDeviceId))\r
-                        return S_OK;\r
-\r
-                    auto& info = devices.getReference (updatedDeviceId);\r
+                auto hr = watcher->remove_Removed (deviceRemovedToken);\r
 \r
-                    if (info.isConnected && ! isConnected)\r
-                    {\r
-                        JUCE_WINRT_MIDI_LOG ("BLE device connection status change: " << updatedDeviceId << " " << info.containerID << " " << (isConnected ? "connected" : "disconnected"));\r
-                        listeners.call ([&info](Listener& l) { l.bleDeviceDisconnected (info.containerID); });\r
-                    }\r
+                if (FAILED (hr))\r
+                    return false;\r
 \r
-                    info.isConnected = isConnected;\r
-                }\r
+                deviceRemovedToken.value = 0;\r
             }\r
 \r
-            return S_OK;\r
-        }\r
-\r
-        //==============================================================================\r
-        bool start()\r
-        {\r
-            WinRTWrapper::ScopedHString deviceSelector ("System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\""\r
-                                                        " AND System.Devices.Aep.IsPaired:=System.StructuredQueryType.Boolean#True");\r
-            return attach (deviceSelector.get(), DeviceInformationKind::DeviceInformationKind_AssociationEndpoint);\r
-        }\r
-\r
-        //==============================================================================\r
-        struct Listener\r
-        {\r
-            virtual ~Listener() {};\r
-            virtual void bleDeviceAdded (const String& containerID) = 0;\r
-            virtual void bleDeviceDisconnected (const String& containerID) = 0;\r
-        };\r
-\r
-        void addListener (Listener* l)\r
-        {\r
-            listeners.add (l);\r
-        }\r
-\r
-        void removeListener (Listener* l)\r
-        {\r
-            listeners.remove (l);\r
-        }\r
-\r
-        //==============================================================================\r
-        ListenerList<Listener> listeners;\r
-        HashMap<String, DeviceInfo> devices;\r
-        CriticalSection deviceChanges;\r
-\r
-        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BLEDeviceWatcher);\r
-    };\r
-\r
-    //==============================================================================\r
-    struct MIDIDeviceInfo\r
-    {\r
-        String deviceID, containerID, name;\r
-        bool isDefault = false;\r
-    };\r
+            auto hr = watcher->Stop();\r
 \r
-    //==============================================================================\r
-    template <typename COMFactoryType>\r
-    struct MidiIODeviceWatcher final   : private DeviceCallbackHandler\r
-    {\r
-        MidiIODeviceWatcher (WinRTWrapper::ComPtr<COMFactoryType>& comFactory)\r
-            : factory (comFactory)\r
-        {\r
-        }\r
+            if (FAILED (hr))\r
+                return false;\r
 \r
-        ~MidiIODeviceWatcher()\r
-        {\r
-            detach();\r
+            watcher = nullptr;\r
+            return true;\r
         }\r
 \r
-        HRESULT addDevice (IDeviceInformation* addedDeviceInfo) override\r
+        HRESULT addDevice (IDeviceInformation* addedDeviceInfo)\r
         {\r
-            MIDIDeviceInfo info;\r
-\r
-            HSTRING deviceID;\r
-            auto hr = addedDeviceInfo->get_Id (&deviceID);\r
+            boolean isEnabled;\r
+            auto hr = addedDeviceInfo->get_IsEnabled (&isEnabled);\r
 \r
             if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query added MIDI device ID!");\r
                 return S_OK;\r
-            }\r
-\r
-            info.deviceID = WinRTWrapper::getInstance()->hStringToString (deviceID);\r
-\r
-            JUCE_WINRT_MIDI_LOG ("Detected MIDI device: " << info.deviceID);\r
 \r
-            boolean isEnabled = false;\r
-            hr = addedDeviceInfo->get_IsEnabled (&isEnabled);\r
-\r
-            if (FAILED (hr) || ! isEnabled)\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("MIDI device not enabled: " << info.deviceID);\r
+            if (! isEnabled)\r
                 return S_OK;\r
-            }\r
 \r
-            // We use the container ID to match a MIDI device with a generic BLE device, if possible\r
-            if (auto* containerIDValue = getValueFromDeviceInfo ("System.Devices.ContainerId", addedDeviceInfo))\r
-                info.containerID = getGUIDFromInspectable (*containerIDValue);\r
+            const ScopedLock lock (deviceChanges);\r
+\r
+            DeviceInfo info;\r
 \r
             HSTRING name;\r
             hr = addedDeviceInfo->get_Name (&name);\r
 \r
             if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query detected MIDI device name for " << info.deviceID);\r
                 return S_OK;\r
-            }\r
 \r
             info.name = WinRTWrapper::getInstance()->hStringToString (name);\r
 \r
-            boolean isDefault = false;\r
-            hr = addedDeviceInfo->get_IsDefault (&isDefault);\r
+            HSTRING id;\r
+            hr = addedDeviceInfo->get_Id (&id);\r
 \r
             if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query detected MIDI device defaultness for " << info.deviceID << " " << info.name);\r
                 return S_OK;\r
-            }\r
 \r
-            info.isDefault = isDefault;\r
+            info.id = WinRTWrapper::getInstance()->hStringToString (id);\r
 \r
-            JUCE_WINRT_MIDI_LOG ("Adding MIDI device: " << info.deviceID << " " << info.containerID << " " << info.name);\r
+            boolean isDefault;\r
+            hr = addedDeviceInfo->get_IsDefault (&isDefault);\r
 \r
-            {\r
-                const ScopedLock lock (deviceChanges);\r
-                connectedDevices.add (info);\r
-            }\r
+            if (FAILED (hr))\r
+                return S_OK;\r
 \r
+            info.isDefault = isDefault != 0;\r
+            connectedDevices.add (info);\r
             return S_OK;\r
         }\r
 \r
-        HRESULT removeDevice (IDeviceInformationUpdate* removedDeviceInfo) override\r
+        HRESULT removeDevice (IDeviceInformationUpdate* removedDeviceInfo)\r
         {\r
-            HSTRING removedDeviceIdHstr;\r
-            auto hr = removedDeviceInfo->get_Id (&removedDeviceIdHstr);\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to query removed MIDI device ID!");\r
-                return S_OK;\r
-            }\r
+            const ScopedLock lock (deviceChanges);\r
 \r
+            HSTRING removedDeviceIdHstr;\r
+            removedDeviceInfo->get_Id (&removedDeviceIdHstr);\r
             auto removedDeviceId = WinRTWrapper::getInstance()->hStringToString (removedDeviceIdHstr);\r
 \r
-            JUCE_WINRT_MIDI_LOG ("Removing MIDI device: " << removedDeviceId);\r
-\r
+            for (int i = 0; i < connectedDevices.size(); ++i)\r
             {\r
-                const ScopedLock lock (deviceChanges);\r
-\r
-                for (int i = 0; i < connectedDevices.size(); ++i)\r
+                if (connectedDevices[i].id == removedDeviceId)\r
                 {\r
-                    if (connectedDevices[i].deviceID == removedDeviceId)\r
-                    {\r
-                        connectedDevices.remove (i);\r
-                        JUCE_WINRT_MIDI_LOG ("Removed MIDI device: " << removedDeviceId);\r
-                        break;\r
-                    }\r
+                    connectedDevices.remove (i);\r
+                    break;\r
                 }\r
             }\r
 \r
             return S_OK;\r
         }\r
 \r
-        // This is never called\r
-        HRESULT updateDevice (IDeviceInformationUpdate*) override   { return S_OK; }\r
-\r
-        bool start()\r
-        {\r
-            HSTRING deviceSelector;\r
-            auto hr = factory->GetDeviceSelector (&deviceSelector);\r
-\r
-            if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to get MIDI device selector!");\r
-                return false;\r
-            }\r
-\r
-            return attach (deviceSelector, DeviceInformationKind::DeviceInformationKind_DeviceInterface);\r
-        }\r
-\r
         StringArray getDevices()\r
         {\r
             {\r
@@ -1255,10 +875,10 @@ private:
             return 0;\r
         }\r
 \r
-        MIDIDeviceInfo getDeviceInfoFromIndex (int index)\r
+        String getDeviceNameFromIndex (int index)\r
         {\r
             if (isPositiveAndBelow (index, lastQueriedConnectedDevices.get().size()))\r
-                return lastQueriedConnectedDevices.get()[index];\r
+                return lastQueriedConnectedDevices.get()[index].name;\r
 \r
             return {};\r
         }\r
@@ -1269,16 +889,21 @@ private:
 \r
             for (auto info : connectedDevices)\r
                 if (info.name == name)\r
-                    return info.deviceID;\r
+                    return info.id;\r
 \r
             return {};\r
         }\r
 \r
-        WinRTWrapper::ComPtr<COMFactoryType>& factory;\r
+        ComSmartPtr<COMFactoryType>& factory;\r
 \r
-        Array<MIDIDeviceInfo> connectedDevices;\r
+        EventRegistrationToken deviceAddedToken   { 0 },\r
+                               deviceRemovedToken { 0 };\r
+\r
+        ComSmartPtr<IDeviceWatcher> watcher;\r
+\r
+        Array<DeviceInfo> connectedDevices;\r
         CriticalSection deviceChanges;\r
-        ThreadLocalValue<Array<MIDIDeviceInfo>> lastQueriedConnectedDevices;\r
+        ThreadLocalValue<Array<DeviceInfo>> lastQueriedConnectedDevices;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiIODeviceWatcher);\r
     };\r
@@ -1288,8 +913,8 @@ private:
     struct OpenMidiPortThread  : public Thread\r
     {\r
         OpenMidiPortThread (String threadName, String midiDeviceID,\r
-                            WinRTWrapper::ComPtr<COMFactoryType>& comFactory,\r
-                            WinRTWrapper::ComPtr<COMInterfaceType>& comPort)\r
+                            ComSmartPtr<COMFactoryType>& comFactory,\r
+                            ComSmartPtr<COMInterfaceType>& comPort)\r
             : Thread (threadName),\r
               deviceID (midiDeviceID),\r
               factory (comFactory),\r
@@ -1305,7 +930,7 @@ private:
         void run() override\r
         {\r
             WinRTWrapper::ScopedHString hDeviceId (deviceID);\r
-            WinRTWrapper::ComPtr<IAsyncOperation<COMType*>> asyncOp;\r
+            ComSmartPtr<IAsyncOperation<COMType*>> asyncOp;\r
             auto hr = factory->FromIdAsync (hDeviceId.get(), asyncOp.resetAndGetPointerAddress());\r
 \r
             if (FAILED (hr))\r
@@ -1327,145 +952,67 @@ private:
                 }\r
             ).Get());\r
 \r
-            // We need to use a timout here, rather than waiting indefinitely, as the\r
-            // WinRT API can occaisonally hang!\r
+            // When using Bluetooth the asynchronous port opening operation will occasionally\r
+            // hang, so we use a timeout. We will be able to remove this when Microsoft\r
+            // improves the Bluetooth MIDI stack.\r
             portOpened.wait (2000);\r
         }\r
 \r
         const String deviceID;\r
-        WinRTWrapper::ComPtr<COMFactoryType>& factory;\r
-        WinRTWrapper::ComPtr<COMInterfaceType>& port;\r
+        ComSmartPtr<COMFactoryType>& factory;\r
+        ComSmartPtr<COMInterfaceType>& port;\r
         WaitableEvent portOpened { true };\r
     };\r
 \r
     //==============================================================================\r
-    template <typename MIDIIOStaticsType, typename MIDIPort>\r
-    class WinRTIOWrapper   : private BLEDeviceWatcher::Listener\r
+    struct WinRTInputWrapper  : public InputWrapper\r
     {\r
-    public:\r
-        WinRTIOWrapper (BLEDeviceWatcher& bleWatcher,\r
-                        MidiIODeviceWatcher<MIDIIOStaticsType>& midiDeviceWatcher,\r
-                        int index)\r
-            : bleDeviceWatcher (bleWatcher)\r
-        {\r
-            {\r
-                const ScopedLock lock (midiDeviceWatcher.deviceChanges);\r
-                deviceInfo = midiDeviceWatcher.getDeviceInfoFromIndex (index);\r
-            }\r
-\r
-            if (deviceInfo.deviceID.isEmpty())\r
-                throw std::runtime_error ("Invalid device index");\r
-\r
-            JUCE_WINRT_MIDI_LOG ("Creating JUCE MIDI IO: " << deviceInfo.deviceID);\r
-\r
-            if (deviceInfo.containerID.isNotEmpty())\r
-            {\r
-                bleDeviceWatcher.addListener (this);\r
-\r
-                const ScopedLock lock (bleDeviceWatcher.deviceChanges);\r
-\r
-                HashMap<String, BLEDeviceWatcher::DeviceInfo>::Iterator iter (bleDeviceWatcher.devices);\r
-\r
-                while (iter.next())\r
-                {\r
-                    if (iter.getValue().containerID == deviceInfo.containerID)\r
-                    {\r
-                        isBLEDevice = true;\r
-                        break;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-\r
-        virtual ~WinRTIOWrapper()\r
-        {\r
-            bleDeviceWatcher.removeListener (this);\r
-\r
-            disconnect();\r
-        }\r
-\r
-        //==============================================================================\r
-        virtual void disconnect()\r
+        WinRTInputWrapper (WinRTMidiService& service, MidiInput& input, int index, MidiInputCallback& cb)\r
+            : inputDevice (input),\r
+              callback (cb)\r
         {\r
-            if (midiPort != nullptr)\r
-            {\r
-                if (isBLEDevice)\r
-                    midiPort->Release();\r
-            }\r
+            const ScopedLock lock (service.inputDeviceWatcher->deviceChanges);\r
 \r
-            midiPort = nullptr;\r
-        }\r
-\r
-    private:\r
-        //==============================================================================\r
-        void bleDeviceAdded (const String& containerID) override\r
-        {\r
-            if (containerID == deviceInfo.containerID)\r
-                isBLEDevice = true;\r
-        }\r
+            deviceName = service.inputDeviceWatcher->getDeviceNameFromIndex (index);\r
 \r
-        void bleDeviceDisconnected (const String& containerID) override\r
-        {\r
-            if (containerID == deviceInfo.containerID)\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Disconnecting MIDI port from BLE disconnection: " << deviceInfo.deviceID\r
-                                     << " " << deviceInfo.containerID << " " << deviceInfo.name);\r
-                disconnect();\r
-            }\r
-        }\r
+            if (deviceName.isEmpty())\r
+                throw std::runtime_error ("Invalid device index");\r
 \r
-    protected:\r
-        //==============================================================================\r
-        BLEDeviceWatcher& bleDeviceWatcher;\r
-        MIDIDeviceInfo deviceInfo;\r
-        bool isBLEDevice = false;\r
-        WinRTWrapper::ComPtr<MIDIPort> midiPort;\r
-    };\r
+            auto deviceID = service.inputDeviceWatcher->getDeviceID (deviceName);\r
 \r
-    //==============================================================================\r
-    struct WinRTInputWrapper final  : public InputWrapper,\r
-                                      private WinRTIOWrapper<IMidiInPortStatics, IMidiInPort>\r
+            if (deviceID.isEmpty())\r
+                throw std::runtime_error ("Device unavailable");\r
 \r
-    {\r
-        WinRTInputWrapper (WinRTMidiService& service, MidiInput& input, int index, MidiInputCallback& cb)\r
-            : WinRTIOWrapper <IMidiInPortStatics, IMidiInPort> (*service.bleDeviceWatcher, *service.inputDeviceWatcher, index),\r
-              inputDevice (input),\r
-              callback (cb)\r
-        {\r
             OpenMidiPortThread<IMidiInPortStatics, IMidiInPort, MidiInPort> portThread ("Open WinRT MIDI input port",\r
-                                                                                        deviceInfo.deviceID,\r
+                                                                                        deviceID,\r
                                                                                         service.midiInFactory,\r
-                                                                                        midiPort);\r
+                                                                                        midiInPort);\r
             portThread.startThread();\r
             portThread.waitForThreadToExit (-1);\r
 \r
-            if (midiPort == nullptr)\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Timed out waiting for midi input port creation");\r
-                return;\r
-            }\r
+            if (midiInPort == nullptr)\r
+                throw std::runtime_error ("Timed out waiting for midi input port creation");\r
 \r
             startTime = Time::getMillisecondCounterHiRes();\r
 \r
-            auto hr = midiPort->add_MessageReceived (\r
+            auto hr = midiInPort->add_MessageReceived (\r
                 Callback<ITypedEventHandler<MidiInPort*, MidiMessageReceivedEventArgs*>> (\r
-                    [this](IMidiInPort*, IMidiMessageReceivedEventArgs* args) { return midiInMessageReceived (args); }\r
+                    [this] (IMidiInPort*, IMidiMessageReceivedEventArgs* args) { return midiInMessageReceived (args); }\r
                 ).Get(),\r
                 &midiInMessageToken);\r
 \r
             if (FAILED (hr))\r
-            {\r
-                JUCE_WINRT_MIDI_LOG ("Failed to set MIDI input callback");\r
-                jassertfalse;\r
-            }\r
+                throw std::runtime_error ("Failed to set midi input callback");\r
         }\r
 \r
         ~WinRTInputWrapper()\r
         {\r
-            disconnect();\r
+            if (midiInMessageToken.value != 0)\r
+                midiInPort->remove_MessageReceived (midiInMessageToken);\r
+\r
+            midiInPort = nullptr;\r
         }\r
 \r
-        //==============================================================================\r
         void start() override\r
         {\r
             if (! isStarted)\r
@@ -1484,38 +1031,26 @@ private:
             }\r
         }\r
 \r
-        String getDeviceName() override         { return deviceInfo.name; }\r
-\r
-        //==============================================================================\r
-        void disconnect() override\r
-        {\r
-            stop();\r
-\r
-            if (midiPort != nullptr && midiInMessageToken.value != 0)\r
-                midiPort->remove_MessageReceived (midiInMessageToken);\r
+        String getDeviceName() override         { return deviceName; }\r
 \r
-            WinRTIOWrapper<IMidiInPortStatics, IMidiInPort>::disconnect();\r
-        }\r
-\r
-        //==============================================================================\r
         HRESULT midiInMessageReceived (IMidiMessageReceivedEventArgs* args)\r
         {\r
             if (! isStarted)\r
                 return S_OK;\r
 \r
-            WinRTWrapper::ComPtr<IMidiMessage> message;\r
+            ComSmartPtr<IMidiMessage> message;\r
             auto hr = args->get_Message (message.resetAndGetPointerAddress());\r
 \r
             if (FAILED (hr))\r
                 return hr;\r
 \r
-            WinRTWrapper::ComPtr<IBuffer> buffer;\r
+            ComSmartPtr<IBuffer> buffer;\r
             hr = message->get_RawData (buffer.resetAndGetPointerAddress());\r
 \r
             if (FAILED (hr))\r
                 return hr;\r
 \r
-            WinRTWrapper::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
+            ComSmartPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
             hr = buffer->QueryInterface (bufferByteAccess.resetAndGetPointerAddress());\r
 \r
             if (FAILED (hr))\r
@@ -1562,11 +1097,11 @@ private:
             return t * 0.001;\r
         }\r
 \r
-        //==============================================================================\r
         MidiInput& inputDevice;\r
         MidiInputCallback& callback;\r
-\r
+        String deviceName;\r
         MidiDataConcatenator concatenator { 4096 };\r
+        ComSmartPtr<IMidiInPort> midiInPort;\r
         EventRegistrationToken midiInMessageToken { 0 };\r
 \r
         double startTime = 0;\r
@@ -1576,20 +1111,30 @@ private:
     };\r
 \r
     //==============================================================================\r
-    struct WinRTOutputWrapper final  : public OutputWrapper,\r
-                                       private WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort>\r
+    struct WinRTOutputWrapper  : public OutputWrapper\r
     {\r
         WinRTOutputWrapper (WinRTMidiService& service, int index)\r
-            : WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort> (*service.bleDeviceWatcher, *service.outputDeviceWatcher, index)\r
         {\r
+            const ScopedLock lock (service.outputDeviceWatcher->deviceChanges);\r
+\r
+            deviceName = service.outputDeviceWatcher->getDeviceNameFromIndex (index);\r
+\r
+            if (deviceName.isEmpty())\r
+                throw std::runtime_error ("Invalid device index");\r
+\r
+            auto deviceID = service.outputDeviceWatcher->getDeviceID (deviceName);\r
+\r
+            if (deviceID.isEmpty())\r
+                throw std::runtime_error ("Device unavailable");\r
+\r
             OpenMidiPortThread<IMidiOutPortStatics, IMidiOutPort, IMidiOutPort> portThread ("Open WinRT MIDI output port",\r
-                                                                                            deviceInfo.deviceID,\r
+                                                                                            deviceID,\r
                                                                                             service.midiOutFactory,\r
-                                                                                            midiPort);\r
+                                                                                            midiOutPort);\r
             portThread.startThread();\r
             portThread.waitForThreadToExit (-1);\r
 \r
-            if (midiPort == nullptr)\r
+            if (midiOutPort == nullptr)\r
                 throw std::runtime_error ("Timed out waiting for midi output port creation");\r
 \r
             auto bufferFactory = WinRTWrapper::getInstance()->getWRLFactory<IBufferFactory> (&RuntimeClass_Windows_Storage_Streams_Buffer[0]);\r
@@ -1613,87 +1158,55 @@ private:
                 throw std::runtime_error ("Failed to get buffer data pointer");\r
         }\r
 \r
-        //==============================================================================\r
+        ~WinRTOutputWrapper() {}\r
+\r
         void sendMessageNow (const MidiMessage& message) override\r
         {\r
-            if (midiPort == nullptr)\r
-                return;\r
-\r
             auto numBytes = message.getRawDataSize();\r
             auto hr = buffer->put_Length (numBytes);\r
 \r
             if (FAILED (hr))\r
-            {\r
                 jassertfalse;\r
-                return;\r
-            }\r
 \r
             memcpy_s (bufferData, numBytes, message.getRawData(), numBytes);\r
-            midiPort->SendBuffer (buffer);\r
+            midiOutPort->SendBuffer (buffer);\r
         }\r
 \r
-        String getDeviceName() override    { return deviceInfo.name; }\r
+        String getDeviceName() override    { return deviceName; }\r
 \r
-        //==============================================================================\r
-        WinRTWrapper::ComPtr<IBuffer> buffer;\r
-        WinRTWrapper::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
+        String deviceName;\r
+        ComSmartPtr<IMidiOutPort> midiOutPort;\r
+        ComSmartPtr<IBuffer> buffer;\r
+        ComSmartPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
         uint8_t* bufferData = nullptr;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WinRTOutputWrapper);\r
     };\r
 \r
-    WinRTWrapper::ComPtr<IMidiInPortStatics>  midiInFactory;\r
-    WinRTWrapper::ComPtr<IMidiOutPortStatics> midiOutFactory;\r
+    ComSmartPtr<IMidiInPortStatics>  midiInFactory;\r
+    ComSmartPtr<IMidiOutPortStatics> midiOutFactory;\r
 \r
     std::unique_ptr<MidiIODeviceWatcher<IMidiInPortStatics>>  inputDeviceWatcher;\r
     std::unique_ptr<MidiIODeviceWatcher<IMidiOutPortStatics>> outputDeviceWatcher;\r
-    std::unique_ptr<BLEDeviceWatcher> bleDeviceWatcher;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WinRTMidiService)\r
 };\r
 \r
 #endif   // JUCE_USE_WINRT_MIDI\r
 \r
-//==============================================================================\r
 //==============================================================================\r
 struct MidiService :  public DeletedAtShutdown\r
 {\r
     MidiService()\r
     {\r
-      #if JUCE_USE_WINRT_MIDI\r
-       #if ! JUCE_FORCE_WINRT_MIDI\r
-        auto windowsVersionInfo = []\r
-        {\r
-            RTL_OSVERSIONINFOW versionInfo = { 0 };\r
-\r
-            if (auto* mod = ::GetModuleHandleW (L"ntdll.dll"))\r
-            {\r
-                using RtlGetVersion = LONG (WINAPI*)(PRTL_OSVERSIONINFOW);\r
-\r
-                if (auto* rtlGetVersion = (RtlGetVersion) ::GetProcAddress (mod, "RtlGetVersion"))\r
-                {\r
-                    versionInfo.dwOSVersionInfoSize = sizeof (versionInfo);\r
-                    LONG STATUS_SUCCESS = 0;\r
-\r
-                    if (rtlGetVersion (&versionInfo) != STATUS_SUCCESS)\r
-                        versionInfo = { 0 };\r
-                }\r
-            }\r
-\r
-            return versionInfo;\r
-        }();\r
-\r
-        if (windowsVersionInfo.dwMajorVersion >= 10 && windowsVersionInfo.dwBuildNumber >= 17763)\r
-       #endif\r
+       #if JUCE_USE_WINRT_MIDI\r
+        try\r
         {\r
-            try\r
-            {\r
-                internal.reset (new WinRTMidiService());\r
-                return;\r
-            }\r
-            catch (std::runtime_error&) {}\r
+            internal.reset (new WinRTMidiService());\r
+            return;\r
         }\r
-      #endif\r
+        catch (std::runtime_error&) {}\r
+       #endif\r
 \r
         internal.reset (new Win32MidiService());\r
     }\r
index c68b13a203f7724cf21598f511a7f384285edf44..62908fed4d4d1f668a9462e63a3f86aa65c02830 100644 (file)
@@ -387,21 +387,21 @@ public:
             // Got a format that is supported by the device so we can ask what sample rates are supported (in whatever format)\r
         }\r
 \r
-        for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
-                           44100, 48000, 88200, 96000, 176400,\r
-                           192000, 352800, 384000, 705600, 768000 })\r
-       {\r
-            if (rates.contains (rate))\r
+        static const int ratesToTest[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 };\r
+\r
+        for (int i = 0; i < numElementsInArray (ratesToTest); ++i)\r
+        {\r
+            if (rates.contains (ratesToTest[i]))\r
                 continue;\r
 \r
-            format.Format.nSamplesPerSec  = (DWORD) rate;\r
+            format.Format.nSamplesPerSec  = (DWORD) ratesToTest[i];\r
             format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nChannels * format.Format.wBitsPerSample / 8);\r
 \r
             if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE\r
                                                                            : AUDCLNT_SHAREMODE_SHARED,\r
                                                           (WAVEFORMATEX*) &format, 0)))\r
-                if (! rates.contains (rate))\r
-                    rates.addUsingDefaultSort (rate);\r
+                if (! rates.contains (ratesToTest[i]))\r
+                    rates.addUsingDefaultSort (ratesToTest[i]);\r
         }\r
     }\r
 \r
index a09413201566ab0429b6e3e389b955197fbe943e..582362fdc8d81b9bf58f96d9c0606f6d8638090c 100644 (file)
@@ -42,9 +42,9 @@ namespace
         CFArrayRef extensions = nullptr;\r
         UInt32 sizeOfArray = sizeof (extensions);\r
 \r
-        if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, nullptr, &sizeOfArray, &extensions) == noErr)\r
+        if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, 0, &sizeOfArray, &extensions) == noErr)\r
         {\r
-            auto numValues = CFArrayGetCount (extensions);\r
+            const CFIndex numValues = CFArrayGetCount (extensions);\r
 \r
             for (CFIndex i = 0; i < numValues; ++i)\r
                 extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions, i)));\r
@@ -122,14 +122,14 @@ struct CoreAudioFormatMetatdata
     static StringPairArray parseUserDefinedChunk (InputStream& input, int64 size)\r
     {\r
         StringPairArray infoStrings;\r
-        auto originalPosition = input.getPosition();\r
+        const int64 originalPosition = input.getPosition();\r
 \r
         uint8 uuid[16];\r
         input.read (uuid, sizeof (uuid));\r
 \r
         if (memcmp (uuid, "\x29\x81\x92\x73\xB5\xBF\x4A\xEF\xB7\x8D\x62\xD1\xEF\x90\xBB\x2C", 16) == 0)\r
         {\r
-            auto numEntries = (uint32) input.readIntBigEndian();\r
+            const uint32 numEntries = (uint32) input.readIntBigEndian();\r
 \r
             for (uint32 i = 0; i < numEntries && input.getPosition() < originalPosition + size; ++i)\r
             {\r
@@ -314,7 +314,7 @@ struct CoreAudioFormatMetatdata
                     if (chunkHeader.chunkSize == -1)\r
                         break;\r
 \r
-                    input.setPosition (input.getPosition() + chunkHeader.chunkSize);\r
+                    input.skipNextBytes (chunkHeader.chunkSize);\r
                 }\r
                 else if (chunkHeader.chunkType == chunkName ("midi"))\r
                 {\r
@@ -327,7 +327,7 @@ struct CoreAudioFormatMetatdata
                 else\r
                 {\r
                     // we aren't decoding this chunk yet so just skip over it\r
-                    input.setPosition (input.getPosition() + chunkHeader.chunkSize);\r
+                    input.skipNextBytes (chunkHeader.chunkSize);\r
                 }\r
             }\r
         }\r
@@ -350,13 +350,13 @@ public:
         if (input != nullptr)\r
             CoreAudioFormatMetatdata::read (*input, metadataValues);\r
 \r
-        auto status = AudioFileOpenWithCallbacks (this,\r
-                                                  &readCallback,\r
-                                                  nullptr,  // write needs to be null to avoid permisisions errors\r
-                                                  &getSizeCallback,\r
-                                                  nullptr,  // setSize needs to be null to avoid permisisions errors\r
-                                                  0,        // AudioFileTypeID inFileTypeHint\r
-                                                  &audioFileID);\r
+        OSStatus status = AudioFileOpenWithCallbacks (this,\r
+                                                      &readCallback,\r
+                                                      nullptr,  // write needs to be null to avoid permisisions errors\r
+                                                      &getSizeCallback,\r
+                                                      nullptr,  // setSize needs to be null to avoid permisisions errors\r
+                                                      0,        // AudioFileTypeID inFileTypeHint\r
+                                                      &audioFileID);\r
         if (status == noErr)\r
         {\r
             status = ExtAudioFileWrapAudioFileID (audioFileID, false, &audioFileRef);\r
@@ -665,7 +665,7 @@ public:
             for (auto tagEntry : knownTags)\r
                 expect (AudioChannelSet::channelSetWithChannels (CoreAudioLayouts::getSpeakerLayoutForCoreAudioTag (tagEntry.tag))\r
                             == CoreAudioLayouts::fromCoreAudio (tagEntry.tag),\r
-                        "Tag \"" + String (tagEntry.name) + "\" is not converted consistently by JUCE");\r
+                        "Tag \"" + String (tagEntry.name) + "\" is not converted consistantly by JUCE");\r
         }\r
 \r
         {\r
index 8697855bbe200c6fb1eb8e3b8e55a9748077f1da..b83935c8d52fe982c9b1457755f2d04a6caeb1f4 100644 (file)
@@ -117,9 +117,6 @@ namespace FlacNamespace
   #pragma clang diagnostic ignored "-Wconversion"\r
   #pragma clang diagnostic ignored "-Wshadow"\r
   #pragma clang diagnostic ignored "-Wdeprecated-register"\r
-  #if __has_warning("-Wzero-as-null-pointer-constant")\r
-   #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
-  #endif\r
  #endif\r
 \r
  #if JUCE_INTEL\r
@@ -248,7 +245,7 @@ public:
             }\r
             else\r
             {\r
-                if (startSampleInFile >= lengthInSamples)\r
+                if (startSampleInFile >= (int) lengthInSamples)\r
                 {\r
                     samplesInReservoir = 0;\r
                 }\r
@@ -301,7 +298,7 @@ public:
                 auto* src = buffer[i];\r
                 int n = i;\r
 \r
-                while (src == nullptr && n > 0)\r
+                while (src == 0 && n > 0)\r
                     src = buffer [--n];\r
 \r
                 if (src != nullptr)\r
index 14dc9d1e636669011bfbe623c287af2a6c42e778..ffa9a2fd98d4cc587821182f65d6d7846eadc182 100644 (file)
@@ -1961,8 +1961,8 @@ private:
             {\r
                 const uint8 n0 = si.allocation[i][0];\r
                 const uint8 n1 = si.allocation[i][1];\r
-                fraction[0][i] = n0 > 0 ? (float) ((-(1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0;\r
-                fraction[1][i] = n1 > 0 ? (float) ((-(1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0;\r
+                fraction[0][i] = n0 > 0 ? (float) (((-1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0;\r
+                fraction[1][i] = n1 > 0 ? (float) (((-1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0;\r
             }\r
 \r
             for (i = jsbound; i < 32; ++i)\r
@@ -1971,7 +1971,7 @@ private:
 \r
                 if (n > 0)\r
                 {\r
-                    const uint32 w = ((uint32) -(1 << n) + getBitsUint16 (n + 1) + 1);\r
+                    const uint32 w = ((uint32) (-1 << n) + getBitsUint16 (n + 1) + 1);\r
                     fraction[0][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][0]]);\r
                     fraction[1][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][1]]);\r
                 }\r
@@ -1987,7 +1987,7 @@ private:
                 const uint8 j = si.scaleFactor[i][0];\r
 \r
                 if (n > 0)\r
-                    fraction[0][i] = (float) ((-(1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]);\r
+                    fraction[0][i] = (float) (((-1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]);\r
                 else\r
                     fraction[0][i] = 0;\r
             }\r
index 44ecd9a4c241349c026ce40bc38bf9ff2597f46f..ae46ec2a0bdd6cb14bb4781ba17f7b7b1155c78e 100644 (file)
@@ -44,9 +44,6 @@ namespace OggVorbisNamespace
   #pragma clang diagnostic ignored "-Wconversion"\r
   #pragma clang diagnostic ignored "-Wshadow"\r
   #pragma clang diagnostic ignored "-Wdeprecated-register"\r
-  #if __has_warning("-Wzero-as-null-pointer-constant")\r
-   #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
-  #endif\r
  #elif JUCE_GCC\r
   #pragma GCC diagnostic push\r
   #pragma GCC diagnostic ignored "-Wshadow"\r
@@ -124,7 +121,7 @@ public:
         callbacks.close_func = &oggCloseCallback;\r
         callbacks.tell_func  = &oggTellCallback;\r
 \r
-        auto err = ov_open_callbacks (input, &ovFile, nullptr, 0, callbacks);\r
+        auto err = ov_open_callbacks (input, &ovFile, 0, 0, callbacks);\r
 \r
         if (err == 0)\r
         {\r
@@ -380,7 +377,7 @@ public:
 \r
         while (vorbis_analysis_blockout (&vd, &vb) == 1)\r
         {\r
-            vorbis_analysis (&vb, nullptr);\r
+            vorbis_analysis (&vb, 0);\r
             vorbis_bitrate_addblock (&vb);\r
 \r
             while (vorbis_bitrate_flushpacket (&vd, &op))\r
@@ -489,7 +486,9 @@ int OggVorbisAudioFormat::estimateOggFileQuality (const File& source)
 {\r
     if (auto* in = source.createInputStream())\r
     {\r
-        if (auto r = std::unique_ptr<AudioFormatReader> (createReaderFor (in, true)))\r
+        std::unique_ptr<AudioFormatReader> r (createReaderFor (in, true));\r
+\r
+        if (r != nullptr)\r
         {\r
             auto lengthSecs = r->lengthInSamples / r->sampleRate;\r
             auto approxBitsPerSecond = (int) (source.getSize() * 8 / lengthSecs);\r
index bd44388f72606178ecb5e9e507624228cd42cf18..975e86daaf7473d8c5af3ea587ac2a467c2c2dd0 100644 (file)
@@ -849,21 +849,20 @@ namespace WavFileHelpers
     {\r
         static void addToMetadata (StringPairArray& destValues, const String& source)\r
         {\r
-            if (auto xml = parseXML (source))\r
+            std::unique_ptr<XmlElement> xml (XmlDocument::parse (source));\r
+\r
+            if (xml != nullptr && xml->hasTagName ("ebucore:ebuCoreMain"))\r
             {\r
-                if (xml->hasTagName ("ebucore:ebuCoreMain"))\r
+                if (auto* xml2 = xml->getChildByName ("ebucore:coreMetadata"))\r
                 {\r
-                    if (auto xml2 = xml->getChildByName ("ebucore:coreMetadata"))\r
+                    if (auto* xml3 = xml2->getChildByName ("ebucore:identifier"))\r
                     {\r
-                        if (auto xml3 = xml2->getChildByName ("ebucore:identifier"))\r
+                        if (auto* xml4 = xml3->getChildByName ("dc:identifier"))\r
                         {\r
-                            if (auto xml4 = xml3->getChildByName ("dc:identifier"))\r
-                            {\r
-                                auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
+                            auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
 \r
-                                if (ISRCCode.isNotEmpty())\r
-                                    destValues.set (WavAudioFormat::ISRC, ISRCCode);\r
-                            }\r
+                            if (ISRCCode.isNotEmpty())\r
+                                destValues.set (WavAudioFormat::ISRC, ISRCCode);\r
                         }\r
                     }\r
                 }\r
index 126b2fe57b29397e253203d17c9b9d029c50bfa9..2f914d37053d08b3061716e5b916c240b8e91635 100644 (file)
@@ -257,9 +257,10 @@ int64 AudioFormatReader::searchForLevel (int64 startSample,
     const int bufferSize = 4096;\r
     HeapBlock<int> tempSpace (bufferSize * 2 + 64);\r
 \r
-    int* tempBuffer[3] = { tempSpace.get(),\r
-                           tempSpace.get() + bufferSize,\r
-                           nullptr };\r
+    int* tempBuffer[3];\r
+    tempBuffer[0] = tempSpace.get();\r
+    tempBuffer[1] = tempSpace.get() + bufferSize;\r
+    tempBuffer[2] = 0;\r
 \r
     int consecutive = 0;\r
     int64 firstMatchPos = -1;\r
@@ -279,7 +280,7 @@ int64 AudioFormatReader::searchForLevel (int64 startSample,
         if (numSamplesToSearch < 0)\r
             bufferStart -= numThisTime;\r
 \r
-        if (bufferStart >= lengthInSamples)\r
+        if (bufferStart >= (int) lengthInSamples)\r
             break;\r
 \r
         read (tempBuffer, 2, bufferStart, numThisTime, false);\r
index 4234a4fee1b0f697c23df1e05e1bbd8bf5d5834f..5a64e737e9b769d1db7939e59228daf4ee4f82c7 100644 (file)
@@ -86,7 +86,7 @@ bool AudioFormatWriter::writeFromAudioReader (AudioFormatReader& reader,
     const int bufferSize = 16384;\r
     AudioBuffer<float> tempBuffer ((int) numChannels, bufferSize);\r
 \r
-    int* buffers[128] = { nullptr };\r
+    int* buffers[128] = { 0 };\r
 \r
     for (int i = tempBuffer.getNumChannels(); --i >= 0;)\r
         buffers[i] = reinterpret_cast<int*> (tempBuffer.getWritePointer (i, 0));\r
index 16f699b2958f36fda04a08dd177ca590ab176aff..3231dc87c20d5995d642cc00be5785b546a53642 100644 (file)
@@ -240,6 +240,7 @@ public:
 \r
     private:\r
         class Buffer;\r
+        friend struct ContainerDeletePolicy<Buffer>;\r
         std::unique_ptr<Buffer> buffer;\r
     };\r
 \r
index 94106e2cc4b17ef726c8325cc213eaba1f9e05d5..0fc827297afa7dd58d38f1c65bc533acf971efbf 100644 (file)
 namespace juce\r
 {\r
 \r
-AudioSubsectionReader::AudioSubsectionReader (AudioFormatReader* sourceToUse,\r
-                                              int64 startSampleToUse, int64 lengthToUse,\r
-                                              bool deleteSource)\r
-   : AudioFormatReader (nullptr, sourceToUse->getFormatName()),\r
-     source (sourceToUse),\r
-     startSample (startSampleToUse),\r
-     deleteSourceWhenDeleted (deleteSource)\r
+AudioSubsectionReader::AudioSubsectionReader (AudioFormatReader* const source_,\r
+                                              const int64 startSample_,\r
+                                              const int64 length_,\r
+                                              const bool deleteSourceWhenDeleted_)\r
+   : AudioFormatReader (0, source_->getFormatName()),\r
+     source (source_),\r
+     startSample (startSample_),\r
+     deleteSourceWhenDeleted (deleteSourceWhenDeleted_)\r
 {\r
-    length = jmin (jmax ((int64) 0, source->lengthInSamples - startSample), lengthToUse);\r
+    length = jmin (jmax ((int64) 0, source->lengthInSamples - startSample), length_);\r
 \r
     sampleRate = source->sampleRate;\r
     bitsPerSample = source->bitsPerSample;\r
index eda6f7f2a20ba557c595f1b9023de0123a580f95..0980c00b237f647089649379c155bdae2d6757d6 100644 (file)
@@ -32,7 +32,9 @@ BufferingAudioReader::BufferingAudioReader (AudioFormatReader* sourceReader,
                                             int samplesToBuffer)\r
     : AudioFormatReader (nullptr, sourceReader->getFormatName()),\r
       source (sourceReader), thread (timeSliceThread),\r
-      numBlocks (1 + (samplesToBuffer / samplesPerBlock))\r
+      nextReadPosition (0),\r
+      numBlocks (1 + (samplesToBuffer / samplesPerBlock)),\r
+      timeoutMs (0)\r
 {\r
     sampleRate            = source->sampleRate;\r
     lengthInSamples       = source->lengthInSamples;\r
@@ -60,7 +62,7 @@ void BufferingAudioReader::setReadTimeout (int timeoutMilliseconds) noexcept
 bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,\r
                                         int64 startSampleInFile, int numSamples)\r
 {\r
-    auto startTime = Time::getMillisecondCounter();\r
+    const uint32 startTime = Time::getMillisecondCounter();\r
     clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,\r
                                        startSampleInFile, numSamples, lengthInSamples);\r
 \r
@@ -69,14 +71,14 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels,
 \r
     while (numSamples > 0)\r
     {\r
-        if (auto block = getBlockContaining (startSampleInFile))\r
+        if (const BufferedBlock* const block = getBlockContaining (startSampleInFile))\r
         {\r
-            auto offset = (int) (startSampleInFile - block->range.getStart());\r
-            auto numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile));\r
+            const int offset = (int) (startSampleInFile - block->range.getStart());\r
+            const int numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile));\r
 \r
             for (int j = 0; j < numDestChannels; ++j)\r
             {\r
-                if (auto dest = (float*) destSamples[j])\r
+                if (float* dest = (float*) destSamples[j])\r
                 {\r
                     dest += startOffsetInDestBuffer;\r
 \r
@@ -96,7 +98,7 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels,
             if (timeoutMs >= 0 && Time::getMillisecondCounter() >= startTime + (uint32) timeoutMs)\r
             {\r
                 for (int j = 0; j < numDestChannels; ++j)\r
-                    if (auto dest = (float*) destSamples[j])\r
+                    if (float* dest = (float*) destSamples[j])\r
                         FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples);\r
 \r
                 break;\r
@@ -121,9 +123,13 @@ BufferingAudioReader::BufferedBlock::BufferedBlock (AudioFormatReader& reader, i
 \r
 BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept\r
 {\r
-    for (auto* b : blocks)\r
+    for (int i = blocks.size(); --i >= 0;)\r
+    {\r
+        BufferedBlock* const b = blocks.getUnchecked(i);\r
+\r
         if (b->range.contains (pos))\r
             return b;\r
+    }\r
 \r
     return nullptr;\r
 }\r
@@ -135,9 +141,9 @@ int BufferingAudioReader::useTimeSlice()
 \r
 bool BufferingAudioReader::readNextBufferChunk()\r
 {\r
-    auto pos = nextReadPosition.load();\r
-    auto startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock;\r
-    auto endPos = startPos + numBlocks * samplesPerBlock;\r
+    const int64 pos = nextReadPosition;\r
+    const int64 startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock;\r
+    const int64 endPos = startPos + numBlocks * samplesPerBlock;\r
 \r
     OwnedArray<BufferedBlock> newBlocks;\r
 \r
@@ -151,7 +157,7 @@ bool BufferingAudioReader::readNextBufferChunk()
         return false;\r
     }\r
 \r
-    for (auto p = startPos; p < endPos; p += samplesPerBlock)\r
+    for (int64 p = startPos; p < endPos; p += samplesPerBlock)\r
     {\r
         if (getBlockContaining (p) == nullptr)\r
         {\r
index 964a36b846f9c1038f91c46589bd6eabd660f19a..e45d05df974950733fbfeb4e68fec95b9018e936 100644 (file)
@@ -69,9 +69,9 @@ public:
 private:\r
     std::unique_ptr<AudioFormatReader> source;\r
     TimeSliceThread& thread;\r
-    std::atomic<int64> nextReadPosition { 0 };\r
+    int64 nextReadPosition;\r
     const int numBlocks;\r
-    int timeoutMs = 0;\r
+    int timeoutMs;\r
 \r
     enum { samplesPerBlock = 32768 };\r
 \r
index a4fbca4af89ecb9c143a16ef1ec5849916b7886b..500777ae488b12678c1bc2d97c941a5d41093f57 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_audio_formats\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE audio file format codecs\r
   description:      Classes for reading and writing various audio file formats.\r
   website:          http://www.juce.com/juce\r
index aa07dda58dcc9bdf6687de77fb82966671c86eda..c205381d599999ba56dbc483f64d3641405cef8d 100644 (file)
@@ -1091,9 +1091,7 @@ namespace AAXClasses
                 }\r
             }\r
             else\r
-            {\r
                 isSuspended = true;\r
-            }\r
 \r
             if (isSuspended)\r
             {\r
@@ -1609,9 +1607,6 @@ namespace AAXClasses
                 audioProcessor.prepareToPlay (sampleRate, lastBufferSize);\r
                 maxBufferSize = lastBufferSize;\r
 \r
-                midiBuffer.ensureSize (2048);\r
-                midiBuffer.clear();\r
-\r
                 sideChainBuffer.calloc (static_cast<size_t> (maxBufferSize));\r
             }\r
 \r
@@ -1709,103 +1704,6 @@ namespace AAXClasses
             updateSidechainState();\r
         }\r
 \r
-        //==============================================================================\r
-        static AudioProcessor::CurveData::Type aaxCurveTypeToJUCE (AAX_CTypeID type) noexcept\r
-        {\r
-            switch (type)\r
-            {\r
-            case AAX_eCurveType_EQ:              return AudioProcessor::CurveData::Type::EQ;\r
-            case AAX_eCurveType_Dynamics:        return AudioProcessor::CurveData::Type::Dynamics;\r
-            case AAX_eCurveType_Reduction:       return AudioProcessor::CurveData::Type::GainReduction;\r
-            default:  break;\r
-            }\r
-\r
-            return AudioProcessor::CurveData::Type::Unknown;\r
-        }\r
-\r
-        uint32_t getAAXMeterIdForParamId (const String& paramID) const noexcept\r
-        {\r
-            int idx;\r
-\r
-            for (idx = 0; idx < aaxMeters.size(); ++idx)\r
-                if (LegacyAudioParameter::getParamID (aaxMeters[idx], false) == paramID)\r
-                    break;\r
-\r
-            // you sepecified a parameter id in your curve but the parameter does not have the meter\r
-            // category\r
-            jassert (idx < aaxMeters.size());\r
-            return 'Metr' + static_cast<AAX_CTypeID> (idx);\r
-        }\r
-\r
-        //==============================================================================\r
-        AAX_Result GetCurveData (AAX_CTypeID iCurveType, const float * iValues, uint32_t iNumValues, float * oValues ) const override\r
-        {\r
-            auto curveType = aaxCurveTypeToJUCE (iCurveType);\r
-\r
-            if (curveType != AudioProcessor::CurveData::Type::Unknown)\r
-            {\r
-                auto& audioProcessor = getPluginInstance();\r
-                auto curve = audioProcessor.getResponseCurve (curveType);\r
-\r
-                if (curve.curve)\r
-                {\r
-                    if (oValues != nullptr && iValues != nullptr)\r
-                    {\r
-                        for (uint32_t i = 0; i < iNumValues; ++i)\r
-                            oValues[i] = curve.curve (iValues[i]);\r
-                    }\r
-\r
-                    return AAX_SUCCESS;\r
-                }\r
-            }\r
-\r
-            return AAX_ERROR_UNIMPLEMENTED;\r
-        }\r
-\r
-        AAX_Result GetCurveDataMeterIds (AAX_CTypeID iCurveType, uint32_t *oXMeterId, uint32_t *oYMeterId)  const override\r
-        {\r
-            auto curveType = aaxCurveTypeToJUCE (iCurveType);\r
-\r
-            if (curveType != AudioProcessor::CurveData::Type::Unknown)\r
-            {\r
-                auto& audioProcessor = getPluginInstance();\r
-                auto curve = audioProcessor.getResponseCurve (curveType);\r
-\r
-                if (curve.curve && curve.xMeterID.isNotEmpty() && curve.yMeterID.isNotEmpty())\r
-                {\r
-                    if (oXMeterId != nullptr) *oXMeterId = getAAXMeterIdForParamId (curve.xMeterID);\r
-                    if (oYMeterId != nullptr) *oYMeterId = getAAXMeterIdForParamId (curve.yMeterID);\r
-\r
-                    return AAX_SUCCESS;\r
-                }\r
-            }\r
-\r
-            return AAX_ERROR_UNIMPLEMENTED;\r
-        }\r
-\r
-        AAX_Result GetCurveDataDisplayRange (AAX_CTypeID iCurveType, float *oXMin, float *oXMax, float *oYMin, float *oYMax) const override\r
-        {\r
-            auto curveType = aaxCurveTypeToJUCE (iCurveType);\r
-\r
-            if (curveType != AudioProcessor::CurveData::Type::Unknown)\r
-            {\r
-                auto& audioProcessor = getPluginInstance();\r
-                auto curve = audioProcessor.getResponseCurve (curveType);\r
-\r
-                if (curve.curve)\r
-                {\r
-                    if (oXMin != nullptr) *oXMin = curve.xRange.getStart();\r
-                    if (oXMax != nullptr) *oXMax = curve.xRange.getEnd();\r
-                    if (oYMin != nullptr) *oYMin = curve.yRange.getStart();\r
-                    if (oYMax != nullptr) *oYMax = curve.yRange.getEnd();\r
-\r
-                    return AAX_SUCCESS;\r
-                }\r
-            }\r
-\r
-            return AAX_ERROR_UNIMPLEMENTED;\r
-        }\r
-\r
         //==============================================================================\r
         inline int getParamIndexFromID (AAX_CParamID paramID) const noexcept\r
         {\r
@@ -1894,7 +1792,7 @@ namespace AAXClasses
         // and the size of the data returned. To avoid generating\r
         // it again in GetChunk, we need to store it somewhere.\r
         // However, as GetChunkSize and GetChunk can be called\r
-        // on different threads, we store it in thread dependent storage\r
+        // on different threads, we store it in thread dependant storage\r
         // in a hash map with the thread id as a key.\r
         mutable ThreadLocalValue<ChunkMemoryBlock> perThreadFilterData;\r
         CriticalSection perThreadDataLock;\r
index d8d7f8fd8f02663a2d9bf390608b0edeffb1e9e3..ece0bc19b8a01ef113742ecee593882dbd35a434 100644 (file)
@@ -118,6 +118,7 @@ public:
     //==============================================================================\r
     virtual void createPlugin()\r
     {\r
+\r
       #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client\r
         processor.reset (::createPluginFilterOfType (AudioProcessor::wrapperType_Standalone));\r
       #else\r
@@ -426,8 +427,7 @@ private:
               deviceSelector (deviceManagerToUse,\r
                               minAudioInputChannels, maxAudioInputChannels,\r
                               minAudioOutputChannels, maxAudioOutputChannels,\r
-                              true,\r
-                              (pluginHolder.processor.get() != nullptr && pluginHolder.processor->producesMidi()),\r
+                              true, false,\r
                               true, false),\r
               shouldMuteLabel  ("Feedback Loop:", "Feedback Loop:"),\r
               shouldMuteButton ("Mute audio input")\r
@@ -508,12 +508,10 @@ private:
         emptyBuffer.clear();\r
 \r
         player.audioDeviceAboutToStart (device);\r
-        player.setMidiOutput (deviceManager.getDefaultMidiOutput());\r
     }\r
 \r
     void audioDeviceStopped() override\r
     {\r
-        player.setMidiOutput (nullptr);\r
         player.audioDeviceStopped();\r
         emptyBuffer.setSize (0, 0);\r
     }\r
diff --git a/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h b/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h
deleted file mode 100644 (file)
index 5cfe674..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-\r
-//==============================================================================\r
-#define UNITY_AUDIO_PLUGIN_API_VERSION 0x010401\r
-\r
-#if JUCE_WINDOWS\r
- #define UNITY_INTERFACE_API __stdcall\r
- #define UNITY_INTERFACE_EXPORT __declspec(dllexport)\r
-#else\r
- #define UNITY_INTERFACE_API\r
- #define UNITY_INTERFACE_EXPORT __attribute__ ((visibility("default")))\r
-#endif\r
-\r
-//==============================================================================\r
-struct UnityAudioEffectState;\r
-\r
-typedef int  (UNITY_INTERFACE_API * createCallback)              (UnityAudioEffectState* state);\r
-typedef int  (UNITY_INTERFACE_API * releaseCallback)             (UnityAudioEffectState* state);\r
-typedef int  (UNITY_INTERFACE_API * resetCallback)               (UnityAudioEffectState* state);\r
-\r
-typedef int  (UNITY_INTERFACE_API * processCallback)             (UnityAudioEffectState* state, float* inBuffer, float* outBuffer, unsigned int bufferSize,\r
-                                                                  int numInChannels, int numOutChannels);\r
-\r
-typedef int  (UNITY_INTERFACE_API * setPositionCallback)         (UnityAudioEffectState* state, unsigned int pos);\r
-\r
-typedef int  (UNITY_INTERFACE_API * setFloatParameterCallback)   (UnityAudioEffectState* state, int index, float value);\r
-typedef int  (UNITY_INTERFACE_API * getFloatParameterCallback)   (UnityAudioEffectState* state, int index, float* value, char* valuestr);\r
-typedef int  (UNITY_INTERFACE_API * getFloatBufferCallback)      (UnityAudioEffectState* state, const char* name, float* buffer, int numsamples);\r
-\r
-typedef int  (UNITY_INTERFACE_API * distanceAttenuationCallback) (UnityAudioEffectState* state, float distanceIn, float attenuationIn, float* attenuationOut);\r
-\r
-typedef void (UNITY_INTERFACE_API * renderCallback)              (int eventId);\r
-\r
-//==============================================================================\r
-enum UnityAudioEffectDefinitionFlags\r
-{\r
-    isSideChainTarget = 1,\r
-    isSpatializer = 2,\r
-    isAmbisonicDecoder = 4,\r
-    appliesDistanceAttenuation = 8\r
-};\r
-\r
-enum UnityAudioEffectStateFlags\r
-{\r
-    stateIsPlaying = 1,\r
-    stateIsPaused = 2,\r
-    stateIsMuted = 8,\r
-    statIsSideChainTarget = 16\r
-};\r
-\r
-enum UnityEventModifiers\r
-{\r
-    shift = 1,\r
-    control = 2,\r
-    alt = 4,\r
-    command = 8,\r
-    numeric = 16,\r
-    capsLock = 32,\r
-    functionKey = 64\r
-};\r
-\r
-//==============================================================================\r
-struct UnityAudioSpatializerData\r
-{\r
-    float                          listenerMatrix[16];\r
-    float                          sourceMatrix[16];\r
-    float                          spatialBlend;\r
-    float                          reverbZoneMix;\r
-    float                          spread;\r
-    float                          stereoPan;\r
-    distanceAttenuationCallback    attenuationCallback;\r
-    float                          minDistance;\r
-    float                          maxDistance;\r
-};\r
-\r
-struct UnityAudioAmbisonicData\r
-{\r
-    float                          listenerMatrix[16];\r
-    float                          sourceMatrix[16];\r
-    float                          spatialBlend;\r
-    float                          reverbZoneMix;\r
-    float                          spread;\r
-    float                          stereoPan;\r
-    distanceAttenuationCallback    attenuationCallback;\r
-    int                            ambisonicOutChannels;\r
-    float                          volume;\r
-};\r
-\r
-struct UnityAudioEffectState\r
-{\r
-    juce::uint32               structSize;\r
-    juce::uint32               sampleRate;\r
-    juce::uint64               dspCurrentTick;\r
-    juce::uint64               dspPreviousTick;\r
-    float*                     sidechainBuffer;\r
-    void*                      effectData;\r
-    juce::uint32               flags;\r
-    void*                      internal;\r
-\r
-    UnityAudioSpatializerData* spatializerData;\r
-    juce::uint32               dspBufferSize;\r
-    juce::uint32               hostAPIVersion;\r
-\r
-    UnityAudioAmbisonicData*   ambisonicData;\r
-\r
-    template<typename T>\r
-    inline T* getEffectData() const\r
-    {\r
-        jassert (effectData != nullptr);\r
-        jassert (internal != nullptr);\r
-\r
-        return (T*) effectData;\r
-    }\r
-};\r
-\r
-struct UnityAudioParameterDefinition\r
-{\r
-    char        name[16];\r
-    char        unit[16];\r
-    const char* description;\r
-    float       min;\r
-    float       max;\r
-    float       defaultVal;\r
-    float       displayScale;\r
-    float       displayExponent;\r
-};\r
-\r
-struct UnityAudioEffectDefinition\r
-{\r
-    juce::uint32                   structSize;\r
-    juce::uint32                   parameterStructSize;\r
-    juce::uint32                   apiVersion;\r
-    juce::uint32                   pluginVersion;\r
-    juce::uint32                   channels;\r
-    juce::uint32                   numParameters;\r
-    juce::uint64                   flags;\r
-    char                           name[32];\r
-    createCallback                 create;\r
-    releaseCallback                release;\r
-    resetCallback                  reset;\r
-    processCallback                process;\r
-    setPositionCallback            setPosition;\r
-    UnityAudioParameterDefinition* parameterDefintions;\r
-    setFloatParameterCallback      setFloatParameter;\r
-    getFloatParameterCallback      getFloatParameter;\r
-    getFloatBufferCallback         getFloatBuffer;\r
-};\r
-\r
-//==============================================================================\r
-// Unity callback\r
-extern "C" UNITY_INTERFACE_EXPORT int  UNITY_INTERFACE_API UnityGetAudioEffectDefinitions (UnityAudioEffectDefinition*** definitionsPtr);\r
-\r
-// GUI script callbacks\r
-extern "C" UNITY_INTERFACE_EXPORT renderCallback UNITY_INTERFACE_API getRenderCallback();\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityInitialiseTexture (int id, void* textureHandle, int w, int h);\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDown (int id, float x, float y, UnityEventModifiers mods, int button);\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDrag (int id, float x, float y, UnityEventModifiers mods, int button);\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseUp   (int id, float x, float y, UnityEventModifiers mods);\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityKeyEvent (int id, int code, UnityEventModifiers mods, const char* name);\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unitySetScreenBounds (int id, float x, float y, float w, float h);\r
diff --git a/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp b/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp
deleted file mode 100644 (file)
index f7de752..0000000
+++ /dev/null
@@ -1,768 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#if JucePlugin_Build_Unity\r
-\r
-#include "../../juce_core/system/juce_TargetPlatform.h"\r
-#include "../utility/juce_IncludeModuleHeaders.h"\r
-#include "../../juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp"\r
-\r
-#if JUCE_WINDOWS\r
- #include "../utility/juce_IncludeSystemHeaders.h"\r
-#endif\r
-\r
-#include "juce_UnityPluginInterface.h"\r
-\r
-//==============================================================================\r
-namespace juce\r
-{\r
-\r
-typedef ComponentPeer* (*createUnityPeerFunctionType) (Component&);\r
-extern createUnityPeerFunctionType juce_createUnityPeerFn;\r
-\r
-//==============================================================================\r
-class UnityPeer    : public ComponentPeer,\r
-                     public AsyncUpdater\r
-{\r
-public:\r
-    UnityPeer (Component& ed)\r
-        : ComponentPeer (ed, 0),\r
-          mouseWatcher (*this)\r
-    {\r
-        getEditor().setResizable (false, false);\r
-    }\r
-\r
-    //==============================================================================\r
-    Rectangle<int> getBounds() const override                              { return bounds; }\r
-    Point<float> localToGlobal (Point<float> relativePosition) override    { return relativePosition + getBounds().getPosition().toFloat(); }\r
-    Point<float> globalToLocal (Point<float> screenPosition) override      { return screenPosition - getBounds().getPosition().toFloat(); }\r
-\r
-    StringArray getAvailableRenderingEngines() override                    { return StringArray ("Software Renderer"); }\r
-\r
-    void setBounds (const Rectangle<int>& newBounds, bool) override\r
-    {\r
-        bounds = newBounds;\r
-        mouseWatcher.setBoundsToWatch (bounds);\r
-    }\r
-\r
-    bool contains (Point<int> localPos, bool) const override\r
-    {\r
-        if (isPositiveAndBelow (localPos.getX(), getBounds().getWidth())\r
-               && isPositiveAndBelow (localPos.getY(), getBounds().getHeight()))\r
-            return true;\r
-\r
-        return false;\r
-    }\r
-\r
-    void handleAsyncUpdate() override\r
-    {\r
-        fillPixels();\r
-    }\r
-\r
-    //==============================================================================\r
-    AudioProcessorEditor& getEditor()    { return *dynamic_cast<AudioProcessorEditor*> (&getComponent()); }\r
-\r
-    void setPixelDataHandle (uint8* handle, int width, int height)\r
-    {\r
-        pixelData = handle;\r
-\r
-        textureWidth = width;\r
-        textureHeight = height;\r
-\r
-        renderImage = Image (new UnityBitmapImage (pixelData, width, height));\r
-    }\r
-\r
-    // N.B. This is NOT an efficient way to do this and you shouldn't use this method in your own code.\r
-    // It works for our purposes here but a much more efficient way would be to use a GL texture.\r
-    void fillPixels()\r
-    {\r
-        if (pixelData == nullptr)\r
-            return;\r
-\r
-        LowLevelGraphicsSoftwareRenderer renderer (renderImage);\r
-        renderer.addTransform (AffineTransform::verticalFlip ((float) getComponent().getHeight()));\r
-\r
-        handlePaint (renderer);\r
-\r
-        for (int i = 0; i < textureWidth * textureHeight * 4; i += 4)\r
-        {\r
-            auto r = pixelData[i + 2];\r
-            auto g = pixelData[i + 1];\r
-            auto b = pixelData[i + 0];\r
-\r
-            pixelData[i + 0] = r;\r
-            pixelData[i + 1] = g;\r
-            pixelData[i + 2] = b;\r
-        }\r
-    }\r
-\r
-    void forwardMouseEvent (Point<float> position, ModifierKeys mods)\r
-    {\r
-        ModifierKeys::currentModifiers = mods;\r
-\r
-        handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::invalidPressure,\r
-                          juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());\r
-    }\r
-\r
-    void forwardKeyPress (int code, String name, ModifierKeys mods)\r
-    {\r
-        ModifierKeys::currentModifiers = mods;\r
-\r
-        handleKeyPress (getKeyPress (code, name));\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    struct UnityBitmapImage    : public ImagePixelData\r
-    {\r
-        UnityBitmapImage (uint8* data, int w, int h)\r
-            : ImagePixelData (Image::PixelFormat::ARGB, w, h),\r
-              imageData (data),\r
-              lineStride (width * pixelStride)\r
-        {\r
-        }\r
-\r
-        ImageType* createType() const override                       { return new SoftwareImageType(); }\r
-        LowLevelGraphicsContext* createLowLevelContext() override    { return new LowLevelGraphicsSoftwareRenderer (Image (this)); }\r
-\r
-        void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
-        {\r
-            ignoreUnused (mode);\r
-\r
-            bitmap.data = imageData + x * pixelStride + y * lineStride;\r
-            bitmap.pixelFormat = pixelFormat;\r
-            bitmap.lineStride = lineStride;\r
-            bitmap.pixelStride = pixelStride;\r
-        }\r
-\r
-        ImagePixelData::Ptr clone() override\r
-        {\r
-            auto im = new UnityBitmapImage (imageData, width, height);\r
-\r
-            for (int i = 0; i < height; ++i)\r
-                memcpy (im->imageData + i * lineStride, imageData + i * lineStride, (size_t) lineStride);\r
-\r
-            return im;\r
-        }\r
-\r
-        uint8* imageData;\r
-        int pixelStride = 4, lineStride;\r
-\r
-        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnityBitmapImage)\r
-    };\r
-\r
-    //==============================================================================\r
-    struct MouseWatcher    : public Timer\r
-    {\r
-        MouseWatcher (ComponentPeer& o)    : owner (o)    {}\r
-\r
-        void timerCallback() override\r
-        {\r
-            auto pos = Desktop::getMousePosition();\r
-\r
-            if (boundsToWatch.contains (pos) && pos != lastMousePos)\r
-            {\r
-                auto ms = Desktop::getInstance().getMainMouseSource();\r
-\r
-                if (! ms.getCurrentModifiers().isLeftButtonDown())\r
-                    owner.handleMouseEvent (juce::MouseInputSource::mouse, owner.globalToLocal (pos.toFloat()), {},\r
-                                            juce::MouseInputSource::invalidPressure, juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());\r
-\r
-                lastMousePos = pos;\r
-            }\r
-\r
-        }\r
-\r
-        void setBoundsToWatch (Rectangle<int> b)\r
-        {\r
-            if (boundsToWatch != b)\r
-                boundsToWatch = b;\r
-\r
-            startTimer (250);\r
-        }\r
-\r
-        ComponentPeer& owner;\r
-        Rectangle<int> boundsToWatch;\r
-        Point<int> lastMousePos;\r
-    };\r
-\r
-    //==============================================================================\r
-    KeyPress getKeyPress (int keyCode, String name)\r
-    {\r
-        if (keyCode >= 32 && keyCode <= 64)\r
-            return { keyCode, ModifierKeys::currentModifiers, juce::juce_wchar (keyCode) };\r
-\r
-        if (keyCode >= 91 && keyCode <= 122)\r
-            return { keyCode, ModifierKeys::currentModifiers, name[0] };\r
-\r
-        if (keyCode >= 256 && keyCode <= 265)\r
-            return { juce::KeyPress::numberPad0 + (keyCode - 256), ModifierKeys::currentModifiers, juce::String (keyCode - 256).getCharPointer()[0] };\r
-\r
-        if (keyCode == 8)      return { juce::KeyPress::backspaceKey,          ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 127)    return { juce::KeyPress::deleteKey,             ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 9)      return { juce::KeyPress::tabKey,                ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 13)     return { juce::KeyPress::returnKey,             ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 27)     return { juce::KeyPress::escapeKey,             ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 32)     return { juce::KeyPress::spaceKey,              ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 266)    return { juce::KeyPress::numberPadDecimalPoint, ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 267)    return { juce::KeyPress::numberPadDivide,       ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 268)    return { juce::KeyPress::numberPadMultiply,     ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 269)    return { juce::KeyPress::numberPadSubtract,     ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 270)    return { juce::KeyPress::numberPadAdd,          ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 272)    return { juce::KeyPress::numberPadEquals,       ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 273)    return { juce::KeyPress::upKey,                 ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 274)    return { juce::KeyPress::downKey,               ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 275)    return { juce::KeyPress::rightKey,              ModifierKeys::currentModifiers, {} };\r
-        if (keyCode == 276)    return { juce::KeyPress::leftKey,               ModifierKeys::currentModifiers, {} };\r
-\r
-        return {};\r
-    }\r
-\r
-    //==============================================================================\r
-    Rectangle<int> bounds;\r
-    MouseWatcher mouseWatcher;\r
-\r
-    uint8* pixelData = nullptr;\r
-    int textureWidth, textureHeight;\r
-    Image renderImage;\r
-\r
-    //==============================================================================\r
-    void setMinimised (bool) override                                 {}\r
-    bool isMinimised() const override                                 { return false; }\r
-    void setFullScreen (bool) override                                {}\r
-    bool isFullScreen() const override                                { return false; }\r
-    bool setAlwaysOnTop (bool) override                               { return false; }\r
-    void toFront (bool) override                                      {}\r
-    void toBehind (ComponentPeer*) override                           {}\r
-    bool isFocused() const override                                   { return true; }\r
-    void grabFocus() override                                         {}\r
-    void* getNativeHandle() const override                            { return nullptr; }\r
-    BorderSize<int> getFrameSize() const override                     { return {}; }\r
-    void setVisible (bool) override                                   {}\r
-    void setTitle (const String&) override                            {}\r
-    void setIcon (const Image&) override                              {}\r
-    void textInputRequired (Point<int>, TextInputTarget&) override    {}\r
-    void setAlpha (float) override                                    {}\r
-    void performAnyPendingRepaintsNow() override                      {}\r
-    void repaint (const Rectangle<int>&) override                     {}\r
-\r
-    //==============================================================================\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnityPeer)\r
-};\r
-\r
-ComponentPeer* createUnityPeer (Component& c)    { return new UnityPeer (c); }\r
-\r
-//==============================================================================\r
-class AudioProcessorUnityWrapper\r
-{\r
-public:\r
-    AudioProcessorUnityWrapper (bool isTemporary)\r
-    {\r
-        pluginInstance.reset (createPluginFilterOfType (AudioProcessor::wrapperType_Unity));\r
-\r
-        if (! isTemporary && pluginInstance->hasEditor())\r
-        {\r
-            pluginInstanceEditor.reset (pluginInstance->createEditorIfNeeded());\r
-            pluginInstanceEditor->setVisible (true);\r
-            pluginInstanceEditor->addToDesktop (0);\r
-        }\r
-\r
-        juceParameters.update (*pluginInstance, false);\r
-    }\r
-\r
-    ~AudioProcessorUnityWrapper()\r
-    {\r
-        if (pluginInstanceEditor != nullptr)\r
-        {\r
-            pluginInstanceEditor->removeFromDesktop();\r
-\r
-            PopupMenu::dismissAllActiveMenus();\r
-            pluginInstanceEditor->processor.editorBeingDeleted (pluginInstanceEditor.get());\r
-            pluginInstanceEditor = nullptr;\r
-        }\r
-    }\r
-\r
-    void create (UnityAudioEffectState* state)\r
-    {\r
-        // only supported in Unity plugin API > 1.0\r
-        if (state->structSize >= sizeof (UnityAudioEffectState))\r
-            samplesPerBlock = static_cast<int> (state->dspBufferSize);\r
-\r
-       #ifdef JucePlugin_PreferredChannelConfigurations\r
-        short configs[][2] = { JucePlugin_PreferredChannelConfigurations };\r
-        const int numConfigs = sizeof (configs) / sizeof (short[2]);\r
-\r
-        jassert (numConfigs > 0 && (configs[0][0] > 0 || configs[0][1] > 0));\r
-\r
-        pluginInstance->setPlayConfigDetails (configs[0][0], configs[0][1], state->sampleRate, samplesPerBlock);\r
-       #else\r
-        pluginInstance->setRateAndBufferSizeDetails (state->sampleRate, samplesPerBlock);\r
-       #endif\r
-\r
-        pluginInstance->prepareToPlay (state->sampleRate, samplesPerBlock);\r
-\r
-        scratchBuffer.setSize (jmax (pluginInstance->getTotalNumInputChannels(), pluginInstance->getTotalNumOutputChannels()), samplesPerBlock);\r
-    }\r
-\r
-    void release()\r
-    {\r
-        pluginInstance->releaseResources();\r
-    }\r
-\r
-    void reset()\r
-    {\r
-        pluginInstance->reset();\r
-    }\r
-\r
-    void process (float* inBuffer, float* outBuffer, int bufferSize, int numInChannels, int numOutChannels, bool isBypassed)\r
-    {\r
-        for (int pos = 0; pos < bufferSize;)\r
-        {\r
-            auto max = jmin (bufferSize - pos, samplesPerBlock);\r
-            processBuffers (inBuffer + (pos * numInChannels), outBuffer + (pos * numOutChannels), max, numInChannels, numOutChannels, isBypassed);\r
-\r
-            pos += max;\r
-        }\r
-    }\r
-\r
-    void declareParameters (UnityAudioEffectDefinition& definition)\r
-    {\r
-        static std::unique_ptr<UnityAudioParameterDefinition> parametersPtr;\r
-        static int numParams = 0;\r
-\r
-        if (parametersPtr == nullptr)\r
-        {\r
-            numParams = juceParameters.params.size();\r
-\r
-            parametersPtr.reset (static_cast<UnityAudioParameterDefinition*> (std::calloc (static_cast<size_t> (numParams),\r
-                                                                              sizeof (UnityAudioParameterDefinition))));\r
-\r
-            parameterDescriptions.clear();\r
-\r
-            for (int i = 0; i < numParams; ++i)\r
-            {\r
-                auto* parameter = juceParameters.params[i];\r
-                auto& paramDef = parametersPtr.get()[i];\r
-\r
-                strncpy (paramDef.name, parameter->getName (15).toRawUTF8(), 15);\r
-\r
-                if (parameter->getLabel().isNotEmpty())\r
-                    strncpy (paramDef.unit, parameter->getLabel().toRawUTF8(), 15);\r
-\r
-                parameterDescriptions.add (parameter->getName (15));\r
-                paramDef.description = parameterDescriptions[i].toRawUTF8();\r
-\r
-                paramDef.defaultVal = parameter->getDefaultValue();\r
-                paramDef.min = 0.0f;\r
-                paramDef.max = 1.0f;\r
-                paramDef.displayScale = 1.0f;\r
-                paramDef.displayExponent = 1.0f;\r
-            }\r
-        }\r
-\r
-        definition.numParameters = static_cast<uint32> (numParams);\r
-        definition.parameterDefintions = parametersPtr.get();\r
-    }\r
-\r
-    void setParameter (int index, float value)       { juceParameters.getParamForIndex (index)->setValueNotifyingHost (value); }\r
-    float getParameter (int index) const noexcept    { return juceParameters.getParamForIndex (index)->getValue(); }\r
-\r
-    String getParameterString (int index) const noexcept\r
-    {\r
-        auto* param = juceParameters.getParamForIndex (index);\r
-        return param->getText (param->getValue(), 16);\r
-    }\r
-\r
-    int getNumInputChannels() const noexcept         { return pluginInstance->getTotalNumInputChannels(); }\r
-    int getNumOutputChannels() const noexcept        { return pluginInstance->getTotalNumOutputChannels(); }\r
-\r
-    bool hasEditor() const noexcept                  { return pluginInstance->hasEditor(); }\r
-\r
-    UnityPeer& getEditorPeer() const\r
-    {\r
-        auto* peer = dynamic_cast<UnityPeer*> (pluginInstanceEditor->getPeer());\r
-\r
-        jassert (peer != nullptr);\r
-        return *peer;\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    void processBuffers (float* inBuffer, float* outBuffer, int bufferSize, int numInChannels, int numOutChannels, bool isBypassed)\r
-    {\r
-        int ch;\r
-        for (ch = 0; ch < numInChannels; ++ch)\r
-        {\r
-            using DstSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::NonConst>;\r
-            using SrcSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::Interleaved,    AudioData::Const>;\r
-\r
-            DstSampleType dstData (scratchBuffer.getWritePointer (ch));\r
-            SrcSampleType srcData (inBuffer + ch, numInChannels);\r
-            dstData.convertSamples (srcData, bufferSize);\r
-        }\r
-\r
-        for (; ch < numOutChannels; ++ch)\r
-            scratchBuffer.clear (ch, 0, bufferSize);\r
-\r
-        {\r
-            const ScopedLock sl (pluginInstance->getCallbackLock());\r
-\r
-            if (pluginInstance->isSuspended())\r
-            {\r
-                scratchBuffer.clear();\r
-            }\r
-            else\r
-            {\r
-                MidiBuffer mb;\r
-\r
-                if (isBypassed)\r
-                    pluginInstance->processBlockBypassed (scratchBuffer, mb);\r
-                else\r
-                    pluginInstance->processBlock (scratchBuffer, mb);\r
-            }\r
-        }\r
-\r
-        for (ch = 0; ch < numOutChannels; ++ch)\r
-        {\r
-            using DstSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::Interleaved,    AudioData::NonConst>;\r
-            using SrcSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const>;\r
-\r
-            DstSampleType dstData (outBuffer + ch, numOutChannels);\r
-            SrcSampleType srcData (scratchBuffer.getReadPointer (ch));\r
-            dstData.convertSamples (srcData, bufferSize);\r
-        }\r
-    }\r
-\r
-    //==============================================================================\r
-    std::unique_ptr<AudioProcessor> pluginInstance;\r
-    std::unique_ptr<AudioProcessorEditor> pluginInstanceEditor;\r
-\r
-    int samplesPerBlock = 1024;\r
-    StringArray parameterDescriptions;\r
-\r
-    AudioBuffer<float> scratchBuffer;\r
-\r
-    LegacyAudioParametersWrapper juceParameters;\r
-\r
-    //==============================================================================\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorUnityWrapper)\r
-};\r
-\r
-//==============================================================================\r
-HashMap<int, AudioProcessorUnityWrapper*>& getWrapperMap()\r
-{\r
-    static HashMap<int, AudioProcessorUnityWrapper*> wrapperMap;\r
-    return wrapperMap;\r
-}\r
-\r
-static void onWrapperCreation (AudioProcessorUnityWrapper* wrapperToAdd)\r
-{\r
-    getWrapperMap().set (std::abs (Random::getSystemRandom().nextInt (65536)), wrapperToAdd);\r
-}\r
-\r
-static void onWrapperDeletion (AudioProcessorUnityWrapper* wrapperToRemove)\r
-{\r
-    getWrapperMap().removeValue (wrapperToRemove);\r
-}\r
-\r
-//==============================================================================\r
-namespace UnityCallbacks\r
-{\r
-    int UNITY_INTERFACE_API createCallback (UnityAudioEffectState* state)\r
-    {\r
-        auto* pluginInstance = new AudioProcessorUnityWrapper (false);\r
-        pluginInstance->create (state);\r
-\r
-        state->effectData = pluginInstance;\r
-\r
-        onWrapperCreation (pluginInstance);\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API releaseCallback (UnityAudioEffectState* state)\r
-    {\r
-        auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-        pluginInstance->release();\r
-\r
-        onWrapperDeletion (pluginInstance);\r
-        delete pluginInstance;\r
-\r
-        if (getWrapperMap().size() == 0)\r
-            shutdownJuce_GUI();\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API resetCallback (UnityAudioEffectState* state)\r
-    {\r
-        auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-        pluginInstance->reset();\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API setPositionCallback (UnityAudioEffectState* state, unsigned int pos)\r
-    {\r
-        ignoreUnused (state, pos);\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API setFloatParameterCallback (UnityAudioEffectState* state, int index, float value)\r
-    {\r
-        auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-        pluginInstance->setParameter (index, value);\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API getFloatParameterCallback (UnityAudioEffectState* state, int index, float* value, char* valueStr)\r
-    {\r
-        auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-        *value = pluginInstance->getParameter (index);\r
-\r
-        strncpy (valueStr, pluginInstance->getParameterString (index).toRawUTF8(), 15);\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API getFloatBufferCallback (UnityAudioEffectState* state, const char* name, float* buffer, int numSamples)\r
-    {\r
-        ignoreUnused (numSamples);\r
-\r
-        auto nameStr = String (name);\r
-\r
-        if (nameStr == "Editor")\r
-        {\r
-            auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
-            buffer[0] = pluginInstance->hasEditor() ? 1.0f : 0.0f;\r
-        }\r
-        else if (nameStr == "ID")\r
-        {\r
-            auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
-            for (HashMap<int, AudioProcessorUnityWrapper*>::Iterator i (getWrapperMap()); i.next();)\r
-            {\r
-                if (i.getValue() == pluginInstance)\r
-                {\r
-                    buffer[0] = (float) i.getKey();\r
-                    break;\r
-                }\r
-            }\r
-\r
-            return 0;\r
-        }\r
-        else if (nameStr == "Size")\r
-        {\r
-            auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
-            auto& editor = pluginInstance->getEditorPeer().getEditor();\r
-\r
-            buffer[0] = (float) editor.getBounds().getWidth();\r
-            buffer[1] = (float) editor.getBounds().getHeight();\r
-            buffer[2] = (float) editor.getConstrainer()->getMinimumWidth();\r
-            buffer[3] = (float) editor.getConstrainer()->getMinimumHeight();\r
-            buffer[4] = (float) editor.getConstrainer()->getMaximumWidth();\r
-            buffer[5] = (float) editor.getConstrainer()->getMaximumHeight();\r
-        }\r
-\r
-        return 0;\r
-    }\r
-\r
-    int UNITY_INTERFACE_API processCallback (UnityAudioEffectState* state, float* inBuffer, float* outBuffer,\r
-                                             unsigned int bufferSize, int numInChannels, int numOutChannels)\r
-    {\r
-        auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
-        if (pluginInstance != nullptr)\r
-        {\r
-            auto isPlaying = ((state->flags & stateIsPlaying) != 0);\r
-            auto isMuted   = ((state->flags & stateIsMuted)   != 0);\r
-            auto isPaused  = ((state->flags & stateIsPaused)  != 0);\r
-\r
-            auto bypassed = ! isPlaying || (isMuted || isPaused);\r
-\r
-            pluginInstance->process (inBuffer, outBuffer, static_cast<int> (bufferSize), numInChannels, numOutChannels, bypassed);\r
-        }\r
-        else\r
-        {\r
-            FloatVectorOperations::clear (outBuffer, static_cast<int> (bufferSize) * numOutChannels);\r
-        }\r
-\r
-        return 0;\r
-    }\r
-}\r
-\r
-//==============================================================================\r
-static void declareEffect (UnityAudioEffectDefinition& definition)\r
-{\r
-    memset (&definition, 0, sizeof (definition));\r
-\r
-    std::unique_ptr<AudioProcessorUnityWrapper> wrapper = std::make_unique<AudioProcessorUnityWrapper> (true);\r
-\r
-    String name (JucePlugin_Name);\r
-    if (! name.startsWithIgnoreCase ("audioplugin"))\r
-        name = "audioplugin_" + name;\r
-\r
-    strcpy (definition.name, name.toRawUTF8());\r
-\r
-    definition.structSize = sizeof (UnityAudioEffectDefinition);\r
-    definition.parameterStructSize = sizeof (UnityAudioParameterDefinition);\r
-\r
-    definition.apiVersion = UNITY_AUDIO_PLUGIN_API_VERSION;\r
-    definition.pluginVersion = JucePlugin_VersionCode;\r
-\r
-    // effects must set this to 0, generators > 0\r
-    definition.channels = (wrapper->getNumInputChannels() != 0 ? 0\r
-                                                               : static_cast<uint32> (wrapper->getNumOutputChannels()));\r
-\r
-    wrapper->declareParameters (definition);\r
-\r
-    definition.create            = UnityCallbacks::createCallback;\r
-    definition.release           = UnityCallbacks::releaseCallback;\r
-    definition.reset             = UnityCallbacks::resetCallback;\r
-    definition.setPosition       = UnityCallbacks::setPositionCallback;\r
-    definition.process           = UnityCallbacks::processCallback;\r
-    definition.setFloatParameter = UnityCallbacks::setFloatParameterCallback;\r
-    definition.getFloatParameter = UnityCallbacks::getFloatParameterCallback;\r
-    definition.getFloatBuffer    = UnityCallbacks::getFloatBufferCallback;\r
-}\r
-\r
-} // namespace juce\r
-\r
-UNITY_INTERFACE_EXPORT int UnityGetAudioEffectDefinitions (UnityAudioEffectDefinition*** definitionsPtr)\r
-{\r
-    if (juce::getWrapperMap().size() == 0)\r
-        juce::initialiseJuce_GUI();\r
-\r
-    static bool hasInitialised = false;\r
-\r
-    if (! hasInitialised)\r
-    {\r
-        juce::PluginHostType::jucePlugInClientCurrentWrapperType = juce::AudioProcessor::wrapperType_Unity;\r
-        juce::juce_createUnityPeerFn = juce::createUnityPeer;\r
-\r
-        hasInitialised = true;\r
-    }\r
-\r
-    auto* definition = new UnityAudioEffectDefinition();\r
-    juce::declareEffect (*definition);\r
-\r
-    *definitionsPtr = &definition;\r
-\r
-    return 1;\r
-}\r
-\r
-//==============================================================================\r
-static juce::ModifierKeys unityModifiersToJUCE (UnityEventModifiers mods, bool mouseDown, int mouseButton = -1)\r
-{\r
-    int flags = 0;\r
-\r
-    if (mouseDown)\r
-    {\r
-        if (mouseButton == 0)\r
-            flags |= juce::ModifierKeys::leftButtonModifier;\r
-        else if (mouseButton == 1)\r
-            flags |= juce::ModifierKeys::rightButtonModifier;\r
-        else if (mouseButton == 2)\r
-            flags |= juce::ModifierKeys::middleButtonModifier;\r
-    }\r
-\r
-    if (mods == 0)\r
-        return flags;\r
-\r
-    if ((mods & UnityEventModifiers::shift) != 0)        flags |= juce::ModifierKeys::shiftModifier;\r
-    if ((mods & UnityEventModifiers::control) != 0)      flags |= juce::ModifierKeys::ctrlModifier;\r
-    if ((mods & UnityEventModifiers::alt) != 0)          flags |= juce::ModifierKeys::altModifier;\r
-    if ((mods & UnityEventModifiers::command) != 0)      flags |= juce::ModifierKeys::commandModifier;\r
-\r
-    return { flags };\r
-}\r
-\r
-//==============================================================================\r
-static juce::AudioProcessorUnityWrapper* getWrapperChecked (int id)\r
-{\r
-    auto* wrapper = juce::getWrapperMap()[id];\r
-    jassert (wrapper != nullptr);\r
-\r
-    return wrapper;\r
-}\r
-\r
-//==============================================================================\r
-static void UNITY_INTERFACE_API onRenderEvent (int id)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().triggerAsyncUpdate();\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT renderCallback UNITY_INTERFACE_API getRenderCallback()\r
-{\r
-    return onRenderEvent;\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void unityInitialiseTexture (int id, void* data, int w, int h)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().setPixelDataHandle (reinterpret_cast<juce::uint8*> (data), w, h);\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDown (int id, float x, float y, UnityEventModifiers unityMods, int button)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().forwardMouseEvent ({ x, y }, unityModifiersToJUCE (unityMods, true, button));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDrag (int id, float x, float y, UnityEventModifiers unityMods, int button)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().forwardMouseEvent ({ x, y }, unityModifiersToJUCE (unityMods, true, button));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseUp (int id, float x, float y, UnityEventModifiers unityMods)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().forwardMouseEvent ({ x, y }, unityModifiersToJUCE (unityMods, false));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityKeyEvent (int id, int code, UnityEventModifiers mods, const char* name)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().forwardKeyPress (code, name, unityModifiersToJUCE (mods, false));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unitySetScreenBounds (int id, float x, float y, float w, float h)\r
-{\r
-    getWrapperChecked (id)->getEditorPeer().getEditor().setBounds ({ (int) x, (int) y, (int) w, (int) h });\r
-}\r
-\r
-//==============================================================================\r
-#if JUCE_WINDOWS\r
- extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID)\r
- {\r
-     if (reason == DLL_PROCESS_ATTACH)\r
-         juce::Process::setCurrentModuleInstanceHandle (instance);\r
-\r
-     return true;\r
- }\r
-#endif\r
-\r
-#endif\r
index 6ba0056360b271c30003e27db85e5b6c1c0a6e3e..a39f8977d4549ea6d6ced661cef4e685dd0d48ee 100644 (file)
@@ -27,7 +27,7 @@
 namespace juce\r
 {\r
 \r
-/** An interface to allow an AudioProcessor to send and receive VST specific calls from\r
+/** An interface to allow an AudioProcessor to receive VST specific calls from\r
     the host.\r
 \r
     @tags{Audio}\r
@@ -55,22 +55,6 @@ struct VSTCallbackHandler
                                                              pointer_sized_int value,\r
                                                              void* ptr,\r
                                                              float opt) = 0;\r
-\r
-    // Note: VS2013 prevents a "using" declaration here\r
-    /** The host callback function type. */\r
-    typedef pointer_sized_int (VstHostCallbackType) (int32 opcode,\r
-                                                     int32 index,\r
-                                                     pointer_sized_int value,\r
-                                                     void* ptr,\r
-                                                     float opt);\r
-\r
-    /** This is called once by the VST plug-in wrapper after its constructor.\r
-        You can use the supplied function to query the VST host.\r
-    */\r
-    virtual void handleVstHostCallbackAvailable (std::function<VstHostCallbackType>&& callback)\r
-    {\r
-        ignoreUnused (callback);\r
-    }\r
 };\r
 \r
 } // namespace juce\r
index cb852e8f6f3ebecfc5db85871b27d8f2d91ca365..216265ea4d15ffeb879d52e6efcd2eafe3c5502c 100644 (file)
 #endif\r
 \r
 #include "../utility/juce_IncludeSystemHeaders.h"\r
-#include <juce_core/juce_core.h>\r
-\r
-#if JucePlugin_VersionCode < 0x010000   // Major < 0\r
-\r
- #if (JucePlugin_VersionCode & 0x00FF00) > (9 * 0x100) // check if Minor number exceeeds 9\r
-  JUCE_COMPILER_WARNING ("When version has 'major' = 0, VST2 has trouble displaying 'minor' exceeding 9")\r
- #endif\r
-\r
- #if (JucePlugin_VersionCode & 0xFF) > 9   // check if Bugfix number exceeeds 9\r
-  JUCE_COMPILER_WARNING ("When version has 'major' = 0, VST2 has trouble displaying 'bugfix' exceeding 9")\r
- #endif\r
-\r
-#elif JucePlugin_VersionCode >= 0x650000   // Major >= 101\r
-\r
- #if (JucePlugin_VersionCode & 0x00FF00) > (99 * 0x100) // check if Minor number exceeeds 99\r
-  JUCE_COMPILER_WARNING ("When version has 'major' > 100, VST2 has trouble displaying 'minor' exceeding 99")\r
- #endif\r
-\r
- #if (JucePlugin_VersionCode & 0xFF) > 99  // check if Bugfix number exceeeds 99\r
-  JUCE_COMPILER_WARNING ("When version has 'major' > 100, VST2 has trouble displaying 'bugfix' exceeding 99")\r
- #endif\r
-\r
-#endif\r
 \r
 #ifdef PRAGMA_ALIGN_SUPPORTED\r
  #undef PRAGMA_ALIGN_SUPPORTED\r
  #pragma warning (disable : 4458)\r
 #endif\r
 \r
-#define VST_FORCE_DEPRECATED 0\r
-\r
-namespace Vst2\r
-{\r
-// If the following files cannot be found then you are probably trying to build\r
-// a VST2 plug-in or a VST2-compatible VST3 plug-in. To do this you must have a\r
-// VST2 SDK in your header search paths or use the "VST (Legacy) SDK Folder"\r
-// field in the Projucer. The VST2 SDK can be obtained from the\r
-// vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. You\r
-// also need a VST2 license from Steinberg to distribute VST2 plug-ins.\r
-#include "pluginterfaces/vst2.x/aeffect.h"\r
-#include "pluginterfaces/vst2.x/aeffectx.h"\r
-}\r
-\r
-using namespace juce;\r
+#include <juce_core/juce_core.h>\r
+#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"\r
 \r
 #ifdef _MSC_VER\r
  #pragma warning (pop)\r
@@ -111,8 +75,6 @@ using namespace juce;
  #pragma pack (push, 8)\r
 #endif\r
 \r
-#define JUCE_VSTINTERFACE_H_INCLUDED 1\r
-\r
 #include "../utility/juce_IncludeModuleHeaders.h"\r
 #include "../utility/juce_FakeMouseMoveGenerator.h"\r
 #include "../utility/juce_WindowsHooks.h"\r
@@ -120,12 +82,6 @@ using namespace juce;
 #include "../../juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp"\r
 #include "../../juce_audio_processors/format_types/juce_VSTCommon.h"\r
 \r
-#if JUCE_BIG_ENDIAN\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24))\r
-#else\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24))\r
-#endif\r
-\r
 #ifdef _MSC_VER\r
  #pragma pack (pop)\r
 #endif\r
@@ -302,7 +258,7 @@ private:
 \r
 public:\r
     //==============================================================================\r
-    JuceVSTWrapper (Vst2::audioMasterCallback cb, AudioProcessor* af)\r
+    JuceVSTWrapper (VstHostCallback cb, AudioProcessor* af)\r
        : hostCallback (cb),\r
          processor (af)\r
     {\r
@@ -333,43 +289,40 @@ public:
         juceParameters.update (*processor, false);\r
 \r
         memset (&vstEffect, 0, sizeof (vstEffect));\r
-        vstEffect.magic = 0x56737450 /* 'VstP' */;\r
-        vstEffect.dispatcher = (Vst2::AEffectDispatcherProc) dispatcherCB;\r
-        vstEffect.process = nullptr;\r
-        vstEffect.setParameter = (Vst2::AEffectSetParameterProc) setParameterCB;\r
-        vstEffect.getParameter = (Vst2::AEffectGetParameterProc) getParameterCB;\r
+        vstEffect.interfaceIdentifier = juceVstInterfaceIdentifier;\r
+        vstEffect.dispatchFunction = dispatcherCB;\r
+        vstEffect.processAudioFunction = nullptr;\r
+        vstEffect.setParameterValueFunction = setParameterCB;\r
+        vstEffect.getParameterValueFunction = getParameterCB;\r
         vstEffect.numPrograms = jmax (1, af->getNumPrograms());\r
-        vstEffect.numParams = juceParameters.getNumParameters();\r
-        vstEffect.numInputs = maxNumInChannels;\r
-        vstEffect.numOutputs = maxNumOutChannels;\r
-        vstEffect.initialDelay = processor->getLatencySamples();\r
-        vstEffect.object = this;\r
-        vstEffect.uniqueID = JucePlugin_VSTUniqueID;\r
+        vstEffect.numParameters = juceParameters.getNumParameters();\r
+        vstEffect.numInputChannels = maxNumInChannels;\r
+        vstEffect.numOutputChannels = maxNumOutChannels;\r
+        vstEffect.latency = processor->getLatencySamples();\r
+        vstEffect.effectPointer = this;\r
+        vstEffect.plugInIdentifier = JucePlugin_VSTUniqueID;\r
 \r
        #ifdef JucePlugin_VSTChunkStructureVersion\r
-        vstEffect.version = JucePlugin_VSTChunkStructureVersion;\r
+        vstEffect.plugInVersion = JucePlugin_VSTChunkStructureVersion;\r
        #else\r
-        vstEffect.version = JucePlugin_VersionCode;\r
+        vstEffect.plugInVersion = JucePlugin_VersionCode;\r
        #endif\r
 \r
-        vstEffect.processReplacing = (Vst2::AEffectProcessProc) processReplacingCB;\r
-        vstEffect.processDoubleReplacing = (Vst2::AEffectProcessDoubleProc) processDoubleReplacingCB;\r
+        vstEffect.processAudioInplaceFunction = processReplacingCB;\r
+        vstEffect.processDoubleAudioInplaceFunction = processDoubleReplacingCB;\r
 \r
-        vstEffect.flags |= Vst2::effFlagsHasEditor;\r
+        vstEffect.flags |= vstEffectFlagHasEditor;\r
 \r
-        vstEffect.flags |= Vst2::effFlagsCanReplacing;\r
+        vstEffect.flags |= vstEffectFlagInplaceAudio;\r
         if (processor->supportsDoublePrecisionProcessing())\r
-            vstEffect.flags |= Vst2::effFlagsCanDoubleReplacing;\r
-\r
-        vstEffect.flags |= Vst2::effFlagsProgramChunks;\r
+            vstEffect.flags |= vstEffectFlagInplaceDoubleAudio;\r
 \r
        #if JucePlugin_IsSynth\r
-        vstEffect.flags |= Vst2::effFlagsIsSynth;\r
-       #else\r
-        if (processor->getTailLengthSeconds() == 0.0)\r
-            vstEffect.flags |= Vst2::effFlagsNoSoundInStop;\r
+        vstEffect.flags |= vstEffectFlagIsSynth;\r
        #endif\r
 \r
+        vstEffect.flags |= vstEffectFlagDataInChunks;\r
+\r
         activePlugins.add (this);\r
     }\r
 \r
@@ -411,7 +364,7 @@ public:
         }\r
     }\r
 \r
-    Vst2::AEffect* getAEffect() noexcept    { return &vstEffect; }\r
+    VstEffectInterface* getVstEffectInterface() noexcept    { return &vstEffect; }\r
 \r
     template <typename FloatType>\r
     void internalProcessReplacing (FloatType** inputs, FloatType** outputs,\r
@@ -550,7 +503,7 @@ public:
 \r
             // Send VST events to the host.\r
             if (hostCallback != nullptr)\r
-                hostCallback (&vstEffect, Vst2::audioMasterProcessEvents, 0, 0, outgoingEvents.events, 0);\r
+                hostCallback (&vstEffect, hostOpcodePreAudioProcessingEvents, 0, 0, outgoingEvents.events, 0);\r
            #elif JUCE_DEBUG\r
             /*  This assertion is caused when you've added some events to the\r
                 midiMessages array in your processBlock() method, which usually means\r
@@ -579,7 +532,7 @@ public:
         internalProcessReplacing (inputs, outputs, sampleFrames, floatTempBuffers);\r
     }\r
 \r
-    static void processReplacingCB (Vst2::AEffect* vstInterface, float** inputs, float** outputs, int32 sampleFrames)\r
+    static void processReplacingCB (VstEffectInterface* vstInterface, float** inputs, float** outputs, int32 sampleFrames)\r
     {\r
         getWrapper (vstInterface)->processReplacing (inputs, outputs, sampleFrames);\r
     }\r
@@ -590,7 +543,7 @@ public:
         internalProcessReplacing (inputs, outputs, sampleFrames, doubleTempBuffers);\r
     }\r
 \r
-    static void processDoubleReplacingCB (Vst2::AEffect* vstInterface, double** inputs, double** outputs, int32 sampleFrames)\r
+    static void processDoubleReplacingCB (VstEffectInterface* vstInterface, double** inputs, double** outputs, int32 sampleFrames)\r
     {\r
         getWrapper (vstInterface)->processDoubleReplacing (inputs, outputs, sampleFrames);\r
     }\r
@@ -602,7 +555,7 @@ public:
         {\r
             isProcessing = true;\r
 \r
-            auto numInAndOutChannels = static_cast<size_t> (vstEffect.numInputs + vstEffect.numOutputs);\r
+            auto numInAndOutChannels = static_cast<size_t> (vstEffect.numInputChannels + vstEffect.numOutputChannels);\r
             floatTempBuffers .channels.calloc (numInAndOutChannels);\r
             doubleTempBuffers.channels.calloc (numInAndOutChannels);\r
 \r
@@ -621,21 +574,21 @@ public:
             midiEvents.ensureSize (2048);\r
             midiEvents.clear();\r
 \r
-            vstEffect.initialDelay = processor->getLatencySamples();\r
+            vstEffect.latency = processor->getLatencySamples();\r
 \r
             /** If this plug-in is a synth or it can receive midi events we need to tell the\r
                 host that we want midi. In the SDK this method is marked as deprecated, but\r
                 some hosts rely on this behaviour.\r
             */\r
-            if (vstEffect.flags & Vst2::effFlagsIsSynth || JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect)\r
+            if (vstEffect.flags & vstEffectFlagIsSynth || JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect)\r
             {\r
                 if (hostCallback != nullptr)\r
-                    hostCallback (&vstEffect, Vst2::audioMasterWantMidi, 0, 1, 0, 0);\r
+                    hostCallback (&vstEffect, hostOpcodePlugInWantsMidi, 0, 1, 0, 0);\r
             }\r
 \r
             if (getHostType().isAbletonLive()\r
                  && hostCallback != nullptr\r
-                 && processor->getTailLengthSeconds() == std::numeric_limits<double>::infinity())\r
+                 && processor->getTailLengthSeconds() == std::numeric_limits<double>::max())\r
             {\r
                 AbletonLiveHostSpecific hostCmd;\r
 \r
@@ -644,7 +597,7 @@ public:
                 hostCmd.commandSize = sizeof (int);\r
                 hostCmd.flags = AbletonLiveHostSpecific::KCantBeSuspended;\r
 \r
-                hostCallback (&vstEffect, Vst2::audioMasterVendorSpecific, 0, 0, &hostCmd, 0.0f);\r
+                hostCallback (&vstEffect, hostOpcodeManufacturerSpecific, 0, 0, &hostCmd, 0.0f);\r
             }\r
 \r
            #if JucePlugin_ProducesMidiOutput || JucePlugin_IsMidiEffect\r
@@ -671,28 +624,28 @@ public:
     //==============================================================================\r
     bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override\r
     {\r
-        const Vst2::VstTimeInfo* ti = nullptr;\r
+        const VstTimingInformation* ti = nullptr;\r
 \r
         if (hostCallback != nullptr)\r
         {\r
-            int32 flags = Vst2::kVstPpqPosValid  | Vst2::kVstTempoValid\r
-                        | Vst2::kVstBarsValid    | Vst2::kVstCyclePosValid\r
-                        | Vst2::kVstTimeSigValid | Vst2::kVstSmpteValid\r
-                        | Vst2::kVstClockValid;\r
+            int32 flags = vstTimingInfoFlagMusicalPositionValid | vstTimingInfoFlagTempoValid\r
+                              | vstTimingInfoFlagLastBarPositionValid | vstTimingInfoFlagLoopPositionValid\r
+                              | vstTimingInfoFlagTimeSignatureValid | vstTimingInfoFlagSmpteValid\r
+                              | vstTimingInfoFlagNearestClockValid;\r
 \r
-            auto result = hostCallback (&vstEffect, Vst2::audioMasterGetTime, 0, flags, 0, 0);\r
-            ti = reinterpret_cast<Vst2::VstTimeInfo*> (result);\r
+            auto result = hostCallback (&vstEffect, hostOpcodeGetTimingInfo, 0, flags, 0, 0);\r
+            ti = reinterpret_cast<VstTimingInformation*> (result);\r
         }\r
 \r
         if (ti == nullptr || ti->sampleRate <= 0)\r
             return false;\r
 \r
-        info.bpm = (ti->flags & Vst2::kVstTempoValid) != 0 ? ti->tempo : 0.0;\r
+        info.bpm = (ti->flags & vstTimingInfoFlagTempoValid) != 0 ? ti->tempoBPM : 0.0;\r
 \r
-        if ((ti->flags & Vst2::kVstTimeSigValid) != 0)\r
+        if ((ti->flags & vstTimingInfoFlagTimeSignatureValid) != 0)\r
         {\r
-            info.timeSigNumerator   = ti->timeSigNumerator;\r
-            info.timeSigDenominator = ti->timeSigDenominator;\r
+            info.timeSigNumerator   = ti->timeSignatureNumerator;\r
+            info.timeSigDenominator = ti->timeSignatureDenominator;\r
         }\r
         else\r
         {\r
@@ -700,34 +653,34 @@ public:
             info.timeSigDenominator = 4;\r
         }\r
 \r
-        info.timeInSamples = (int64) (ti->samplePos + 0.5);\r
-        info.timeInSeconds = ti->samplePos / ti->sampleRate;\r
-        info.ppqPosition = (ti->flags & Vst2::kVstPpqPosValid) != 0 ? ti->ppqPos : 0.0;\r
-        info.ppqPositionOfLastBarStart = (ti->flags & Vst2::kVstBarsValid) != 0 ? ti->barStartPos : 0.0;\r
+        info.timeInSamples = (int64) (ti->samplePosition + 0.5);\r
+        info.timeInSeconds = ti->samplePosition / ti->sampleRate;\r
+        info.ppqPosition = (ti->flags & vstTimingInfoFlagMusicalPositionValid) != 0 ? ti->musicalPosition : 0.0;\r
+        info.ppqPositionOfLastBarStart = (ti->flags & vstTimingInfoFlagLastBarPositionValid) != 0 ? ti->lastBarPosition : 0.0;\r
 \r
-        if ((ti->flags & Vst2::kVstSmpteValid) != 0)\r
+        if ((ti->flags & vstTimingInfoFlagSmpteValid) != 0)\r
         {\r
             AudioPlayHead::FrameRateType rate = AudioPlayHead::fpsUnknown;\r
             double fps = 1.0;\r
 \r
-            switch (ti->smpteFrameRate)\r
+            switch (ti->smpteRate)\r
             {\r
-                case Vst2::kVstSmpte239fps:       rate = AudioPlayHead::fps23976;    fps = 24.0 * 1000.0 / 1001.0; break;\r
-                case Vst2::kVstSmpte24fps:        rate = AudioPlayHead::fps24;       fps = 24.0;  break;\r
-                case Vst2::kVstSmpte25fps:        rate = AudioPlayHead::fps25;       fps = 25.0;  break;\r
-                case Vst2::kVstSmpte2997fps:      rate = AudioPlayHead::fps2997;     fps = 30.0 * 1000.0 / 1001.0; break;\r
-                case Vst2::kVstSmpte30fps:        rate = AudioPlayHead::fps30;       fps = 30.0;  break;\r
-                case Vst2::kVstSmpte2997dfps:     rate = AudioPlayHead::fps2997drop; fps = 30.0 * 1000.0 / 1001.0; break;\r
-                case Vst2::kVstSmpte30dfps:       rate = AudioPlayHead::fps30drop;   fps = 30.0;  break;\r
-\r
-                case Vst2::kVstSmpteFilm16mm:\r
-                case Vst2::kVstSmpteFilm35mm:     fps = 24.0; break;\r
-\r
-                case Vst2::kVstSmpte249fps:       fps = 25.0 * 1000.0 / 1001.0; break;\r
-                case Vst2::kVstSmpte599fps:       fps = 60.0 * 1000.0 / 1001.0; break;\r
-                case Vst2::kVstSmpte60fps:        fps = 60; break;\r
-\r
-                default:                          jassertfalse; // unknown frame-rate..\r
+                case vstSmpteRateFps239:       rate = AudioPlayHead::fps23976;    fps = 24.0 * 1000.0 / 1001.0; break;\r
+                case vstSmpteRateFps24:        rate = AudioPlayHead::fps24;       fps = 24.0;  break;\r
+                case vstSmpteRateFps25:        rate = AudioPlayHead::fps25;       fps = 25.0;  break;\r
+                case vstSmpteRateFps2997:      rate = AudioPlayHead::fps2997;     fps = 30.0 * 1000.0 / 1001.0; break;\r
+                case vstSmpteRateFps30:        rate = AudioPlayHead::fps30;       fps = 30.0;  break;\r
+                case vstSmpteRateFps2997drop:  rate = AudioPlayHead::fps2997drop; fps = 30.0 * 1000.0 / 1001.0; break;\r
+                case vstSmpteRateFps30drop:    rate = AudioPlayHead::fps30drop;   fps = 30.0;  break;\r
+\r
+                case vstSmpteRate16mmFilm:\r
+                case vstSmpteRate35mmFilm:     fps = 24.0; break;\r
+\r
+                case vstSmpteRateFps249:       fps = 25.0 * 1000.0 / 1001.0; break;\r
+                case vstSmpteRateFps599:       fps = 60.0 * 1000.0 / 1001.0; break;\r
+                case vstSmpteRateFps60:        fps = 60; break;\r
+\r
+                default:                       jassertfalse; // unknown frame-rate..\r
             }\r
 \r
             info.frameRate = rate;\r
@@ -739,14 +692,14 @@ public:
             info.editOriginTime = 0;\r
         }\r
 \r
-        info.isRecording = (ti->flags & Vst2::kVstTransportRecording) != 0;\r
-        info.isPlaying   = (ti->flags & (Vst2::kVstTransportRecording | Vst2::kVstTransportPlaying)) != 0;\r
-        info.isLooping   = (ti->flags & Vst2::kVstTransportCycleActive) != 0;\r
+        info.isRecording = (ti->flags & vstTimingInfoFlagCurrentlyRecording) != 0;\r
+        info.isPlaying   = (ti->flags & (vstTimingInfoFlagCurrentlyRecording | vstTimingInfoFlagCurrentlyPlaying)) != 0;\r
+        info.isLooping   = (ti->flags & vstTimingInfoFlagLoopActive) != 0;\r
 \r
-        if ((ti->flags & Vst2::kVstCyclePosValid) != 0)\r
+        if ((ti->flags & vstTimingInfoFlagLoopPositionValid) != 0)\r
         {\r
-            info.ppqLoopStart = ti->cycleStartPos;\r
-            info.ppqLoopEnd   = ti->cycleEndPos;\r
+            info.ppqLoopStart = ti->loopStartPosition;\r
+            info.ppqLoopEnd   = ti->loopEndPosition;\r
         }\r
         else\r
         {\r
@@ -766,7 +719,7 @@ public:
         return 0.0f;\r
     }\r
 \r
-    static float getParameterCB (Vst2::AEffect* vstInterface, int32 index)\r
+    static float getParameterCB (VstEffectInterface* vstInterface, int32 index)\r
     {\r
         return getWrapper (vstInterface)->getParameter (index);\r
     }\r
@@ -782,7 +735,7 @@ public:
         }\r
     }\r
 \r
-    static void setParameterCB (Vst2::AEffect* vstInterface, int32 index, float value)\r
+    static void setParameterCB (VstEffectInterface* vstInterface, int32 index, float value)\r
     {\r
         getWrapper (vstInterface)->setParameter (index, value);\r
     }\r
@@ -796,19 +749,19 @@ public:
         }\r
 \r
         if (hostCallback != nullptr)\r
-            hostCallback (&vstEffect, Vst2::audioMasterAutomate, index, 0, 0, newValue);\r
+            hostCallback (&vstEffect, hostOpcodeParameterChanged, index, 0, 0, newValue);\r
     }\r
 \r
     void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override\r
     {\r
         if (hostCallback != nullptr)\r
-            hostCallback (&vstEffect, Vst2::audioMasterBeginEdit, index, 0, 0, 0);\r
+            hostCallback (&vstEffect, hostOpcodeParameterChangeGestureBegin, index, 0, 0, 0);\r
     }\r
 \r
     void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override\r
     {\r
         if (hostCallback != nullptr)\r
-            hostCallback (&vstEffect, Vst2::audioMasterEndEdit, index, 0, 0, 0);\r
+            hostCallback (&vstEffect, hostOpcodeParameterChangeGestureEnd, index, 0, 0, 0);\r
     }\r
 \r
     void parameterValueChanged (int, float newValue) override\r
@@ -821,10 +774,10 @@ public:
 \r
     void audioProcessorChanged (AudioProcessor*) override\r
     {\r
-        vstEffect.initialDelay = processor->getLatencySamples();\r
+        vstEffect.latency = processor->getLatencySamples();\r
 \r
         if (hostCallback != nullptr)\r
-            hostCallback (&vstEffect, Vst2::audioMasterUpdateDisplay, 0, 0, 0, 0);\r
+            hostCallback (&vstEffect, hostOpcodeUpdateView, 0, 0, 0, 0);\r
 \r
         triggerAsyncUpdate();\r
     }\r
@@ -832,10 +785,10 @@ public:
     void handleAsyncUpdate() override\r
     {\r
         if (hostCallback != nullptr)\r
-            hostCallback (&vstEffect, Vst2::audioMasterIOChanged, 0, 0, 0, 0);\r
+            hostCallback (&vstEffect, hostOpcodeIOModified, 0, 0, 0, 0);\r
     }\r
 \r
-    bool getPinProperties (Vst2::VstPinProperties& properties, bool direction, int index) const\r
+    bool getPinProperties (VstPinInfo& properties, bool direction, int index) const\r
     {\r
         if (processor->isMidiEffect())\r
             return false;\r
@@ -844,9 +797,9 @@ public:
 \r
         // fill with default\r
         properties.flags = 0;\r
-        properties.label[0] = 0;\r
-        properties.shortLabel[0] = 0;\r
-        properties.arrangementType = Vst2::kSpeakerArrEmpty;\r
+        properties.text[0] = 0;\r
+        properties.shortText[0] = 0;\r
+        properties.configurationType = vstSpeakerConfigTypeEmpty;\r
 \r
         if ((channelIdx = processor->getOffsetInBusBufferForAbsoluteChannelIndex (direction, index, busIdx)) >= 0)\r
         {\r
@@ -854,8 +807,8 @@ public:
             auto& channelSet = bus.getCurrentLayout();\r
             auto channelType = channelSet.getTypeOfChannel (channelIdx);\r
 \r
-            properties.flags = Vst2::kVstPinIsActive | Vst2::kVstPinUseSpeaker;\r
-            properties.arrangementType = SpeakerMappings::channelSetToVstArrangementType (channelSet);\r
+            properties.flags = vstPinInfoFlagIsActive | vstPinInfoFlagValid;\r
+            properties.configurationType = SpeakerMappings::channelSetToVstArrangementType (channelSet);\r
             String label = bus.getName();\r
 \r
            #ifdef JucePlugin_PreferredChannelConfigurations\r
@@ -865,8 +818,8 @@ public:
                 label += " " + AudioChannelSet::getAbbreviatedChannelTypeName (channelType);\r
            #endif\r
 \r
-            label.copyToUTF8 (properties.label, (size_t) (Vst2::kVstMaxLabelLen + 1));\r
-            label.copyToUTF8 (properties.shortLabel, (size_t) (Vst2::kVstMaxShortLabelLen + 1));\r
+            label.copyToUTF8 (properties.text, (size_t) (vstMaxParameterOrPinLabelLength + 1));\r
+            label.copyToUTF8 (properties.shortText, (size_t) (vstMaxParameterOrPinShortLabelLength + 1));\r
 \r
             if (channelType == AudioChannelSet::left\r
                 || channelType == AudioChannelSet::leftSurround\r
@@ -876,7 +829,7 @@ public:
                 || channelType == AudioChannelSet::topRearLeft\r
                 || channelType == AudioChannelSet::leftSurroundRear\r
                 || channelType == AudioChannelSet::wideLeft)\r
-                properties.flags |= Vst2::kVstPinIsStereo;\r
+                properties.flags |= vstPinInfoFlagIsStereo;\r
 \r
             return true;\r
         }\r
@@ -909,27 +862,27 @@ public:
             }\r
         };\r
 \r
-        static AudioChannelSet vstArrangementTypeToChannelSet (const Vst2::VstSpeakerArrangement& arr)\r
-        {\r
-            if (arr.type == Vst2::kSpeakerArrEmpty)      return AudioChannelSet::disabled();\r
-            if (arr.type == Vst2::kSpeakerArrMono)       return AudioChannelSet::mono();\r
-            if (arr.type == Vst2::kSpeakerArrStereo)     return AudioChannelSet::stereo();\r
-            if (arr.type == Vst2::kSpeakerArr30Cine)     return AudioChannelSet::createLCR();\r
-            if (arr.type == Vst2::kSpeakerArr30Music)    return AudioChannelSet::createLRS();\r
-            if (arr.type == Vst2::kSpeakerArr40Cine)     return AudioChannelSet::createLCRS();\r
-            if (arr.type == Vst2::kSpeakerArr50)         return AudioChannelSet::create5point0();\r
-            if (arr.type == Vst2::kSpeakerArr51)         return AudioChannelSet::create5point1();\r
-            if (arr.type == Vst2::kSpeakerArr60Cine)     return AudioChannelSet::create6point0();\r
-            if (arr.type == Vst2::kSpeakerArr61Cine)     return AudioChannelSet::create6point1();\r
-            if (arr.type == Vst2::kSpeakerArr60Music)    return AudioChannelSet::create6point0Music();\r
-            if (arr.type == Vst2::kSpeakerArr61Music)    return AudioChannelSet::create6point1Music();\r
-            if (arr.type == Vst2::kSpeakerArr70Music)    return AudioChannelSet::create7point0();\r
-            if (arr.type == Vst2::kSpeakerArr70Cine)     return AudioChannelSet::create7point0SDDS();\r
-            if (arr.type == Vst2::kSpeakerArr71Music)    return AudioChannelSet::create7point1();\r
-            if (arr.type == Vst2::kSpeakerArr71Cine)     return AudioChannelSet::create7point1SDDS();\r
-            if (arr.type == Vst2::kSpeakerArr40Music)    return AudioChannelSet::quadraphonic();\r
-\r
-            for (auto* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+        static AudioChannelSet vstArrangementTypeToChannelSet (const VstSpeakerConfiguration& arr)\r
+        {\r
+            if (arr.type == vstSpeakerConfigTypeEmpty)          return AudioChannelSet::disabled();\r
+            if (arr.type == vstSpeakerConfigTypeMono)           return AudioChannelSet::mono();\r
+            if (arr.type == vstSpeakerConfigTypeLR)             return AudioChannelSet::stereo();\r
+            if (arr.type == vstSpeakerConfigTypeLRC)            return AudioChannelSet::createLCR();\r
+            if (arr.type == vstSpeakerConfigTypeLRS)            return AudioChannelSet::createLRS();\r
+            if (arr.type == vstSpeakerConfigTypeLRCS)           return AudioChannelSet::createLCRS();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLsRs)        return AudioChannelSet::create5point0();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLfeLsRs)     return AudioChannelSet::create5point1();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLsRsCs)      return AudioChannelSet::create6point0();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLfeLsRsCs)   return AudioChannelSet::create6point1();\r
+            if (arr.type == vstSpeakerConfigTypeLRLsRsSlSr)     return AudioChannelSet::create6point0Music();\r
+            if (arr.type == vstSpeakerConfigTypeLRLfeLsRsSlSr)  return AudioChannelSet::create6point1Music();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLsRsSlSr)    return AudioChannelSet::create7point0();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLsRsLcRc)    return AudioChannelSet::create7point0SDDS();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLfeLsRsSlSr) return AudioChannelSet::create7point1();\r
+            if (arr.type == vstSpeakerConfigTypeLRCLfeLsRsLcRc) return AudioChannelSet::create7point1SDDS();\r
+            if (arr.type == vstSpeakerConfigTypeLRLsRs)         return AudioChannelSet::quadraphonic();\r
+\r
+            for (auto* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
             {\r
                 if (m->vst2 == arr.type)\r
                 {\r
@@ -942,51 +895,51 @@ public:
                 }\r
             }\r
 \r
-            return AudioChannelSet::discreteChannels (arr.numChannels);\r
+            return AudioChannelSet::discreteChannels (arr.numberOfChannels);\r
         }\r
 \r
         static int32 channelSetToVstArrangementType (AudioChannelSet channels)\r
         {\r
-            if (channels == AudioChannelSet::disabled())           return Vst2::kSpeakerArrEmpty;\r
-            if (channels == AudioChannelSet::mono())               return Vst2::kSpeakerArrMono;\r
-            if (channels == AudioChannelSet::stereo())             return Vst2::kSpeakerArrStereo;\r
-            if (channels == AudioChannelSet::createLCR())          return Vst2::kSpeakerArr30Cine;\r
-            if (channels == AudioChannelSet::createLRS())          return Vst2::kSpeakerArr30Music;\r
-            if (channels == AudioChannelSet::createLCRS())         return Vst2::kSpeakerArr40Cine;\r
-            if (channels == AudioChannelSet::create5point0())      return Vst2::kSpeakerArr50;\r
-            if (channels == AudioChannelSet::create5point1())      return Vst2::kSpeakerArr51;\r
-            if (channels == AudioChannelSet::create6point0())      return Vst2::kSpeakerArr60Cine;\r
-            if (channels == AudioChannelSet::create6point1())      return Vst2::kSpeakerArr61Cine;\r
-            if (channels == AudioChannelSet::create6point0Music()) return Vst2::kSpeakerArr60Music;\r
-            if (channels == AudioChannelSet::create6point1Music()) return Vst2::kSpeakerArr61Music;\r
-            if (channels == AudioChannelSet::create7point0())      return Vst2::kSpeakerArr70Music;\r
-            if (channels == AudioChannelSet::create7point0SDDS())  return Vst2::kSpeakerArr70Cine;\r
-            if (channels == AudioChannelSet::create7point1())      return Vst2::kSpeakerArr71Music;\r
-            if (channels == AudioChannelSet::create7point1SDDS())  return Vst2::kSpeakerArr71Cine;\r
-            if (channels == AudioChannelSet::quadraphonic())       return Vst2::kSpeakerArr40Music;\r
+            if (channels == AudioChannelSet::disabled())           return vstSpeakerConfigTypeEmpty;\r
+            if (channels == AudioChannelSet::mono())               return vstSpeakerConfigTypeMono;\r
+            if (channels == AudioChannelSet::stereo())             return vstSpeakerConfigTypeLR;\r
+            if (channels == AudioChannelSet::createLCR())          return vstSpeakerConfigTypeLRC;\r
+            if (channels == AudioChannelSet::createLRS())          return vstSpeakerConfigTypeLRS;\r
+            if (channels == AudioChannelSet::createLCRS())         return vstSpeakerConfigTypeLRCS;\r
+            if (channels == AudioChannelSet::create5point0())      return vstSpeakerConfigTypeLRCLsRs;\r
+            if (channels == AudioChannelSet::create5point1())      return vstSpeakerConfigTypeLRCLfeLsRs;\r
+            if (channels == AudioChannelSet::create6point0())      return vstSpeakerConfigTypeLRCLsRsCs;\r
+            if (channels == AudioChannelSet::create6point1())      return vstSpeakerConfigTypeLRCLfeLsRsCs;\r
+            if (channels == AudioChannelSet::create6point0Music()) return vstSpeakerConfigTypeLRLsRsSlSr;\r
+            if (channels == AudioChannelSet::create6point1Music()) return vstSpeakerConfigTypeLRLfeLsRsSlSr;\r
+            if (channels == AudioChannelSet::create7point0())      return vstSpeakerConfigTypeLRCLsRsSlSr;\r
+            if (channels == AudioChannelSet::create7point0SDDS())  return vstSpeakerConfigTypeLRCLsRsLcRc;\r
+            if (channels == AudioChannelSet::create7point1())      return vstSpeakerConfigTypeLRCLfeLsRsSlSr;\r
+            if (channels == AudioChannelSet::create7point1SDDS())  return vstSpeakerConfigTypeLRCLfeLsRsLcRc;\r
+            if (channels == AudioChannelSet::quadraphonic())       return vstSpeakerConfigTypeLRLsRs;\r
 \r
             if (channels == AudioChannelSet::disabled())\r
-                return Vst2::kSpeakerArrEmpty;\r
+                return vstSpeakerConfigTypeEmpty;\r
 \r
             auto chans = channels.getChannelTypes();\r
 \r
-            for (auto* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+            for (auto* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
                 if (m->matches (chans))\r
                     return m->vst2;\r
 \r
-            return Vst2::kSpeakerArrUserDefined;\r
+            return vstSpeakerConfigTypeUser;\r
         }\r
 \r
-        static void channelSetToVstArrangement (const AudioChannelSet& channels, Vst2::VstSpeakerArrangement& result)\r
+        static void channelSetToVstArrangement (const AudioChannelSet& channels, VstSpeakerConfiguration& result)\r
         {\r
             result.type = channelSetToVstArrangementType (channels);\r
-            result.numChannels = channels.size();\r
+            result.numberOfChannels = channels.size();\r
 \r
-            for (int i = 0; i < result.numChannels; ++i)\r
+            for (int i = 0; i < result.numberOfChannels; ++i)\r
             {\r
                 auto& speaker = result.speakers[i];\r
 \r
-                zeromem (&speaker, sizeof (Vst2::VstSpeakerProperties));\r
+                zeromem (&speaker, sizeof (VstIndividualSpeakerInfo));\r
                 speaker.type = getSpeakerType (channels.getTypeOfChannel (i));\r
             }\r
         }\r
@@ -995,36 +948,36 @@ public:
         {\r
             static const Mapping mappings[] =\r
             {\r
-                { Vst2::kSpeakerArrMono,           { centre, unknown } },\r
-                { Vst2::kSpeakerArrStereo,         { left, right, unknown } },\r
-                { Vst2::kSpeakerArrStereoSurround, { leftSurround, rightSurround, unknown } },\r
-                { Vst2::kSpeakerArrStereoCenter,   { leftCentre, rightCentre, unknown } },\r
-                { Vst2::kSpeakerArrStereoSide,     { leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArrStereoCLfe,     { centre, LFE, unknown } },\r
-                { Vst2::kSpeakerArr30Cine,         { left, right, centre, unknown } },\r
-                { Vst2::kSpeakerArr30Music,        { left, right, surround, unknown } },\r
-                { Vst2::kSpeakerArr31Cine,         { left, right, centre, LFE, unknown } },\r
-                { Vst2::kSpeakerArr31Music,        { left, right, LFE, surround, unknown } },\r
-                { Vst2::kSpeakerArr40Cine,         { left, right, centre, surround, unknown } },\r
-                { Vst2::kSpeakerArr40Music,        { left, right, leftSurround, rightSurround, unknown } },\r
-                { Vst2::kSpeakerArr41Cine,         { left, right, centre, LFE, surround, unknown } },\r
-                { Vst2::kSpeakerArr41Music,        { left, right, LFE, leftSurround, rightSurround, unknown } },\r
-                { Vst2::kSpeakerArr50,             { left, right, centre, leftSurround, rightSurround, unknown } },\r
-                { Vst2::kSpeakerArr51,             { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
-                { Vst2::kSpeakerArr60Cine,         { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
-                { Vst2::kSpeakerArr60Music,        { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArr61Cine,         { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
-                { Vst2::kSpeakerArr61Music,        { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArr70Cine,         { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
-                { Vst2::kSpeakerArr70Music,        { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArr71Cine,         { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
-                { Vst2::kSpeakerArr71Music,        { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArr80Cine,         { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
-                { Vst2::kSpeakerArr80Music,        { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArr81Cine,         { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
-                { Vst2::kSpeakerArr81Music,        { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
-                { Vst2::kSpeakerArr102, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
-                { Vst2::kSpeakerArrEmpty,          { unknown } }\r
+                { vstSpeakerConfigTypeMono,                          { centre, unknown } },\r
+                { vstSpeakerConfigTypeLR,                            { left, right, unknown } },\r
+                { vstSpeakerConfigTypeLsRs,                          { leftSurround, rightSurround, unknown } },\r
+                { vstSpeakerConfigTypeLcRc,                          { leftCentre, rightCentre, unknown } },\r
+                { vstSpeakerConfigTypeSlSr,                          { leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeCLfe,                          { centre, LFE, unknown } },\r
+                { vstSpeakerConfigTypeLRC,                           { left, right, centre, unknown } },\r
+                { vstSpeakerConfigTypeLRS,                           { left, right, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfe,                        { left, right, centre, LFE, unknown } },\r
+                { vstSpeakerConfigTypeLRLfeS,                        { left, right, LFE, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRCS,                          { left, right, centre, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRLsRs,                        { left, right, leftSurround, rightSurround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeS,                       { left, right, centre, LFE, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRLfeLsRs,                     { left, right, LFE, leftSurround, rightSurround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLsRs,                       { left, right, centre, leftSurround, rightSurround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRs,                    { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLsRsCs,                     { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRLsRsSlSr,                    { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRsCs,                  { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRLfeLsRsSlSr,                 { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeLRCLsRsLcRc,                   { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+                { vstSpeakerConfigTypeLRCLsRsSlSr,                   { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRsLcRc,                { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRsSlSr,                { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeLRCLsRsLcRcCs,                 { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLsRsCsSlSr,                 { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRsLcRcCs,              { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRsCsSlSr,              { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+                { vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
+                { vstSpeakerConfigTypeEmpty,                         { unknown } }\r
             };\r
 \r
             return mappings;\r
@@ -1034,25 +987,25 @@ public:
         {\r
             switch (type)\r
             {\r
-                case AudioChannelSet::left:              return Vst2::kSpeakerL;\r
-                case AudioChannelSet::right:             return Vst2::kSpeakerR;\r
-                case AudioChannelSet::centre:            return Vst2::kSpeakerC;\r
-                case AudioChannelSet::LFE:               return Vst2::kSpeakerLfe;\r
-                case AudioChannelSet::leftSurround:      return Vst2::kSpeakerLs;\r
-                case AudioChannelSet::rightSurround:     return Vst2::kSpeakerRs;\r
-                case AudioChannelSet::leftCentre:        return Vst2::kSpeakerLc;\r
-                case AudioChannelSet::rightCentre:       return Vst2::kSpeakerRc;\r
-                case AudioChannelSet::surround:          return Vst2::kSpeakerS;\r
-                case AudioChannelSet::leftSurroundRear:  return Vst2::kSpeakerSl;\r
-                case AudioChannelSet::rightSurroundRear: return Vst2::kSpeakerSr;\r
-                case AudioChannelSet::topMiddle:         return Vst2::kSpeakerTm;\r
-                case AudioChannelSet::topFrontLeft:      return Vst2::kSpeakerTfl;\r
-                case AudioChannelSet::topFrontCentre:    return Vst2::kSpeakerTfc;\r
-                case AudioChannelSet::topFrontRight:     return Vst2::kSpeakerTfr;\r
-                case AudioChannelSet::topRearLeft:       return Vst2::kSpeakerTrl;\r
-                case AudioChannelSet::topRearCentre:     return Vst2::kSpeakerTrc;\r
-                case AudioChannelSet::topRearRight:      return Vst2::kSpeakerTrr;\r
-                case AudioChannelSet::LFE2:              return Vst2::kSpeakerLfe2;\r
+                case AudioChannelSet::left:              return vstIndividualSpeakerTypeLeft;\r
+                case AudioChannelSet::right:             return vstIndividualSpeakerTypeRight;\r
+                case AudioChannelSet::centre:            return vstIndividualSpeakerTypeCentre;\r
+                case AudioChannelSet::LFE:               return vstIndividualSpeakerTypeLFE;\r
+                case AudioChannelSet::leftSurround:      return vstIndividualSpeakerTypeLeftSurround;\r
+                case AudioChannelSet::rightSurround:     return vstIndividualSpeakerTypeRightSurround;\r
+                case AudioChannelSet::leftCentre:        return vstIndividualSpeakerTypeLeftCentre;\r
+                case AudioChannelSet::rightCentre:       return vstIndividualSpeakerTypeRightCentre;\r
+                case AudioChannelSet::surround:          return vstIndividualSpeakerTypeSurround;\r
+                case AudioChannelSet::leftSurroundRear:  return vstIndividualSpeakerTypeLeftRearSurround;\r
+                case AudioChannelSet::rightSurroundRear: return vstIndividualSpeakerTypeRightRearSurround;\r
+                case AudioChannelSet::topMiddle:         return vstIndividualSpeakerTypeTopMiddle;\r
+                case AudioChannelSet::topFrontLeft:      return vstIndividualSpeakerTypeTopFrontLeft;\r
+                case AudioChannelSet::topFrontCentre:    return vstIndividualSpeakerTypeTopFrontCentre;\r
+                case AudioChannelSet::topFrontRight:     return vstIndividualSpeakerTypeTopFrontRight;\r
+                case AudioChannelSet::topRearLeft:       return vstIndividualSpeakerTypeTopRearLeft;\r
+                case AudioChannelSet::topRearCentre:     return vstIndividualSpeakerTypeTopRearCentre;\r
+                case AudioChannelSet::topRearRight:      return vstIndividualSpeakerTypeTopRearRight;\r
+                case AudioChannelSet::LFE2:              return vstIndividualSpeakerTypeLFE2;\r
                 default: break;\r
             }\r
 \r
@@ -1063,25 +1016,25 @@ public:
         {\r
             switch (type)\r
             {\r
-                case Vst2::kSpeakerL:       return AudioChannelSet::left;\r
-                case Vst2::kSpeakerR:       return AudioChannelSet::right;\r
-                case Vst2::kSpeakerC:       return AudioChannelSet::centre;\r
-                case Vst2::kSpeakerLfe:     return AudioChannelSet::LFE;\r
-                case Vst2::kSpeakerLs:      return AudioChannelSet::leftSurround;\r
-                case Vst2::kSpeakerRs:      return AudioChannelSet::rightSurround;\r
-                case Vst2::kSpeakerLc:      return AudioChannelSet::leftCentre;\r
-                case Vst2::kSpeakerRc:      return AudioChannelSet::rightCentre;\r
-                case Vst2::kSpeakerS:       return AudioChannelSet::surround;\r
-                case Vst2::kSpeakerSl:      return AudioChannelSet::leftSurroundRear;\r
-                case Vst2::kSpeakerSr:      return AudioChannelSet::rightSurroundRear;\r
-                case Vst2::kSpeakerTm:      return AudioChannelSet::topMiddle;\r
-                case Vst2::kSpeakerTfl:     return AudioChannelSet::topFrontLeft;\r
-                case Vst2::kSpeakerTfc:     return AudioChannelSet::topFrontCentre;\r
-                case Vst2::kSpeakerTfr:     return AudioChannelSet::topFrontRight;\r
-                case Vst2::kSpeakerTrl:     return AudioChannelSet::topRearLeft;\r
-                case Vst2::kSpeakerTrc:     return AudioChannelSet::topRearCentre;\r
-                case Vst2::kSpeakerTrr:     return AudioChannelSet::topRearRight;\r
-                case Vst2::kSpeakerLfe2:    return AudioChannelSet::LFE2;\r
+                case vstIndividualSpeakerTypeLeft:              return AudioChannelSet::left;\r
+                case vstIndividualSpeakerTypeRight:             return AudioChannelSet::right;\r
+                case vstIndividualSpeakerTypeCentre:            return AudioChannelSet::centre;\r
+                case vstIndividualSpeakerTypeLFE:               return AudioChannelSet::LFE;\r
+                case vstIndividualSpeakerTypeLeftSurround:      return AudioChannelSet::leftSurround;\r
+                case vstIndividualSpeakerTypeRightSurround:     return AudioChannelSet::rightSurround;\r
+                case vstIndividualSpeakerTypeLeftCentre:        return AudioChannelSet::leftCentre;\r
+                case vstIndividualSpeakerTypeRightCentre:       return AudioChannelSet::rightCentre;\r
+                case vstIndividualSpeakerTypeSurround:          return AudioChannelSet::surround;\r
+                case vstIndividualSpeakerTypeLeftRearSurround:  return AudioChannelSet::leftSurroundRear;\r
+                case vstIndividualSpeakerTypeRightRearSurround: return AudioChannelSet::rightSurroundRear;\r
+                case vstIndividualSpeakerTypeTopMiddle:         return AudioChannelSet::topMiddle;\r
+                case vstIndividualSpeakerTypeTopFrontLeft:      return AudioChannelSet::topFrontLeft;\r
+                case vstIndividualSpeakerTypeTopFrontCentre:    return AudioChannelSet::topFrontCentre;\r
+                case vstIndividualSpeakerTypeTopFrontRight:     return AudioChannelSet::topFrontRight;\r
+                case vstIndividualSpeakerTypeTopRearLeft:       return AudioChannelSet::topRearLeft;\r
+                case vstIndividualSpeakerTypeTopRearCentre:     return AudioChannelSet::topRearCentre;\r
+                case vstIndividualSpeakerTypeTopRearRight:      return AudioChannelSet::topRearRight;\r
+                case vstIndividualSpeakerTypeLFE2:              return AudioChannelSet::LFE2;\r
                 default: break;\r
             }\r
 \r
@@ -1118,12 +1071,16 @@ public:
         {\r
             if (auto* ed = processor->createEditorIfNeeded())\r
             {\r
-                vstEffect.flags |= Vst2::effFlagsHasEditor;\r
+                vstEffect.flags |= vstEffectFlagHasEditor;\r
                 editorComp.reset (new EditorCompWrapper (*this, *ed));\r
+\r
+               #if ! (JUCE_MAC || JUCE_IOS)\r
+                ed->setScaleFactor (editorScaleFactor);\r
+               #endif\r
             }\r
             else\r
             {\r
-                vstEffect.flags &= ~Vst2::effFlagsHasEditor;\r
+                vstEffect.flags &= ~vstEffectFlagHasEditor;\r
             }\r
         }\r
 \r
@@ -1173,59 +1130,59 @@ public:
 \r
         switch (opCode)\r
         {\r
-            case Vst2::effOpen:                     return handleOpen (args);\r
-            case Vst2::effClose:                    return handleClose (args);\r
-            case Vst2::effSetProgram:               return handleSetCurrentProgram (args);\r
-            case Vst2::effGetProgram:               return handleGetCurrentProgram (args);\r
-            case Vst2::effSetProgramName:           return handleSetCurrentProgramName (args);\r
-            case Vst2::effGetProgramName:           return handleGetCurrentProgramName (args);\r
-            case Vst2::effGetParamLabel:            return handleGetParameterLabel (args);\r
-            case Vst2::effGetParamDisplay:          return handleGetParameterText (args);\r
-            case Vst2::effGetParamName:             return handleGetParameterName (args);\r
-            case Vst2::effSetSampleRate:            return handleSetSampleRate (args);\r
-            case Vst2::effSetBlockSize:             return handleSetBlockSize (args);\r
-            case Vst2::effMainsChanged:             return handleResumeSuspend (args);\r
-            case Vst2::effEditGetRect:              return handleGetEditorBounds (args);\r
-            case Vst2::effEditOpen:                 return handleOpenEditor (args);\r
-            case Vst2::effEditClose:                return handleCloseEditor (args);\r
-            case Vst2::effIdentify:                 return (pointer_sized_int) ByteOrder::bigEndianInt ("NvEf");\r
-            case Vst2::effGetChunk:                 return handleGetData (args);\r
-            case Vst2::effSetChunk:                 return handleSetData (args);\r
-            case Vst2::effProcessEvents:            return handlePreAudioProcessingEvents (args);\r
-            case Vst2::effCanBeAutomated:           return handleIsParameterAutomatable (args);\r
-            case Vst2::effString2Parameter:         return handleParameterValueForText (args);\r
-            case Vst2::effGetProgramNameIndexed:    return handleGetProgramName (args);\r
-            case Vst2::effGetInputProperties:       return handleGetInputPinProperties (args);\r
-            case Vst2::effGetOutputProperties:      return handleGetOutputPinProperties (args);\r
-            case Vst2::effGetPlugCategory:          return handleGetPlugInCategory (args);\r
-            case Vst2::effSetSpeakerArrangement:    return handleSetSpeakerConfiguration (args);\r
-            case Vst2::effSetBypass:                return handleSetBypass (args);\r
-            case Vst2::effGetEffectName:            return handleGetPlugInName (args);\r
-            case Vst2::effGetProductString:         return handleGetPlugInName (args);\r
-            case Vst2::effGetVendorString:          return handleGetManufacturerName (args);\r
-            case Vst2::effGetVendorVersion:         return handleGetManufacturerVersion (args);\r
-            case Vst2::effVendorSpecific:           return handleManufacturerSpecific (args);\r
-            case Vst2::effCanDo:                    return handleCanPlugInDo (args);\r
-            case Vst2::effGetTailSize:              return handleGetTailSize (args);\r
-            case Vst2::effKeysRequired:             return handleKeyboardFocusRequired (args);\r
-            case Vst2::effGetVstVersion:            return handleGetVstInterfaceVersion (args);\r
-            case Vst2::effGetCurrentMidiProgram:    return handleGetCurrentMidiProgram (args);\r
-            case Vst2::effGetSpeakerArrangement:    return handleGetSpeakerConfiguration (args);\r
-            case Vst2::effSetTotalSampleToProcess:  return handleSetNumberOfSamplesToProcess (args);\r
-            case Vst2::effSetProcessPrecision:      return handleSetSampleFloatType (args);\r
-            case Vst2::effGetNumMidiInputChannels:  return handleGetNumMidiInputChannels();\r
-            case Vst2::effGetNumMidiOutputChannels: return handleGetNumMidiOutputChannels();\r
-            default:                                return 0;\r
-        }\r
-    }\r
-\r
-    static pointer_sized_int dispatcherCB (Vst2::AEffect* vstInterface, int32 opCode, int32 index,\r
+            case plugInOpcodeOpen:                        return handleOpen (args);\r
+            case plugInOpcodeClose:                       return handleClose (args);\r
+            case plugInOpcodeSetCurrentProgram:           return handleSetCurrentProgram (args);\r
+            case plugInOpcodeGetCurrentProgram:           return handleGetCurrentProgram (args);\r
+            case plugInOpcodeSetCurrentProgramName:       return handleSetCurrentProgramName (args);\r
+            case plugInOpcodeGetCurrentProgramName:       return handleGetCurrentProgramName (args);\r
+            case plugInOpcodeGetParameterLabel:           return handleGetParameterLabel (args);\r
+            case plugInOpcodeGetParameterText:            return handleGetParameterText (args);\r
+            case plugInOpcodeGetParameterName:            return handleGetParameterName (args);\r
+            case plugInOpcodeSetSampleRate:               return handleSetSampleRate (args);\r
+            case plugInOpcodeSetBlockSize:                return handleSetBlockSize (args);\r
+            case plugInOpcodeResumeSuspend:               return handleResumeSuspend (args);\r
+            case plugInOpcodeGetEditorBounds:             return handleGetEditorBounds (args);\r
+            case plugInOpcodeOpenEditor:                  return handleOpenEditor (args);\r
+            case plugInOpcodeCloseEditor:                 return handleCloseEditor (args);\r
+            case plugInOpcodeIdentify:                    return (pointer_sized_int) ByteOrder::bigEndianInt ("NvEf");\r
+            case plugInOpcodeGetData:                     return handleGetData (args);\r
+            case plugInOpcodeSetData:                     return handleSetData (args);\r
+            case plugInOpcodePreAudioProcessingEvents:    return handlePreAudioProcessingEvents (args);\r
+            case plugInOpcodeIsParameterAutomatable:      return handleIsParameterAutomatable (args);\r
+            case plugInOpcodeParameterValueForText:       return handleParameterValueForText (args);\r
+            case plugInOpcodeGetProgramName:              return handleGetProgramName (args);\r
+            case plugInOpcodeGetInputPinProperties:       return handleGetInputPinProperties (args);\r
+            case plugInOpcodeGetOutputPinProperties:      return handleGetOutputPinProperties (args);\r
+            case plugInOpcodeGetPlugInCategory:           return handleGetPlugInCategory (args);\r
+            case plugInOpcodeSetSpeakerConfiguration:     return handleSetSpeakerConfiguration (args);\r
+            case plugInOpcodeSetBypass:                   return handleSetBypass (args);\r
+            case plugInOpcodeGetPlugInName:               return handleGetPlugInName (args);\r
+            case plugInOpcodeGetManufacturerProductName:  return handleGetPlugInName (args);\r
+            case plugInOpcodeGetManufacturerName:         return handleGetManufacturerName (args);\r
+            case plugInOpcodeGetManufacturerVersion:      return handleGetManufacturerVersion (args);\r
+            case plugInOpcodeManufacturerSpecific:        return handleManufacturerSpecific (args);\r
+            case plugInOpcodeCanPlugInDo:                 return handleCanPlugInDo (args);\r
+            case plugInOpcodeGetTailSize:                 return handleGetTailSize (args);\r
+            case plugInOpcodeKeyboardFocusRequired:       return handleKeyboardFocusRequired (args);\r
+            case plugInOpcodeGetVstInterfaceVersion:      return handleGetVstInterfaceVersion (args);\r
+            case plugInOpcodeGetCurrentMidiProgram:       return handleGetCurrentMidiProgram (args);\r
+            case plugInOpcodeGetSpeakerArrangement:       return handleGetSpeakerConfiguration (args);\r
+            case plugInOpcodeSetNumberOfSamplesToProcess: return handleSetNumberOfSamplesToProcess (args);\r
+            case plugInOpcodeSetSampleFloatType:          return handleSetSampleFloatType (args);\r
+            case pluginOpcodeGetNumMidiInputChannels:     return handleGetNumMidiInputChannels();\r
+            case pluginOpcodeGetNumMidiOutputChannels:    return handleGetNumMidiOutputChannels();\r
+            default:                                      return 0;\r
+        }\r
+    }\r
+\r
+    static pointer_sized_int dispatcherCB (VstEffectInterface* vstInterface, int32 opCode, int32 index,\r
                                            pointer_sized_int value, void* ptr, float opt)\r
     {\r
         auto* wrapper = getWrapper (vstInterface);\r
         VstOpCodeArguments args = { index, value, ptr, opt };\r
 \r
-        if (opCode == Vst2::effClose)\r
+        if (opCode == plugInOpcodeClose)\r
         {\r
             wrapper->dispatcher (opCode, args);\r
             delete wrapper;\r
@@ -1240,8 +1197,7 @@ public:
     // chores when it changes or repaints.\r
     struct EditorCompWrapper  : public Component\r
     {\r
-        EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor)\r
-            : wrapper (w)\r
+        EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor)  : wrapper (w)\r
         {\r
             editor.setOpaque (true);\r
             editor.setVisible (true);\r
@@ -1270,19 +1226,14 @@ public:
 \r
         void paint (Graphics&) override {}\r
 \r
-        void getEditorBounds (Vst2::ERect& bounds)\r
+        void getEditorBounds (VstEditorBounds& bounds)\r
         {\r
             auto b = getSizeToContainChild();\r
 \r
-            bounds.top    = 0;\r
-            bounds.left   = 0;\r
-            bounds.bottom = (int16) b.getHeight();\r
-            bounds.right  = (int16) b.getWidth();\r
-\r
-           #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            bounds.bottom = (int16) roundToInt (bounds.bottom * wrapper.editorScaleFactor);\r
-            bounds.right  = (int16) roundToInt (bounds.right  * wrapper.editorScaleFactor);\r
-           #endif\r
+            bounds.upper     = 0;\r
+            bounds.leftmost  = 0;\r
+            bounds.lower     = (int16) b.getHeight();\r
+            bounds.rightmost = (int16) b.getWidth();\r
         }\r
 \r
         void attachToHost (VstOpCodeArguments args)\r
@@ -1293,14 +1244,6 @@ public:
            #if JUCE_WINDOWS\r
             addToDesktop (0, args.ptr);\r
             hostWindow = (HWND) args.ptr;\r
-\r
-            if (auto* ed = getEditorComp())\r
-               #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                if (auto* peer = ed->getPeer())\r
-                    wrapper.editorScaleFactor = (float) peer->getPlatformScaleFactor();\r
-               #else\r
-                ed->setScaleFactor (wrapper.editorScaleFactor);\r
-               #endif\r
            #elif JUCE_LINUX\r
             addToDesktop (0, args.ptr);\r
             hostWindow = (Window) args.ptr;\r
@@ -1340,33 +1283,17 @@ public:
             return dynamic_cast<AudioProcessorEditor*> (getChildComponent(0));\r
         }\r
 \r
-       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        void checkScaleFactorIsCorrect()\r
-        {\r
-            if (auto* peer = getEditorComp()->getPeer())\r
-            {\r
-                auto peerScaleFactor = (float) peer->getPlatformScaleFactor();\r
-\r
-                if (! approximatelyEqual (peerScaleFactor, wrapper.editorScaleFactor))\r
-                    wrapper.handleSetContentScaleFactor (peerScaleFactor);\r
-            }\r
-        }\r
-       #endif\r
-\r
         void resized() override\r
         {\r
             if (auto* ed = getEditorComp())\r
             {\r
-               #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                checkScaleFactorIsCorrect();\r
-               #endif\r
-\r
                 ed->setTopLeftPosition (0, 0);\r
 \r
                 if (shouldResizeEditor)\r
                     ed->setBounds (ed->getLocalArea (this, getLocalBounds()));\r
 \r
-                updateWindowSize (false);\r
+                if (! getHostType().isBitwigStudio())\r
+                    updateWindowSize (false);\r
             }\r
 \r
            #if JUCE_MAC && ! JUCE_64BIT\r
@@ -1413,9 +1340,7 @@ public:
                     shouldResizeEditor = true;\r
                    #else\r
                     ignoreUnused (resizeEditor);\r
-                    XResizeWindow (display.display, (Window) getWindowHandle(),\r
-                                   static_cast<unsigned int> (roundToInt (pos.getWidth()  * wrapper.editorScaleFactor)),\r
-                                   static_cast<unsigned int> (roundToInt (pos.getHeight() * wrapper.editorScaleFactor)));\r
+                    XResizeWindow (display.display, (Window) getWindowHandle(), pos.getWidth(), pos.getHeight());\r
                    #endif\r
 \r
                    #if JUCE_MAC\r
@@ -1431,19 +1356,13 @@ public:
 \r
             if (auto host = wrapper.hostCallback)\r
             {\r
-                auto status = host (wrapper.getAEffect(), Vst2::audioMasterCanDo, 0, 0, const_cast<char*> ("sizeWindow"), 0);\r
+                auto status = host (wrapper.getVstEffectInterface(), hostOpcodeCanHostDo, 0, 0, const_cast<char*> ("sizeWindow"), 0);\r
 \r
                 if (status == (pointer_sized_int) 1 || getHostType().isAbletonLive())\r
                 {\r
-                   #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                    newWidth  = roundToInt (newWidth  * wrapper.editorScaleFactor);\r
-                    newHeight = roundToInt (newHeight * wrapper.editorScaleFactor);\r
-                   #endif\r
-\r
-                    const ScopedValueSetter<bool> inSizeWindowSetter (isInSizeWindow, true);\r
-\r
-                    sizeWasSuccessful = (host (wrapper.getAEffect(), Vst2::audioMasterSizeWindow,\r
-                                               newWidth, newHeight, 0, 0) != 0);\r
+                    isInSizeWindow = true;\r
+                    sizeWasSuccessful = (host (wrapper.getVstEffectInterface(), hostOpcodeWindowSize, newWidth, newHeight, 0, 0) != 0);\r
+                    isInSizeWindow = false;\r
                 }\r
             }\r
 \r
@@ -1555,12 +1474,44 @@ public:
 \r
     //==============================================================================\r
 private:\r
-    static JuceVSTWrapper* getWrapper (Vst2::AEffect* v) noexcept  { return static_cast<JuceVSTWrapper*> (v->object); }\r
+    VstHostCallback hostCallback;\r
+    AudioProcessor* processor = {};\r
+    double sampleRate = 44100.0;\r
+    int32 blockSize = 1024;\r
+    VstEffectInterface vstEffect;\r
+    juce::MemoryBlock chunkMemory;\r
+    juce::uint32 chunkMemoryTime = 0;\r
+    std::unique_ptr<EditorCompWrapper> editorComp;\r
+    VstEditorBounds editorBounds;\r
+    MidiBuffer midiEvents;\r
+    VSTMidiEventList outgoingEvents;\r
+    float editorScaleFactor = 1.0f;\r
+\r
+    LegacyAudioParametersWrapper juceParameters;\r
+\r
+    bool isProcessing = false, isBypassed = false, hasShutdown = false;\r
+    bool firstProcessCallback = true, shouldDeleteEditor = false;\r
+\r
+   #if JUCE_64BIT\r
+    bool useNSView = true;\r
+   #else\r
+    bool useNSView = false;\r
+   #endif\r
+\r
+    VstTempBuffers<float> floatTempBuffers;\r
+    VstTempBuffers<double> doubleTempBuffers;\r
+    int maxNumInChannels = 0, maxNumOutChannels = 0;\r
+\r
+    HeapBlock<VstSpeakerConfiguration> cachedInArrangement, cachedOutArrangement;\r
+\r
+    ThreadLocalValue<bool> inParameterChangedCallback;\r
+\r
+    static JuceVSTWrapper* getWrapper (VstEffectInterface* v) noexcept  { return static_cast<JuceVSTWrapper*> (v->effectPointer); }\r
 \r
     bool isProcessLevelOffline()\r
     {\r
         return hostCallback != nullptr\r
-                && (int32) hostCallback (&vstEffect, Vst2::audioMasterGetCurrentProcessLevel, 0, 0, 0, 0) == 4;\r
+                && (int32) hostCallback (&vstEffect, hostOpcodeGetCurrentAudioProcessingLevel, 0, 0, 0, 0) == 4;\r
     }\r
 \r
     static inline int32 convertHexVersionToDecimal (const unsigned int hexVersion)\r
@@ -1628,8 +1579,8 @@ private:
         tmpBuffers.release();\r
 \r
         if (processor != nullptr)\r
-            tmpBuffers.tempChannels.insertMultiple (0, nullptr, vstEffect.numInputs\r
-                                                                 + vstEffect.numOutputs);\r
+            tmpBuffers.tempChannels.insertMultiple (0, nullptr, vstEffect.numInputChannels\r
+                                                                 + vstEffect.numOutputChannels);\r
     }\r
 \r
     void deleteTempChannels()\r
@@ -1681,9 +1632,9 @@ private:
     {\r
         // Note: most hosts call this on the UI thread, but wavelab doesn't, so be careful in here.\r
         if (processor->hasEditor())\r
-            vstEffect.flags |= Vst2::effFlagsHasEditor;\r
+            vstEffect.flags |= vstEffectFlagHasEditor;\r
         else\r
-            vstEffect.flags &= ~Vst2::effFlagsHasEditor;\r
+            vstEffect.flags &= ~vstEffectFlagHasEditor;\r
 \r
         return 0;\r
     }\r
@@ -1792,7 +1743,7 @@ private:
         if (editorComp != nullptr)\r
         {\r
             editorComp->getEditorBounds (editorBounds);\r
-            *((Vst2::ERect**) args.ptr) = &editorBounds;\r
+            *((VstEditorBounds**) args.ptr) = &editorBounds;\r
             return (pointer_sized_int) &editorBounds;\r
         }\r
 \r
@@ -1876,7 +1827,7 @@ private:
     pointer_sized_int handlePreAudioProcessingEvents (VstOpCodeArguments args)\r
     {\r
        #if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect\r
-        VSTMidiEventList::addEventsToMidiBuffer ((Vst2::VstEvents*) args.ptr, midiEvents);\r
+        VSTMidiEventList::addEventsToMidiBuffer ((VstEventBlock*) args.ptr, midiEvents);\r
         return 1;\r
        #else\r
         ignoreUnused (args);\r
@@ -1927,23 +1878,23 @@ private:
 \r
     pointer_sized_int handleGetInputPinProperties (VstOpCodeArguments args)\r
     {\r
-        return (processor != nullptr && getPinProperties (*(Vst2::VstPinProperties*) args.ptr, true, args.index)) ? 1 : 0;\r
+        return (processor != nullptr && getPinProperties (*(VstPinInfo*) args.ptr, true, args.index)) ? 1 : 0;\r
     }\r
 \r
     pointer_sized_int handleGetOutputPinProperties (VstOpCodeArguments args)\r
     {\r
-        return (processor != nullptr && getPinProperties (*(Vst2::VstPinProperties*) args.ptr, false, args.index)) ? 1 : 0;\r
+        return (processor != nullptr && getPinProperties (*(VstPinInfo*) args.ptr, false, args.index)) ? 1 : 0;\r
     }\r
 \r
     pointer_sized_int handleGetPlugInCategory (VstOpCodeArguments)\r
     {\r
-        return Vst2::JucePlugin_VSTCategory;\r
+        return JucePlugin_VSTCategory;\r
     }\r
 \r
     pointer_sized_int handleSetSpeakerConfiguration (VstOpCodeArguments args)\r
     {\r
-        auto* pluginInput  = reinterpret_cast<Vst2::VstSpeakerArrangement*> (args.value);\r
-        auto* pluginOutput = reinterpret_cast<Vst2::VstSpeakerArrangement*> (args.ptr);\r
+        auto* pluginInput  = reinterpret_cast<VstSpeakerConfiguration*> (args.value);\r
+        auto* pluginOutput = reinterpret_cast<VstSpeakerConfiguration*> (args.ptr);\r
 \r
         if (processor->isMidiEffect())\r
             return 0;\r
@@ -1954,29 +1905,29 @@ private:
         if (pluginInput != nullptr && pluginInput->type >= 0)\r
         {\r
             // inconsistent request?\r
-            if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginInput).size() != pluginInput->numChannels)\r
+            if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginInput).size() != pluginInput->numberOfChannels)\r
                 return 0;\r
         }\r
 \r
         if (pluginOutput != nullptr && pluginOutput->type >= 0)\r
         {\r
             // inconsistent request?\r
-            if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginOutput).size() != pluginOutput->numChannels)\r
+            if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginOutput).size() != pluginOutput->numberOfChannels)\r
                 return 0;\r
         }\r
 \r
-        if (pluginInput != nullptr  && pluginInput->numChannels  > 0 && numIns  == 0)\r
+        if (pluginInput != nullptr  && pluginInput->numberOfChannels  > 0 && numIns  == 0)\r
             return 0;\r
 \r
-        if (pluginOutput != nullptr && pluginOutput->numChannels > 0 && numOuts == 0)\r
+        if (pluginOutput != nullptr && pluginOutput->numberOfChannels > 0 && numOuts == 0)\r
             return 0;\r
 \r
         auto layouts = processor->getBusesLayout();\r
 \r
-        if (pluginInput != nullptr && pluginInput-> numChannels >= 0 && numIns  > 0)\r
+        if (pluginInput != nullptr && pluginInput-> numberOfChannels >= 0 && numIns  > 0)\r
             layouts.getChannelSet (true,  0) = SpeakerMappings::vstArrangementTypeToChannelSet (*pluginInput);\r
 \r
-        if (pluginOutput != nullptr && pluginOutput->numChannels >= 0 && numOuts > 0)\r
+        if (pluginOutput != nullptr && pluginOutput->numberOfChannels >= 0 && numOuts > 0)\r
             layouts.getChannelSet (false, 0) = SpeakerMappings::vstArrangementTypeToChannelSet (*pluginOutput);\r
 \r
        #ifdef JucePlugin_PreferredChannelConfigurations\r
@@ -2020,11 +1971,10 @@ private:
         if (handleManufacturerSpecificVST2Opcode (args.index, args.value, args.ptr, args.opt))\r
             return 1;\r
 \r
-        if (args.index == JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S')\r
-             && args.value == JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's'))\r
+        if (args.index == presonusVendorID && args.value == presonusSetContentScaleFactor)\r
             return handleSetContentScaleFactor (args.opt);\r
 \r
-        if (args.index == Vst2::effGetParamDisplay)\r
+        if (args.index == plugInOpcodeGetParameterText)\r
             return handleCockosGetParameterText (args.value, args.ptr, args.opt);\r
 \r
         if (auto callbackHandler = dynamic_cast<VSTCallbackHandler*> (processor))\r
@@ -2039,8 +1989,8 @@ private:
         auto matches = [=](const char* s) { return strcmp (text, s) == 0; };\r
 \r
         if (matches ("receiveVstEvents")\r
-         || matches ("receiveVstMidiEvent")\r
-         || matches ("receiveVstMidiEvents"))\r
+             || matches ("receiveVstMidiEvent")\r
+             || matches ("receiveVstMidiEvents"))\r
         {\r
            #if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect\r
             return 1;\r
@@ -2050,8 +2000,8 @@ private:
         }\r
 \r
         if (matches ("sendVstEvents")\r
-         || matches ("sendVstMidiEvent")\r
-         || matches ("sendVstMidiEvents"))\r
+             || matches ("sendVstMidiEvent")\r
+             || matches ("sendVstMidiEvents"))\r
         {\r
            #if JucePlugin_ProducesMidiOutput || JucePlugin_IsMidiEffect\r
             return 1;\r
@@ -2061,9 +2011,9 @@ private:
         }\r
 \r
         if (matches ("receiveVstTimeInfo")\r
-         || matches ("conformsToWindowRules")\r
-         || matches ("supportsViewDpiScaling")\r
-         || matches ("bypass"))\r
+             || matches ("conformsToWindowRules")\r
+             || matches ("supportsViewDpiScaling")\r
+             || matches ("bypass"))\r
         {\r
             return 1;\r
         }\r
@@ -2096,18 +2046,7 @@ private:
     pointer_sized_int handleGetTailSize (VstOpCodeArguments)\r
     {\r
         if (processor != nullptr)\r
-        {\r
-            int32 result;\r
-\r
-            auto tailSeconds = processor->getTailLengthSeconds();\r
-\r
-            if (tailSeconds == std::numeric_limits<double>::infinity())\r
-                result = std::numeric_limits<int32>::max();\r
-            else\r
-                result = static_cast<int32> (tailSeconds * sampleRate);\r
-\r
-            return result; // Vst2 expects an int32 upcasted to a intptr_t here\r
-        }\r
+            return (pointer_sized_int) (processor->getTailLengthSeconds() * sampleRate);\r
 \r
         return 0;\r
     }\r
@@ -2119,7 +2058,7 @@ private:
 \r
     pointer_sized_int handleGetVstInterfaceVersion (VstOpCodeArguments)\r
     {\r
-        return kVstVersion;\r
+        return juceVstInterfaceVersion;\r
     }\r
 \r
     pointer_sized_int handleGetCurrentMidiProgram (VstOpCodeArguments)\r
@@ -2129,8 +2068,8 @@ private:
 \r
     pointer_sized_int handleGetSpeakerConfiguration (VstOpCodeArguments args)\r
     {\r
-        auto** pluginInput  = reinterpret_cast<Vst2::VstSpeakerArrangement**> (args.value);\r
-        auto** pluginOutput = reinterpret_cast<Vst2::VstSpeakerArrangement**> (args.ptr);\r
+        auto** pluginInput  = reinterpret_cast<VstSpeakerConfiguration**> (args.value);\r
+        auto** pluginOutput = reinterpret_cast<VstSpeakerConfiguration**> (args.ptr);\r
 \r
         if (pluginHasSidechainsOrAuxs() || processor->isMidiEffect())\r
             return false;\r
@@ -2138,10 +2077,10 @@ private:
         auto inputLayout  = processor->getChannelLayoutOfBus (true,  0);\r
         auto outputLayout = processor->getChannelLayoutOfBus (false,  0);\r
 \r
-        auto speakerBaseSize = sizeof (Vst2::VstSpeakerArrangement) - (sizeof (Vst2::VstSpeakerProperties) * 8);\r
+        auto speakerBaseSize = sizeof (VstSpeakerConfiguration) - (sizeof (VstIndividualSpeakerInfo) * 8);\r
 \r
-        cachedInArrangement .malloc (speakerBaseSize + (static_cast<std::size_t> (inputLayout. size()) * sizeof (Vst2::VstSpeakerArrangement)), 1);\r
-        cachedOutArrangement.malloc (speakerBaseSize + (static_cast<std::size_t> (outputLayout.size()) * sizeof (Vst2::VstSpeakerArrangement)), 1);\r
+        cachedInArrangement .malloc (speakerBaseSize + (static_cast<std::size_t> (inputLayout. size()) * sizeof (VstSpeakerConfiguration)), 1);\r
+        cachedOutArrangement.malloc (speakerBaseSize + (static_cast<std::size_t> (outputLayout.size()) * sizeof (VstSpeakerConfiguration)), 1);\r
 \r
         *pluginInput  = cachedInArrangement. getData();\r
         *pluginOutput = cachedOutArrangement.getData();\r
@@ -2163,7 +2102,7 @@ private:
         {\r
             if (processor != nullptr)\r
             {\r
-                processor->setProcessingPrecision ((args.value == Vst2::kVstProcessPrecision64\r
+                processor->setProcessingPrecision ((args.value == vstProcessingSampleTypeDouble\r
                                                      && processor->supportsDoublePrecisionProcessing())\r
                                                          ? AudioProcessor::doublePrecision\r
                                                          : AudioProcessor::singlePrecision);\r
@@ -2177,22 +2116,21 @@ private:
 \r
     pointer_sized_int handleSetContentScaleFactor (float scale)\r
     {\r
-       #if ! JUCE_MAC\r
-        if (! approximatelyEqual (scale, editorScaleFactor))\r
+        if (editorScaleFactor != scale)\r
         {\r
             editorScaleFactor = scale;\r
 \r
+           #if ! (JUCE_MAC || JUCE_IOS)\r
             if (editorComp != nullptr)\r
-               #if JUCE_WINDOWS && ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
+            {\r
                 if (auto* ed = editorComp->getEditorComp())\r
-                    ed->setScaleFactor (scale);\r
-               #else\r
-                editorComp->updateWindowSize (true);\r
-               #endif\r
+                    ed->setScaleFactor (editorScaleFactor);\r
+\r
+                if (editorComp != nullptr)\r
+                    editorComp->updateWindowSize (true);\r
+            }\r
+           #endif\r
         }\r
-       #else\r
-        ignoreUnused (scale);\r
-       #endif\r
 \r
         return 1;\r
     }\r
@@ -2236,42 +2174,6 @@ private:
        #endif\r
     }\r
 \r
-    //==============================================================================\r
-    Vst2::audioMasterCallback hostCallback;\r
-    AudioProcessor* processor = {};\r
-    double sampleRate = 44100.0;\r
-    int32 blockSize = 1024;\r
-    Vst2::AEffect vstEffect;\r
-    juce::MemoryBlock chunkMemory;\r
-    juce::uint32 chunkMemoryTime = 0;\r
-    std::unique_ptr<EditorCompWrapper> editorComp;\r
-    Vst2::ERect editorBounds;\r
-    MidiBuffer midiEvents;\r
-    VSTMidiEventList outgoingEvents;\r
-\r
-   #if ! JUCE_MAC\r
-    float editorScaleFactor = 1.0f;\r
-   #endif\r
-\r
-    LegacyAudioParametersWrapper juceParameters;\r
-\r
-    bool isProcessing = false, isBypassed = false, hasShutdown = false;\r
-    bool firstProcessCallback = true, shouldDeleteEditor = false;\r
-\r
-   #if JUCE_64BIT\r
-    bool useNSView = true;\r
-   #else\r
-    bool useNSView = false;\r
-   #endif\r
-\r
-    VstTempBuffers<float> floatTempBuffers;\r
-    VstTempBuffers<double> doubleTempBuffers;\r
-    int maxNumInChannels = 0, maxNumOutChannels = 0;\r
-\r
-    HeapBlock<Vst2::VstSpeakerArrangement> cachedInArrangement, cachedOutArrangement;\r
-\r
-    ThreadLocalValue<bool> inParameterChangedCallback;\r
-\r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVSTWrapper)\r
 };\r
@@ -2280,7 +2182,7 @@ private:
 //==============================================================================\r
 namespace\r
 {\r
-    Vst2::AEffect* pluginEntryPoint (Vst2::audioMasterCallback audioMaster)\r
+    VstEffectInterface* pluginEntryPoint (VstHostCallback audioMaster)\r
     {\r
         JUCE_AUTORELEASEPOOL\r
         {\r
@@ -2288,7 +2190,7 @@ namespace
 \r
             try\r
             {\r
-                if (audioMaster (0, Vst2::audioMasterVersion, 0, 0, 0, 0) != 0)\r
+                if (audioMaster (0, hostOpcodeVstVersion, 0, 0, 0, 0) != 0)\r
                 {\r
                    #if JUCE_LINUX\r
                     MessageManagerLock mmLock;\r
@@ -2296,17 +2198,7 @@ namespace
 \r
                     auto* processor = createPluginFilterOfType (AudioProcessor::wrapperType_VST);\r
                     auto* wrapper = new JuceVSTWrapper (audioMaster, processor);\r
-                    auto* aEffect = wrapper->getAEffect();\r
-\r
-                    if (auto* callbackHandler = dynamic_cast<VSTCallbackHandler*> (processor))\r
-                    {\r
-                        callbackHandler->handleVstHostCallbackAvailable ([audioMaster, aEffect](int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt)\r
-                        {\r
-                            return audioMaster (aEffect, opcode, index, value, ptr, opt);\r
-                        });\r
-                    }\r
-\r
-                    return aEffect;\r
+                    return wrapper->getVstEffectInterface();\r
                 }\r
             }\r
             catch (...)\r
@@ -2325,8 +2217,8 @@ namespace
 // Mac startup code..\r
 #if JUCE_MAC\r
 \r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster);\r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster);\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster)\r
     {\r
         PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
 \r
@@ -2334,8 +2226,8 @@ namespace
         return pluginEntryPoint (audioMaster);\r
     }\r
 \r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster);\r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster)\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* main_macho (VstHostCallback audioMaster);\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* main_macho (VstHostCallback audioMaster)\r
     {\r
         PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
 \r
@@ -2347,8 +2239,8 @@ namespace
 // Linux startup code..\r
 #elif JUCE_LINUX\r
 \r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster);\r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster);\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster)\r
     {\r
         PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
 \r
@@ -2356,8 +2248,8 @@ namespace
         return pluginEntryPoint (audioMaster);\r
     }\r
 \r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster) asm ("main");\r
-    JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster)\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* main_plugin (VstHostCallback audioMaster) asm ("main");\r
+    JUCE_EXPORTED_FUNCTION VstEffectInterface* main_plugin (VstHostCallback audioMaster)\r
     {\r
         PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
 \r
@@ -2372,7 +2264,7 @@ namespace
 // Win32 startup code..\r
 #else\r
 \r
-    extern "C" __declspec (dllexport) Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
+    extern "C" __declspec (dllexport) VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster)\r
     {\r
         PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
 \r
@@ -2380,7 +2272,7 @@ namespace
     }\r
 \r
    #ifndef JUCE_64BIT // (can't compile this on win64, but it's not needed anyway with VST2.4)\r
-    extern "C" __declspec (dllexport) int main (Vst2::audioMasterCallback audioMaster)\r
+    extern "C" __declspec (dllexport) int main (VstHostCallback audioMaster)\r
     {\r
         PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
 \r
index 5d9aa4645d46922676fbd95304716db3712be51b..a58c7e0a9cbe7625366f73fb9a116770441cb1ef 100644 (file)
 #endif\r
 \r
 #if JUCE_VST3_CAN_REPLACE_VST2\r
-namespace Vst2\r
-{\r
-#include "pluginterfaces/vst2.x/vstfxstore.h"\r
-}\r
+#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"\r
 #endif\r
 \r
 #ifndef JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS\r
@@ -86,6 +83,7 @@ using namespace Steinberg;
 \r
   extern JUCE_API void* attachComponentToWindowRefVST (Component*, void* parentWindowOrView, bool isNSView);\r
   extern JUCE_API void detachComponentFromWindowRefVST (Component*, void* nsWindow, bool isNSView);\r
+  extern JUCE_API void setNativeHostWindowSizeVST (void* window, Component*, int newWidth, int newHeight, bool isNSView);\r
 #endif\r
 \r
 //==============================================================================\r
@@ -125,11 +123,6 @@ public:
         return getParamForVSTParamID (bypassParamID);\r
     }\r
 \r
-    static Vst::UnitID getUnitID (const AudioProcessorParameterGroup* group)\r
-    {\r
-        return group == nullptr ? Vst::kRootUnitId : group->getID().hashCode();\r
-    }\r
-\r
     int getNumParameters() const noexcept             { return vstParamIDs.size(); }\r
     bool isUsingManagedParameters() const noexcept    { return juceParameters.isUsingManagedParameters(); }\r
 \r
@@ -334,12 +327,10 @@ public:
     struct Param  : public Vst::Parameter\r
     {\r
         Param (JuceVST3EditController& editController, AudioProcessorParameter& p,\r
-               Vst::ParamID vstParamID, Vst::UnitID vstUnitID,\r
-               bool isBypassParameter, bool forceLegacyParamIDs)\r
+               Vst::ParamID vstParamID, bool isBypassParameter, bool forceLegacyParamIDs)\r
             : owner (editController), param (p)\r
         {\r
             info.id = vstParamID;\r
-            info.unitId = vstUnitID;\r
 \r
             toString128 (info.title,      param.getName (128));\r
             toString128 (info.shortTitle, param.getName (8));\r
@@ -355,6 +346,7 @@ public:
 \r
             info.defaultNormalizedValue = param.getDefaultValue();\r
             jassert (info.defaultNormalizedValue >= 0 && info.defaultNormalizedValue <= 1.0f);\r
+            info.unitId = Vst::kRootUnitId;\r
 \r
             // Is this a meter?\r
             if (((param.getCategory() & 0xffff0000) >> 16) == 2)\r
@@ -719,7 +711,6 @@ private:
 \r
     //==============================================================================\r
     Atomic<int> vst3IsPlaying { 0 };\r
-    float lastScaleFactorReceived = 1.0f;\r
 \r
     void setupParameters()\r
     {\r
@@ -746,10 +737,8 @@ private:
                 {\r
                     auto vstParamID = audioProcessor->getVSTParamIDForIndex (i);\r
                     auto* juceParam = audioProcessor->getParamForVSTParamID (vstParamID);\r
-                    auto* parameterGroup = pluginInstance->parameterTree.getGroupsForParameter (juceParam).getLast();\r
-                    auto unitID = JuceAudioProcessor::getUnitID (parameterGroup);\r
 \r
-                    parameters.addParameter (new Param (*this, *juceParam, vstParamID, unitID,\r
+                    parameters.addParameter (new Param (*this, *juceParam, vstParamID,\r
                                                         (vstParamID == audioProcessor->bypassParamID), forceLegacyParamIDs));\r
                 }\r
 \r
@@ -808,8 +797,6 @@ private:
           : Vst::EditorView (&ec, nullptr),\r
             owner (&ec), pluginInstance (p)\r
         {\r
-            editorScaleFactor = ec.lastScaleFactorReceived;\r
-\r
             component.reset (new ContentWrapperComponent (*this, p));\r
         }\r
 \r
@@ -854,10 +841,6 @@ private:
             macHostWindow = juce::attachComponentToWindowRefVST (component.get(), parent, isNSView);\r
            #endif\r
 \r
-           #if ! JUCE_MAC\r
-            setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) editorScaleFactor);\r
-           #endif\r
-\r
             component->resizeHostWindow();\r
             systemWindow = parent;\r
             attachedToParent();\r
@@ -897,15 +880,7 @@ private:
 \r
                 if (component != nullptr)\r
                 {\r
-                    auto w = rect.getWidth();\r
-                    auto h = rect.getHeight();\r
-\r
-                   #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                    w = roundToInt (w / editorScaleFactor);\r
-                    h = roundToInt (h / editorScaleFactor);\r
-                   #endif\r
-\r
-                    component->setSize (w, h);\r
+                    component->setSize (rect.getWidth(), rect.getHeight());\r
 \r
                     if (auto* peer = component->getPeer())\r
                         peer->updateBounds();\r
@@ -922,16 +897,7 @@ private:
         {\r
             if (size != nullptr && component != nullptr)\r
             {\r
-                auto w = component->getWidth();\r
-                auto h = component->getHeight();\r
-\r
-               #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                w = roundToInt (w * editorScaleFactor);\r
-                h = roundToInt (h * editorScaleFactor);\r
-               #endif\r
-\r
-                *size = ViewRect (0, 0, w, h);\r
-\r
+                *size = ViewRect (0, 0, component->getWidth(), component->getHeight());\r
                 return kResultTrue;\r
             }\r
 \r
@@ -953,36 +919,17 @@ private:
             {\r
                 if (auto* editor = component->pluginEditor.get())\r
                 {\r
-                   #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                    auto juceRect = editor->getLocalArea (component.get(),\r
-                                                          Rectangle<int>::leftTopRightBottom (rectToCheck->left, rectToCheck->top,\r
-                                                                                              rectToCheck->right, rectToCheck->bottom) / editorScaleFactor);\r
-                   #else\r
-                    auto juceRect = editor->getLocalArea (component.get(),\r
-                                                          { rectToCheck->left, rectToCheck->top, rectToCheck->right, rectToCheck->bottom });\r
-                   #endif\r
-\r
+                    // checkSizeConstraint\r
+                    auto juceRect = editor->getLocalArea (component.get(), Rectangle<int>::leftTopRightBottom (rectToCheck->left, rectToCheck->top,\r
+                                                                                                               rectToCheck->right, rectToCheck->bottom));\r
                     if (auto* constrainer = editor->getConstrainer())\r
                     {\r
                         Rectangle<int> limits (0, 0, constrainer->getMaximumWidth(), constrainer->getMaximumHeight());\r
-\r
-                        auto currentRect = editor->getBounds();\r
-\r
-                        constrainer->checkBounds (juceRect, currentRect, limits,\r
-                                                  juceRect.getY() != currentRect.getY() && juceRect.getBottom() == currentRect.getBottom(),\r
-                                                  juceRect.getX() != currentRect.getX() && juceRect.getRight()  == currentRect.getRight(),\r
-                                                  juceRect.getY() == currentRect.getY() && juceRect.getBottom() != currentRect.getBottom(),\r
-                                                  juceRect.getX() == currentRect.getX() && juceRect.getRight()  != currentRect.getRight());\r
+                        constrainer->checkBounds (juceRect, editor->getBounds(), limits, false, false, false, false);\r
 \r
                         juceRect = component->getLocalArea (editor, juceRect);\r
-\r
-                       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                        rectToCheck->right = rectToCheck->left + roundToInt (juceRect.getWidth() * editorScaleFactor);\r
-                        rectToCheck->bottom = rectToCheck->top + roundToInt (juceRect.getHeight() * editorScaleFactor);\r
-                       #else\r
-                        rectToCheck->right = rectToCheck->left + juceRect.getWidth();\r
-                        rectToCheck->bottom = rectToCheck->top + juceRect.getHeight();\r
-                       #endif\r
+                        rectToCheck->right  = rectToCheck->left + juceRect.getWidth();\r
+                        rectToCheck->bottom = rectToCheck->top  + juceRect.getHeight();\r
                     }\r
                 }\r
 \r
@@ -995,36 +942,17 @@ private:
 \r
         tresult PLUGIN_API setContentScaleFactor (Steinberg::IPlugViewContentScaleSupport::ScaleFactor factor) override\r
         {\r
-           #if ! JUCE_MAC\r
-            if (! approximatelyEqual ((float) factor, editorScaleFactor))\r
+           #if (JUCE_MAC || JUCE_IOS)\r
+            ignoreUnused (factor);\r
+           #else\r
+            if (auto* editor = component->pluginEditor.get())\r
             {\r
-                editorScaleFactor = (float) factor;\r
-\r
-                if (auto* o = owner.get())\r
-                    o->lastScaleFactorReceived = editorScaleFactor;\r
-\r
-                if (component == nullptr)\r
-                    return kResultFalse;\r
-\r
-               #if JUCE_WINDOWS && ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                if (auto* ed = component->pluginEditor.get())\r
-                    ed->setScaleFactor ((float) factor);\r
-               #endif\r
-\r
-                component->resizeHostWindow();\r
-\r
-                if (getHostType().isBitwigStudio())\r
-                {\r
-                    component->setTopLeftPosition (0, 0);\r
-                    component->repaint();\r
-                }\r
+                editor->setScaleFactor (factor);\r
+                return kResultTrue;\r
             }\r
+           #endif\r
 \r
-            return kResultTrue;\r
-           #else\r
-            ignoreUnused (factor);\r
             return kResultFalse;\r
-           #endif\r
         }\r
 \r
     private:\r
@@ -1041,8 +969,8 @@ private:
         struct ContentWrapperComponent  : public Component\r
         {\r
             ContentWrapperComponent (JuceVST3Editor& editor, AudioProcessor& plugin)\r
-                : pluginEditor (plugin.createEditorIfNeeded()),\r
-                  owner (editor)\r
+               : pluginEditor (plugin.createEditorIfNeeded()),\r
+                 owner (editor)\r
             {\r
                 setOpaque (true);\r
                 setBroughtToFrontOnMouseClick (true);\r
@@ -1104,27 +1032,10 @@ private:
                 }\r
             }\r
 \r
-           #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            void checkScaleFactorIsCorrect()\r
-            {\r
-                if (auto* peer = pluginEditor->getPeer())\r
-                {\r
-                    auto peerScaleFactor = (float) peer->getPlatformScaleFactor();\r
-\r
-                    if (! approximatelyEqual (peerScaleFactor, owner.editorScaleFactor))\r
-                        owner.setContentScaleFactor (peerScaleFactor);\r
-                }\r
-            }\r
-           #endif\r
-\r
             void resized() override\r
             {\r
                 if (pluginEditor != nullptr)\r
                 {\r
-                   #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                    checkScaleFactorIsCorrect();\r
-                   #endif\r
-\r
                     if (! isResizingParentToFitChild)\r
                     {\r
                         lastBounds = getLocalBounds();\r
@@ -1163,21 +1074,17 @@ private:
 \r
                    #if JUCE_WINDOWS\r
                     setSize (w, h);\r
+                   #else\r
+                    if (owner.macHostWindow != nullptr && ! (host.isWavelab() || host.isReaper() || host.isBitwigStudio()))\r
+                        juce::setNativeHostWindowSizeVST (owner.macHostWindow, this, w, h, owner.isNSView);\r
                    #endif\r
 \r
                     if (owner.plugFrame != nullptr)\r
                     {\r
-                       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                        w = roundToInt (w * owner.editorScaleFactor);\r
-                        h = roundToInt (h * owner.editorScaleFactor);\r
-                       #endif\r
-\r
                         ViewRect newSize (0, 0, w, h);\r
-\r
-                        {\r
-                            const ScopedValueSetter<bool> resizingParentSetter (isResizingParentToFitChild, true);\r
-                            owner.plugFrame->resizeView (&owner, &newSize);\r
-                        }\r
+                        isResizingParentToFitChild = true;\r
+                        owner.plugFrame->resizeView (&owner, &newSize);\r
+                        isResizingParentToFitChild = false;\r
 \r
                        #if JUCE_MAC\r
                         if (host.isWavelab() || host.isReaper())\r
@@ -1213,8 +1120,6 @@ private:
         bool isNSView = false;\r
        #endif\r
 \r
-        float editorScaleFactor = 1.0f;\r
-\r
        #if JUCE_WINDOWS\r
         WindowsHooks hooks;\r
        #endif\r
@@ -1268,8 +1173,6 @@ public:
         // and not AudioChannelSet::discreteChannels (2) etc.\r
         jassert (checkBusFormatsAreNotDiscrete());\r
 \r
-        parameterGroups = pluginInstance->parameterTree.getSubgroups (true);\r
-\r
         comPluginInstance = new JuceAudioProcessor (pluginInstance);\r
 \r
         zerostruct (processContext);\r
@@ -1537,16 +1440,16 @@ public:
 \r
     bool loadVST2CcnKBlock (const char* data, int size)\r
     {\r
-        auto bank = (const Vst2::fxBank*) data;\r
+        auto bank = (const vst2FxBank*) data;\r
 \r
-        jassert ('CcnK' == htonl (bank->chunkMagic));\r
-        jassert ('FBCh' == htonl (bank->fxMagic));\r
-        jassert (htonl (bank->version) == 1 || htonl (bank->version) == 2);\r
+        jassert ('CcnK' == htonl (bank->magic1));\r
+        jassert ('FBCh' == htonl (bank->magic2));\r
+        jassert (htonl (bank->version1) == 1 || htonl (bank->version1) == 2);\r
         jassert (JucePlugin_VSTUniqueID == htonl (bank->fxID));\r
 \r
-        setStateInformation (bank->content.data.chunk,\r
-                             jmin ((int) (size - (bank->content.data.chunk - data)),\r
-                                   (int) htonl (bank->content.data.size)));\r
+        setStateInformation (bank->chunk,\r
+                             jmin ((int) (size - (bank->chunk - data)),\r
+                                   (int) htonl (bank->chunkSize)));\r
         return true;\r
     }\r
 \r
@@ -1739,16 +1642,16 @@ public:
             return status;\r
 \r
         const int bankBlockSize = 160;\r
-        Vst2::fxBank bank;\r
+        vst2FxBank bank;\r
 \r
         zerostruct (bank);\r
-        bank.chunkMagic         = (int32) htonl ('CcnK');\r
-        bank.byteSize           = (int32) htonl (bankBlockSize - 8 + (unsigned int) mem.getSize());\r
-        bank.fxMagic            = (int32) htonl ('FBCh');\r
-        bank.version            = (int32) htonl (2);\r
-        bank.fxID               = (int32) htonl (JucePlugin_VSTUniqueID);\r
-        bank.fxVersion          = (int32) htonl (JucePlugin_VersionCode);\r
-        bank.content.data.size  = (int32) htonl ((unsigned int) mem.getSize());\r
+        bank.magic1         = (int32) htonl ('CcnK');\r
+        bank.size           = (int32) htonl (bankBlockSize - 8 + (unsigned int) mem.getSize());\r
+        bank.magic2         = (int32) htonl ('FBCh');\r
+        bank.version1       = (int32) htonl (2);\r
+        bank.fxID           = (int32) htonl (JucePlugin_VSTUniqueID);\r
+        bank.version2       = (int32) htonl (JucePlugin_VersionCode);\r
+        bank.chunkSize      = (int32) htonl ((unsigned int) mem.getSize());\r
 \r
         status = state->write (&bank, bankBlockSize);\r
 \r
@@ -1762,7 +1665,7 @@ public:
     //==============================================================================\r
     Steinberg::int32 PLUGIN_API getUnitCount() override\r
     {\r
-        return parameterGroups.size() + 1;\r
+        return 1;\r
     }\r
 \r
     tresult PLUGIN_API getUnitInfo (Steinberg::int32 unitIndex, Vst::UnitInfo& info) override\r
@@ -1778,17 +1681,7 @@ public:
             return kResultTrue;\r
         }\r
 \r
-        if (auto* group = parameterGroups[unitIndex - 1])\r
-        {\r
-            info.id             = JuceAudioProcessor::getUnitID (group);\r
-            info.parentUnitId   = JuceAudioProcessor::getUnitID (group->getParent());\r
-            info.programListId  = Vst::kNoProgramListId;\r
-\r
-            toString128 (info.name, group->getName());\r
-\r
-            return kResultTrue;\r
-        }\r
-\r
+        zerostruct (info);\r
         return kResultFalse;\r
     }\r
 \r
@@ -2140,9 +2033,6 @@ public:
         if (tailLengthSeconds <= 0.0 || processSetup.sampleRate <= 0.0)\r
             return Vst::kNoTail;\r
 \r
-        if (tailLengthSeconds == std::numeric_limits<double>::infinity())\r
-            return Vst::kInfiniteTail;\r
-\r
         return (Steinberg::uint32) roundToIntAccurate (tailLengthSeconds * processSetup.sampleRate);\r
     }\r
 \r
@@ -2272,6 +2162,43 @@ public:
     }\r
 \r
 private:\r
+    //==============================================================================\r
+    Atomic<int> refCount { 1 };\r
+\r
+    AudioProcessor* pluginInstance;\r
+    ComSmartPtr<Vst::IHostApplication> host;\r
+    ComSmartPtr<JuceAudioProcessor> comPluginInstance;\r
+    ComSmartPtr<JuceVST3EditController> juceVST3EditController;\r
+\r
+    /**\r
+        Since VST3 does not provide a way of knowing the buffer size and sample rate at any point,\r
+        this object needs to be copied on every call to process() to be up-to-date...\r
+    */\r
+    Vst::ProcessContext processContext;\r
+    Vst::ProcessSetup processSetup;\r
+\r
+    MidiBuffer midiBuffer;\r
+    Array<float*> channelListFloat;\r
+    Array<double*> channelListDouble;\r
+\r
+    AudioBuffer<float>  emptyBufferFloat;\r
+    AudioBuffer<double> emptyBufferDouble;\r
+\r
+   #if JucePlugin_WantsMidiInput\r
+    bool isMidiInputBusEnabled = true;\r
+   #else\r
+    bool isMidiInputBusEnabled = false;\r
+   #endif\r
+\r
+   #if JucePlugin_ProducesMidiOutput\r
+    bool isMidiOutputBusEnabled = true;\r
+   #else\r
+    bool isMidiOutputBusEnabled = false;\r
+   #endif\r
+\r
+    ScopedJuceInitialiser_GUI libraryInitialiser;\r
+    static const char* kJucePrivateDataIdentifier;\r
+\r
     //==============================================================================\r
     template <typename FloatType>\r
     void processAudio (Vst::ProcessData& data, Array<FloatType*>& channelList)\r
@@ -2483,51 +2410,9 @@ private:
 \r
         p.setRateAndBufferSizeDetails (sampleRate, bufferSize);\r
         p.prepareToPlay (sampleRate, bufferSize);\r
-\r
-        midiBuffer.ensureSize (2048);\r
-        midiBuffer.clear();\r
     }\r
 \r
     //==============================================================================\r
-    Atomic<int> refCount { 1 };\r
-\r
-    AudioProcessor* pluginInstance;\r
-    ComSmartPtr<Vst::IHostApplication> host;\r
-    ComSmartPtr<JuceAudioProcessor> comPluginInstance;\r
-    ComSmartPtr<JuceVST3EditController> juceVST3EditController;\r
-\r
-    /**\r
-        Since VST3 does not provide a way of knowing the buffer size and sample rate at any point,\r
-        this object needs to be copied on every call to process() to be up-to-date...\r
-    */\r
-    Vst::ProcessContext processContext;\r
-\r
-    Vst::ProcessSetup processSetup;\r
-\r
-    MidiBuffer midiBuffer;\r
-    Array<float*> channelListFloat;\r
-    Array<double*> channelListDouble;\r
-\r
-    AudioBuffer<float>  emptyBufferFloat;\r
-    AudioBuffer<double> emptyBufferDouble;\r
-\r
-   #if JucePlugin_WantsMidiInput\r
-    bool isMidiInputBusEnabled = true;\r
-   #else\r
-    bool isMidiInputBusEnabled = false;\r
-   #endif\r
-\r
-   #if JucePlugin_ProducesMidiOutput\r
-    bool isMidiOutputBusEnabled = true;\r
-   #else\r
-    bool isMidiOutputBusEnabled = false;\r
-   #endif\r
-\r
-    ScopedJuceInitialiser_GUI libraryInitialiser;\r
-    static const char* kJucePrivateDataIdentifier;\r
-\r
-    Array<const AudioProcessorParameterGroup*> parameterGroups;\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Component)\r
 };\r
 \r
@@ -2646,7 +2531,7 @@ bool shutdownModule()
 \r
 //==============================================================================\r
 /** This typedef represents VST3's createInstance() function signature */\r
-using CreateFunction = FUnknown* (*)(Vst::IHostApplication*);\r
+typedef FUnknown* (*CreateFunction) (Vst::IHostApplication*);\r
 \r
 static FUnknown* createComponentInstance (Vst::IHostApplication* host)\r
 {\r
index 720f7d279feefc83b95a35bc1f638a50d368a3e1..f2501da534e126e1fde932ff99ba56acc1faa04c 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_audio_plugin_client\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE audio plugin wrapper classes\r
   description:      Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins.\r
   website:          http://www.juce.com/juce\r
 #include <juce_audio_basics/juce_audio_basics.h>\r
 #include <juce_audio_processors/juce_audio_processors.h>\r
 \r
-/** Config: JUCE_VST3_CAN_REPLACE_VST2\r
-\r
-    Enable this if you want your VST3 plug-in to load and save VST2 compatible\r
-    state. This allows hosts to replace VST2 plug-ins with VST3 plug-ins. If\r
-    you change this option then your VST3 plug-in will be incompatible with\r
-    previous versions.\r
-*/\r
-#ifndef JUCE_VST3_CAN_REPLACE_VST2\r
- #define JUCE_VST3_CAN_REPLACE_VST2 1\r
-#endif\r
-\r
 /** Config: JUCE_FORCE_USE_LEGACY_PARAM_IDS\r
 \r
     Enable this if you want to force JUCE to use a continuous parameter\r
diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp
deleted file mode 100644 (file)
index c0b31a6..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#include "Unity/juce_Unity_Wrapper.cpp"\r
index b5278b1756f9d8932713662476e214530f4366f4..ca388ee5ce0b39a64b0668c34c29eb211cd394a3 100644 (file)
@@ -30,8 +30,7 @@
 #if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3 \\r
         || JucePlugin_Build_AU || JucePlugin_Build_AUv3 \\r
         ||JucePlugin_Build_RTAS || JucePlugin_Build_AAX \\r
-        || JucePlugin_Build_Standalone || JucePlugin_Build_LV2 \\r
-        || JucePlugin_Build_Unity)\r
+        || JucePlugin_Build_Standalone || JucePlugin_Build_LV2)\r
  #error "You need to enable at least one plugin format!"\r
 #endif\r
 \r
  #undef JucePlugin_Build_AAX\r
  #define JucePlugin_Build_AAX 0\r
 #endif\r
+\r
+//==============================================================================\r
+#if JucePlugin_Build_VST\r
+\r
+ #if JucePlugin_VersionCode < 0x010000   // Major < 0\r
+\r
+  #if (JucePlugin_VersionCode & 0x00FF00) > (9 * 0x100) // check if Minor number exceeeds 9\r
+   #warning When version has "major" = 0, VST2 has trouble displaying "minor" exceeding 9\r
+  #endif\r
+\r
+  #if (JucePlugin_VersionCode & 0xFF) > 9   // check if Bugfix number exceeeds 9\r
+   #warning When version has "major" = 0, VST2 has trouble displaying "bugfix" exceeding 9\r
+  #endif\r
+\r
+ #elif JucePlugin_VersionCode >= 0x650000   // Major >= 101\r
+\r
+  #if (JucePlugin_VersionCode & 0x00FF00) > (99 * 0x100) // check if Minor number exceeeds 99\r
+   #warning When version has "major" > 100, VST2 has trouble displaying "minor" exceeding 99\r
+  #endif\r
+\r
+  #if (JucePlugin_VersionCode & 0xFF) > 99  // check if Bugfix number exceeeds 99\r
+   #warning When version has "major" > 100, VST2 has trouble displaying "bugfix" exceeding 99\r
+  #endif\r
+\r
+ #endif // JucePlugin_VersionCode\r
+\r
+#endif // JucePlugin_Build_VST\r
index 8d7e4d2f378bed7f0abd30ebcd92af9b077038c0..602bf87cce0ef4712921af280c679c7dc0843285 100644 (file)
@@ -67,9 +67,7 @@ public:
         DigitalPerformer,           /**< Represents Digital Performer. */\r
         FinalCut,                   /**< Represents Apple Final Cut Pro. */\r
         FruityLoops,                /**< Represents Fruity Loops. */\r
-        JUCEPluginHost,             /**< Represents the JUCE AudioPluginHost */\r
         MagixSamplitude,            /**< Represents Magix Samplitude. */\r
-        MagixSequoia,               /**< Represents Magix Sequoia. */\r
         MergingPyramix,             /**< Represents Merging Pyramix. */\r
         MuseReceptorGeneric,        /**< Represents Muse Receptor. */\r
         Reaper,                     /**< Represents Cockos Reaper. */\r
@@ -129,8 +127,6 @@ public:
     bool isFruityLoops() const noexcept       { return type == FruityLoops; }\r
     /** Returns true if the host is Apple GarageBand. */\r
     bool isGarageBand() const noexcept        { return type == AppleGarageBand; }\r
-    /** Returns true if the host is the JUCE AudioPluginHost */\r
-    bool isJUCEPluginHost() const noexcept    { return type == JUCEPluginHost; }\r
     /** Returns true if the host is Apple Logic Pro. */\r
     bool isLogic() const noexcept             { return type == AppleLogic; }\r
     /** Returns true if the host is Apple MainStage. */\r
@@ -153,8 +149,6 @@ public:
     bool isSADiE() const noexcept             { return type == SADiE; }\r
     /** Returns true if the host is Magix Samplitude. */\r
     bool isSamplitude() const noexcept        { return type == MagixSamplitude; }\r
-    /** Returns true if the host is Magix Sequoia. */\r
-    bool isSequoia() const noexcept           { return type == MagixSequoia; }\r
     /** Returns true if the host is any version of Cakewalk Sonar. */\r
     bool isSonar() const noexcept             { return type == CakewalkSonar8 || type == CakewalkSonarGeneric; }\r
     /** Returns true if the host is Steinberg's VST3 Test Host. */\r
@@ -200,9 +194,7 @@ public:
             case DigitalPerformer:         return "DigitalPerformer";\r
             case FinalCut:                 return "Final Cut";\r
             case FruityLoops:              return "FruityLoops";\r
-            case JUCEPluginHost:           return "JUCE AudioPluginHost";\r
             case MagixSamplitude:          return "Magix Samplitude";\r
-            case MagixSequoia:             return "Magix Sequoia";\r
             case MergingPyramix:           return "Pyramix";\r
             case MuseReceptorGeneric:      return "Muse Receptor";\r
             case Reaper:                   return "Reaper";\r
@@ -317,8 +309,6 @@ private:
         if (hostFilename.containsIgnoreCase   ("Renoise"))           return Renoise;\r
         if (hostFilename.containsIgnoreCase   ("Resolve"))           return DaVinciResolve;\r
         if (hostFilename.startsWith           ("Bitwig"))            return BitwigStudio;\r
-        if (hostFilename.containsIgnoreCase   ("OsxFL"))             return FruityLoops;\r
-        if (hostFilename.containsIgnoreCase   ("AudioPluginHost"))   return JUCEPluginHost;\r
 \r
        #elif JUCE_WINDOWS\r
         if (hostFilename.containsIgnoreCase   ("Live 6."))           return AbletonLive6;\r
@@ -363,19 +353,16 @@ private:
         if (hostFilename.containsIgnoreCase   ("VST_Scanner"))       return VBVSTScanner;\r
         if (hostPath.containsIgnoreCase       ("Merging Technologies")) return MergingPyramix;\r
         if (hostFilename.startsWithIgnoreCase ("Sam"))               return MagixSamplitude;\r
-        if (hostFilename.startsWithIgnoreCase ("Sequoia"))           return MagixSequoia;\r
         if (hostFilename.containsIgnoreCase   ("Renoise"))           return Renoise;\r
         if (hostFilename.containsIgnoreCase   ("Resolve"))           return DaVinciResolve;\r
         if (hostPath.containsIgnoreCase       ("Bitwig Studio"))     return BitwigStudio;\r
         if (hostFilename.containsIgnoreCase   ("Sadie"))             return SADiE;\r
-        if (hostFilename.containsIgnoreCase   ("AudioPluginHost"))   return JUCEPluginHost;\r
 \r
        #elif JUCE_LINUX\r
         if (hostFilename.containsIgnoreCase   ("Ardour"))            return Ardour;\r
         if (hostFilename.startsWithIgnoreCase ("Waveform"))          return TracktionWaveform;\r
         if (hostFilename.containsIgnoreCase   ("Tracktion"))         return TracktionGeneric;\r
         if (hostFilename.startsWith           ("Bitwig"))            return BitwigStudio;\r
-        if (hostFilename.containsIgnoreCase   ("AudioPluginHost"))   return JUCEPluginHost;\r
 \r
        #elif JUCE_IOS\r
        #elif JUCE_ANDROID\r
index 9b5c214f06b846e171f1912c234c01df4feab8f7..831f9ec4b5a3d230a99507d63cf13ce2f8d8403a 100644 (file)
@@ -39,10 +39,6 @@ namespace juce
 \r
 AudioProcessor::WrapperType PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Undefined;\r
 \r
-#if JucePlugin_Build_Unity\r
- bool juce_isRunningInUnity()    { return PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_Unity; }\r
-#endif\r
-\r
 #ifndef JUCE_VST3_CAN_REPLACE_VST2\r
  #define JUCE_VST3_CAN_REPLACE_VST2 1\r
 #endif\r
index c16bafeeafbf83f501867859b7fa43f1918a2d77..ea5c5d9ab746561ed0add8f440ab414fc261d945 100644 (file)
@@ -39,10 +39,10 @@ namespace AudioPluginFormatHelpers
                 : instance (inInstance), error (inError), compCallback (inCompletion), owner (invoker)\r
             {}\r
 \r
-            void messageCallback() override     { compCallback->completionCallback (instance.release(), error); }\r
+            void messageCallback() override     { compCallback->completionCallback (instance, error); }\r
 \r
             //==============================================================================\r
-            std::unique_ptr<AudioPluginInstance> instance;\r
+            AudioPluginInstance* instance;\r
             String error;\r
             std::unique_ptr<AudioPluginFormat::InstantiationCompletionCallback> compCallback;\r
             std::unique_ptr<CallbackInvoker> owner;\r
@@ -199,7 +199,7 @@ void AudioPluginFormat::createPluginInstanceOnMessageThread (const PluginDescrip
                                                              AudioPluginFormat::InstantiationCompletionCallback* callback)\r
 {\r
     jassert (callback != nullptr);\r
-    JUCE_ASSERT_MESSAGE_THREAD\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
     //==============================================================================\r
 \r
index f154704a11dd9b25bcae36ed1e33ac751cd693e2..be7a2576373009bb83388712c11d8fd3e18a0c45 100644 (file)
@@ -151,14 +151,12 @@ protected:
 \r
     AudioPluginFormat() noexcept;\r
 \r
-    using PluginCreationCallback = void (*) (void*, AudioPluginInstance*, const String&);\r
-\r
     /** Implementors must override this function. This is guaranteed to be called on\r
         the message thread. You may call the callback on any thread.\r
     */\r
     virtual void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
                                        int initialBufferSize, void* userData,\r
-                                       PluginCreationCallback) = 0;\r
+                                       void (*callback) (void*, AudioPluginInstance*, const String&)) = 0;\r
 \r
     virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept = 0;\r
 \r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt
deleted file mode 100644 (file)
index c653a2e..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-This license applies only to files referencing this license,\r
-for other files of the Software Development Kit the respective embedded license text\r
-is applicable. The license can be found at: www.steinberg.net/sdklicenses_vst3\r
-\r
-This Software Development Kit is licensed under the terms of the Steinberg VST3 License,\r
-or alternatively under the terms of the General Public License (GPL) Version 3.\r
-You may use the Software Development Kit according to either of these licenses as it is\r
-most appropriate for your project on a case-by-case basis (commercial or not).\r
-\r
-a) Proprietary Steinberg VST3 License\r
-The Software Development Kit may not be distributed in parts or its entirety\r
-without prior written agreement by Steinberg Media Technologies GmbH.\r
-The SDK must not be used to re-engineer or manipulate any technology used\r
-in any Steinberg or Third-party application or software module,\r
-unless permitted by law.\r
-Neither the name of the Steinberg Media Technologies GmbH nor the names of its\r
-contributors may be used to endorse or promote products derived from this\r
-software without specific prior written permission.\r
-Before publishing a software under the proprietary license, you need to obtain a copy\r
-of the License Agreement signed by Steinberg Media Technologies GmbH.\r
-The Steinberg VST SDK License Agreement can be found at:\r
-www.steinberg.net/en/company/developers.html\r
-\r
-THE SDK IS PROVIDED BY STEINBERG MEDIA TECHNOLOGIES GMBH "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-IN NO EVENT SHALL STEINBERG MEDIA TECHNOLOGIES GMBH BE LIABLE FOR ANY DIRECT,\r
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-b) General Public License (GPL) Version 3\r
-Details of these licenses can be found at: www.gnu.org/licenses/gpl-3.0.html\r
-//----------------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/README.md b/modules/juce_audio_processors/format_types/VST3_SDK/README.md
deleted file mode 100644 (file)
index f208d87..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-# Welcome to VST SDK 3.6.9\r
-\r
-## Table Of Contents\r
-1. [The VST SDK package](#100)\r
-1. [System requirements](#200)\r
-1. [About VST Plug-ins in general](#300)\r
-1. [About VST 3](#400)\r
-1. [How to build VST 3](#How_to_build_VST_3)\r
-1. [License & Usage guidelines](#license_&_usage_guidelines)\r
-\r
-<div id='100'/>\r
-\r
-## The VST SDK package contains:\r
-- The VST 3 API\r
-- VST 3 Implementation Helper Classes\r
-- AAX, AU and VST 2 wrappers\r
-- VST 3 Plug-ins Examples\r
-\r
-The full VST 3 SDK is available [here!](https://www.steinberg.net/en/company/developers.html). It contains a VST 3 Plug-in Test Host Application/Validator.\r
-\r
-<div id='200'/>\r
-\r
-## System requirements\r
-\r
-Supported OS:\r
-\r
-- Microsoft Windows 7-10\r
-- Apple OSX 10.7-10.13\r
-- Apple iOS 8-9\r
-- Linux (Beta version)\r
-\r
-Supported IDE:\r
-- Visual Studio 2015/2017\r
-- minimum Xcode 7\r
-- Qt Creator\r
-\r
----\r
-<div id='300'/>\r
-\r
-## About VST Plug-ins in general\r
-A VST Plug-in is an audio processing component that is utilized within a host application. This host application provides the audio or/and event streams that are processed by the Plug-in's code. Generally speaking, a VST Plug-in can take a stream of audio data, apply a process to the audio, and return the result to the host application. A VST Plug-in performs its process normally using the processor of the computer. The audio stream is broken down into a series of blocks. The host supplies the blocks in sequence. The host and its current environment control the block-size. The VST Plug-in maintains the status of all its own parameters relating to the running process: The host does not maintain any information about what the Plug-in did with the last block of data it processed.\r
-\r
-From the host application's point of view, a VST Plug-in is a black box with an arbitrary number of inputs, outputs (Event (MIDI) or Audio), and associated parameters. The host needs no implicit knowledge of the Plug-in's process to be able to use it. The Plug-in process can use whatever parameters it wishes, internally to the process, but depending on the capabilities of the host, it can allow the changes to user parameters to be automated by the host.\r
-\r
-The source code of a VST Plug-in is platform independent, but the delivery system depends on the platform architecture:\r
-- On **Windows**, a VST Plug-in is a multi-threaded DLL (Dynamic Link Library).\r
-- On **Mac OS X**, a VST Plug-in is a Mach-O Bundle\r
-- On **Linux**, a VST Plug-in is a package\r
-\r
-To learn more about VST you can subscribe to the [VST Developer Forum](https://sdk.steinberg.net) - check the 3rd Party Developer Support section at [www.steinberg.net](http://www.steinberg.net). \r
\r
- ---\r
-<div id='400'/>\r
-\r
-## About VST 3\r
-VST 3 is a general rework of the long-serving VST Plug-in interface. It is not compatible with the older VST versions, but it includes some new features and possibilities. We have redesigned the API to make it not only far easier and more reliable for developers to work with, but have also provided completely new possibilities for Plug-ins. These include:\r
-\r
-### 1. Improved Performance with the Silence Flag \r
-Processing can optionally be applied to Plug-ins only when audio signals are present on their respective inputs, so VST 3 Plug-ins can apply their processing economically and only when it is needed. \r
-\r
-### 2. Multiple Dynamic I/Os \r
-VST 3 Plug-ins are no longer limited to a fixed number of inputs and outputs, and their I/O configuration can dynamically adapt to the channel configuration. Side-chains are also very easily realizable. This includes the possibility to deactivate unused buses after loading and even reactivate those when needed. This cleans up the mixer and further helps to reduce CPU load. \r
-\r
-### 3. Sample-accurate Automation \r
-VST 3 also features vastly improved parameter automation with sample accuracy and support for ramped automation data, allowing completely accurate and rapid parameter automation changes. \r
-\r
-### 4. Logical Parameter Organization \r
-The VST 3 Plug-in parameters are displayed in a tree structure. Parameters are grouped into sections which represent the structure of the Plug-in. Plug-ins can communicate their internal structure for the purpose of overview, but also for some associated functionality (eg. program-lists). \r
-\r
-### 5. Resizeable UI Editor \r
-VST 3 defines a way to allow resizing of the Plug-in editor by a user. \r
-\r
-### 6. Mouse Over Support \r
-The Host could ask the Plug-in which parameter is under the mouse. \r
-\r
-### 7. Context Menu Support\r
-VST 3 defines a way to allow the host to add its own entries in the Plug-in context menu of a specific parameter.\r
-\r
-### 8. Channel Context Information\r
-A VST 3 Plug-in could access some channel information where it is instantiated: name, color,...\r
-\r
-### 9. Note Expression \r
-VST 3 defines with Note Expression a new way of event controller editing. The Plug-in is able to break free from the limitations of MIDI controller events by providing access to new VST 3 controller events that circumvent the laws of MIDI and provide articulation information for each individual note (event) in a polyphonic arrangement according to its noteId. \r
-\r
-### 10. 3D Support\r
-VST 3 supports new speaker configurations like Ambisonic, Atmos, Auro 3D or 22.2.\r
-\r
-### 11. Factory Concept \r
-VST 3 Plug-in library could export multiple Plug-ins and in this way replaces the shell concept of VST 2 (kPlugCategShell).\r
-\r
-### 12. Support Remote control Representation\r
-VST 3 Plug-in can deliver a specific parameter mapping for remote controls like Nuage.\r
-\r
-### 13. Others\r
-While designing VST 3, we performed a careful analysis of the existing functionality of VST and rewrote the interfaces from scratch. In doing so, we focused a lot on providing clear interfaces and their documentation in order to avoid usage errors from the deepest possible layer.\r
-Some more features implemented specifically for developers include:\r
-- More stable technical Host/Plug-in environment\r
-- Advanced technical definition of the standard\r
-- Modular approach\r
-- Separation of UI and processing\r
-- Advanced Preset System\r
-- Multiple Plug-ins per Library\r
-- Test Host included\r
-- Automated Testing Environment\r
-- Validator (small command line Test Host) and Plug-in examples code included\r
-\r
----\r
-<div id='500'/>\r
-\r
-## How to build\r
-\r
-### Get the source code from GitHub\r
-<pre>git clone --recursive https://github.com/steinbergmedia/vst3sdk.git\r
-</pre>\r
-\r
-### Build the examples on Linux\r
-<pre>\r
-mkdir build\r
-cd build\r
-cmake ../vst3sdk\r
-make  (or alternatively cmake --build .)\r
-</pre>\r
-\r
-### Build the examples on macOS\r
-<pre>\r
-mkdir build\r
-cd build\r
-cmake -GXcode ../vst3sdk\r
-xcodebuild  (or alternatively cmake --build .)\r
-</pre>\r
-\r
-### Build the examples on Windows\r
-<pre>\r
-mkdir build\r
-cd build\r
-cmake.exe -G"Visual Studio 15 2017 Win64" ../vst3sdk\r
-msbuild.exe vstsdk.sln   (or alternatively cmake --build .)\r
-</pre>\r
-\r
-### Build using cmake-gui\r
-<pre>\r
-* start the cmake-gui Application\r
-* "Browse Source...": select the folder VST3_SDK\r
-* "Browse Build...": select a folder where the outputs (projects/...) will be created. Typically a folder named "build"\r
-* you can check the SMTG Options\r
-* Press "Configure"\r
-* Press "Generate" and the project will be created\r
-\r
-</pre>\r
----\r
-\r
-## License & Usage guidelines\r
-More details are found at [www.steinberg.net/sdklicenses_vst3](http://www.steinberg.net/sdklicenses_vst3)
\ No newline at end of file
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt
deleted file mode 100644 (file)
index 1f195a9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-// \r
-//   * Redistributions of source code must retain the above copyright notice, \r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation \r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this \r
-//     software without specific prior written permission.\r
-// \r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp
deleted file mode 100644 (file)
index bc91f76..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/baseidds.cpp\r
-// Created by  : Steinberg, 01/2008\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/base/istringresult.h"\r
-#include "pluginterfaces/base/ipersistent.h"\r
-\r
-\r
-namespace Steinberg {\r
-\r
-DEF_CLASS_IID (IString)\r
-DEF_CLASS_IID (IStringResult)\r
-\r
-DEF_CLASS_IID (IPersistent)\r
-DEF_CLASS_IID (IAttributes)\r
-DEF_CLASS_IID (IAttributes2)\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h
deleted file mode 100644 (file)
index 6d4f637..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/classfactoryhelpers.h\r
-// Created by  : Steinberg, 03/2017\r
-// Description : Class factory\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-//------------------------------------------------------------------------------\r
-// Helper Macros. Not intended for direct use.\r
-// Use:\r
-//     META_CLASS(className),\r
-//     META_CLASS_IFACE(className,Interface),\r
-//     META_CLASS_SINGLE(className,Interface)\r
-// instead.\r
-//------------------------------------------------------------------------------\r
-#define META_CREATE_FUNC(funcName) static FUnknown* funcName ()\r
-\r
-#define CLASS_CREATE_FUNC(className)                                               \\r
-       namespace Meta {                                                               \\r
-       META_CREATE_FUNC (make##className) { return (NEW className)->unknownCast (); } \\r
-       }\r
-\r
-#define SINGLE_CREATE_FUNC(className)                                                     \\r
-       namespace Meta {                                                                      \\r
-       META_CREATE_FUNC (make##className) { return className::instance ()->unknownCast (); } \\r
-       }\r
-\r
-#define _META_CLASS(className)                                                         \\r
-       namespace Meta {                                                                   \\r
-       static Steinberg::MetaClass meta##className ((#className), Meta::make##className); \\r
-       }\r
-\r
-#define _META_CLASS_IFACE(className, Interface)                                                  \\r
-       namespace Meta {                                                                             \\r
-       static Steinberg::MetaClass meta##Interface##className ((#className), Meta::make##className, \\r
-                                                               Interface##_iid);                    \\r
-       }\r
-\r
-/** TODO\r
- */\r
-#define META_CLASS(className)     \\r
-       CLASS_CREATE_FUNC (className) \\r
-       _META_CLASS (className)\r
-\r
-/** TODO\r
- */\r
-#define META_CLASS_IFACE(className, Interface) \\r
-       CLASS_CREATE_FUNC (className)              \\r
-       _META_CLASS_IFACE (className, Interface)\r
-\r
-/** TODO\r
- */\r
-#define META_CLASS_SINGLE(className, Interface) \\r
-       SINGLE_CREATE_FUNC (className)              \\r
-       _META_CLASS_IFACE (className, Interface)\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp
deleted file mode 100644 (file)
index 3e6dd85..0000000
+++ /dev/null
@@ -1,644 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fbuffer.cpp\r
-// Created by  : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fbuffer.h"\r
-#include "base/source/fstring.h"\r
-#include <stdlib.h>\r
-\r
-namespace Steinberg {\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer ()\r
-: buffer (0)\r
-, memSize (0)\r
-, fillSize (0)\r
-, delta (defaultDelta)\r
-{}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (uint32 s, uint8 initVal)\r
-: buffer (0)\r
-, memSize (s)\r
-, fillSize (0)\r
-, delta (defaultDelta)\r
-{\r
-       if (memSize == 0)\r
-               return;\r
-       buffer = (int8*)::malloc (memSize);\r
-       if (buffer)\r
-               memset (buffer, initVal, memSize);\r
-       else\r
-               memSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (uint32 s)\r
-: buffer (0)\r
-, memSize (s)\r
-, fillSize (0)\r
-, delta (defaultDelta)\r
-{\r
-       if (memSize == 0)\r
-               return;\r
-       buffer = (int8*)::malloc (memSize);\r
-       if (!buffer)\r
-               memSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (const void* b , uint32 s)\r
-: buffer (0)\r
-, memSize (s)\r
-, fillSize (s)\r
-, delta (defaultDelta)\r
-{\r
-       if (memSize == 0)\r
-               return;\r
-       buffer = (int8*)::malloc (memSize);\r
-       if (buffer)\r
-               memcpy (buffer, b, memSize);\r
-       else\r
-       {\r
-               memSize = 0;\r
-               fillSize = 0;\r
-       }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (const Buffer& bufferR)\r
-: buffer (0)\r
-, memSize (bufferR.memSize)\r
-, fillSize (bufferR.fillSize)\r
-, delta (bufferR.delta)\r
-{\r
-       if (memSize == 0)\r
-               return;\r
-\r
-       buffer = (int8*)::malloc (memSize);\r
-       if (buffer)\r
-               memcpy (buffer, bufferR.buffer, memSize);\r
-       else\r
-               memSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::~Buffer ()\r
-{\r
-       if (buffer)\r
-               ::free (buffer);\r
-       buffer = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::operator = (const Buffer& b2)\r
-{\r
-       if (&b2 != this)\r
-       {\r
-               setSize (b2.memSize);\r
-               if (b2.memSize > 0 && buffer)\r
-                       memcpy (buffer, b2.buffer, b2.memSize);\r
-               fillSize = b2.fillSize;\r
-               delta = b2.delta;\r
-       }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::operator == (const Buffer& b2)const\r
-{\r
-       if (&b2 == this)\r
-               return true;\r
-       if (b2.getSize () != getSize ())\r
-               return false;\r
-       return memcmp (this->int8Ptr (), b2.int8Ptr (), getSize ()) == 0 ? true : false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-uint32 Buffer::get (void* b, uint32 size)\r
-{\r
-       uint32 maxGet = memSize - fillSize;\r
-       if (size > maxGet)\r
-               size = maxGet;\r
-       if (size > 0)\r
-               memcpy (b, buffer + fillSize, size);\r
-       fillSize += size;\r
-       return size;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (char16 c)\r
-{\r
-       return put ((const void*)&c, sizeof (c));\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (uint8 byte)\r
-{\r
-       if (grow (fillSize + 1) == false)\r
-               return false;\r
-\r
-       buffer [fillSize++] = byte;\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (char c)\r
-{\r
-       if (grow (fillSize + 1) == false)\r
-               return false;\r
-\r
-       buffer [fillSize++] = c;\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (const void* toPut, uint32 s)\r
-{\r
-       if (!toPut)\r
-               return false;\r
-\r
-       if (grow (fillSize + s) == false)\r
-               return false;\r
-\r
-       memcpy (buffer + fillSize, toPut, s);\r
-       fillSize += s;\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (const String& str)\r
-{\r
-       return put ((const void*)str.text () , (str.length () + 1) * sizeof (tchar));\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::appendString8 (const char8* s)\r
-{\r
-       if (!s)\r
-               return false;\r
-\r
-       uint32 len = (uint32) strlen (s);\r
-       return put (s, len);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::appendString16 (const char16* s)\r
-{\r
-       if (!s)\r
-               return false;\r
-       ConstString str (s);\r
-       uint32 len = (uint32) str.length () * sizeof (char16);\r
-       return put (s, len);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString8 (const char8* s)\r
-{\r
-       if (!s)\r
-               return false;\r
-\r
-       uint32 len = (uint32) strlen (s);\r
-\r
-       if (len > 0)\r
-       {\r
-               shiftStart (len);\r
-               memcpy (buffer, s, len);\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString16 (const char16* s)\r
-{\r
-       if (!s)\r
-               return false;\r
-\r
-       ConstString str (s);\r
-       uint32 len = (uint32) str.length () * sizeof (char16);\r
-\r
-       if (len > 0)\r
-       {\r
-               shiftStart (len);\r
-               memcpy (buffer, s, len);\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString8 (char8 c)\r
-{\r
-       shiftStart (sizeof (char));\r
-       char* b = (char*)buffer;\r
-       b [0] = c;\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString16 (char16 c)\r
-{\r
-       shiftStart (sizeof (char16));\r
-       char16* b = (char16*)buffer;\r
-       b [0] = c;\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::copy (uint32 from, uint32 to, uint32 bytes)\r
-{\r
-       if (from + bytes > memSize || bytes == 0)\r
-               return false;\r
-\r
-       if (to + bytes > memSize)\r
-               setSize (to + bytes);\r
-\r
-       if (from + bytes > to && from < to)\r
-       {              // overlap\r
-               Buffer tmp (buffer + from, bytes);\r
-               memcpy (buffer + to, tmp, bytes);\r
-       }\r
-       else\r
-               memcpy (buffer + to, buffer + from, bytes);\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::makeHexString (String& result)\r
-{\r
-       unsigned char* data = uint8Ptr ();\r
-       uint32 bytes = getSize ();\r
-\r
-       if (data == 0 || bytes == 0)\r
-               return false;\r
-\r
-       char8* stringBuffer = (char8*)malloc ((bytes * 2) + 1);\r
-       if (!stringBuffer)\r
-               return false;\r
-\r
-       int32 count = 0;\r
-       while (bytes > 0)\r
-       {\r
-               unsigned char t1 = ((*data) >> 4) & 0x0F;\r
-               unsigned char t2 = (*data) & 0x0F;\r
-               if (t1 < 10)\r
-                       t1 += '0';\r
-               else\r
-                       t1 = t1 - 10 + 'A';\r
-               if (t2 < 10)\r
-                       t2 += '0';\r
-               else\r
-                       t2 = t2 - 10 + 'A';\r
-\r
-               stringBuffer [count++] = t1;\r
-               stringBuffer [count++] = t2;\r
-               data++;\r
-               bytes--;\r
-       }\r
-       stringBuffer [count] = 0;\r
-\r
-       result.take ((void*)stringBuffer, false);\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::fromHexString (const char8* string)\r
-{\r
-       flush ();\r
-       if (string == 0)\r
-               return false;\r
-\r
-       int32 len = strlen8 (string);\r
-       if (len == 0 || ((len & 1) == 1)/*odd number*/ )\r
-               return false;\r
-\r
-       setSize (len / 2);\r
-       unsigned char* data = uint8Ptr ();\r
-\r
-       bool upper = true;\r
-       int32 count = 0;\r
-       while (count < len)\r
-       {\r
-               char c = string [count];\r
-\r
-               unsigned char d = 0;\r
-               if (c >= '0' && c <= '9')               d += c - '0';\r
-               else if (c >= 'A' && c <= 'F')  d += c - 'A' + 10;\r
-               else if (c >= 'a' && c <= 'f')  d += c - 'a' + 10;\r
-               else return false; // no hex string\r
-\r
-               if (upper)\r
-                       data [count >> 1] = d << 4;\r
-               else\r
-                       data [count >> 1] += d;\r
-\r
-               upper = !upper;\r
-               count++;\r
-       }\r
-       setFillSize (len / 2);\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Buffer::set (uint8 value)\r
-{\r
-       if (buffer)\r
-               memset (buffer, value, memSize);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::setFillSize (uint32 c)\r
-{\r
-       if (c <= memSize)\r
-       {\r
-               fillSize = c;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::truncateToFillSize ()\r
-{\r
-       if (fillSize < memSize)\r
-               setSize (fillSize);\r
-\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::grow (uint32 newSize)\r
-{\r
-       if (newSize > memSize)\r
-       {\r
-               if (delta == 0)\r
-                       delta = defaultDelta;\r
-               uint32 s = ((newSize + delta - 1) / delta) * delta;\r
-               return setSize (s);\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Buffer::shiftAt (uint32 position, int32 amount)\r
-{\r
-       if (amount > 0)\r
-       {\r
-               if (grow (fillSize + amount))\r
-               {\r
-                       if (position < fillSize)\r
-                               memmove (buffer + amount + position, buffer + position, fillSize - position);\r
-\r
-                       fillSize += amount;\r
-               }\r
-       }\r
-       else if (amount < 0 && fillSize > 0)\r
-       {\r
-               uint32 toRemove = -amount;\r
-\r
-               if (toRemove < fillSize)\r
-               {\r
-                       if (position < fillSize)\r
-                               memmove (buffer + position, buffer + toRemove + position, fillSize - position - toRemove);\r
-                       fillSize -= toRemove;\r
-               }\r
-       }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::move (int32 amount, uint8 initVal)\r
-{\r
-       if (memSize == 0)\r
-               return;\r
-\r
-       if (amount > 0)\r
-       {\r
-               if ((uint32)amount < memSize)\r
-               {\r
-                       memmove (buffer + amount, buffer, memSize - amount);\r
-                       memset (buffer, initVal, amount);\r
-               }\r
-               else\r
-                       memset (buffer, initVal, memSize);\r
-       }\r
-       else\r
-       {\r
-               uint32 toRemove = -amount;\r
-               if (toRemove < memSize)\r
-               {\r
-                       memmove (buffer, buffer + toRemove, memSize - toRemove);\r
-                       memset (buffer + memSize - toRemove, initVal, toRemove);\r
-               }\r
-               else\r
-                       memset (buffer, initVal, memSize);\r
-       }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::setSize (uint32 newSize)\r
-{\r
-       if (memSize != newSize)\r
-       {\r
-               if (buffer)\r
-               {\r
-                       if (newSize > 0)\r
-                       {\r
-                               int8* newBuffer = (int8*) ::realloc (buffer, newSize);\r
-                               if (newBuffer == 0)\r
-                               {\r
-                                       newBuffer = (int8*)::malloc (newSize);\r
-                                       if (newBuffer)\r
-                                       {\r
-                                               uint32 tmp = newSize;\r
-                                               if (tmp > memSize)\r
-                                                       tmp = memSize;\r
-                                               memcpy (newBuffer, buffer, tmp);\r
-                                               ::free (buffer);\r
-                                               buffer = newBuffer;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ::free (buffer);\r
-                                               buffer = 0;\r
-                                       }\r
-                               }\r
-                               else\r
-                                       buffer = newBuffer;\r
-                       }\r
-                       else\r
-                       {\r
-                               ::free (buffer);\r
-                               buffer = 0;\r
-                       }\r
-               }\r
-               else\r
-                       buffer = (int8*)::malloc (newSize);\r
-\r
-               if (newSize > 0 && !buffer)\r
-                       memSize = 0;\r
-               else\r
-                       memSize = newSize;\r
-               if (fillSize > memSize)\r
-                       fillSize = memSize;\r
-       }\r
-\r
-       return (newSize > 0) == (buffer != 0);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::fillup (uint8 value)\r
-{\r
-       if (getFree () > 0)\r
-               memset (buffer + fillSize, value, getFree ());\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-int8* Buffer::operator + (uint32 i)\r
-{\r
-       if (i < memSize)\r
-               return buffer + i;\r
-       else\r
-       {\r
-               static int8 eof;\r
-               eof = 0;\r
-               return &eof;\r
-       }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::swap (int16 swapSize)\r
-{\r
-       return swap (buffer, memSize, swapSize);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::swap (void* buffer, uint32 bufferSize, int16 swapSize)\r
-{\r
-       if (swapSize != kSwap16 && swapSize != kSwap32 && swapSize != kSwap64)\r
-               return false;\r
-\r
-       if (swapSize == kSwap16)\r
-       {\r
-               for (uint32 count = 0 ; count < bufferSize ; count += 2)\r
-               {\r
-                       SWAP_16 ( * (((int16*)buffer) + count) );\r
-               }\r
-       }\r
-       else if (swapSize == kSwap32)\r
-       {\r
-               for (uint32 count = 0 ; count < bufferSize ; count += 4)\r
-               {\r
-                       SWAP_32 ( * (((int32*)buffer) + count) );\r
-               }\r
-       }\r
-       else if (swapSize == kSwap64)\r
-       {\r
-               for (uint32 count = 0 ; count < bufferSize ; count += 8)\r
-               {\r
-                       SWAP_64 ( * (((int64*)buffer) + count) );\r
-               }\r
-       }\r
-\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::take (Buffer& from)\r
-{\r
-       setSize (0);\r
-       memSize = from.memSize;\r
-       fillSize = from.fillSize;\r
-       buffer = from.buffer;\r
-       from.buffer = 0;\r
-       from.memSize = 0;\r
-       from.fillSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-int8* Buffer::pass ()\r
-{\r
-       int8* res = buffer;\r
-       buffer = 0;\r
-       memSize = 0;\r
-       fillSize = 0;\r
-       return res;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::toWideString (int32 sourceCodePage)\r
-{\r
-       if (getFillSize () > 0)\r
-       {\r
-               if (str8 () [getFillSize () - 1] != 0) // multiByteToWideString only works with 0-terminated strings\r
-                       endString8 ();\r
-\r
-               Buffer dest (getFillSize () * sizeof (char16));\r
-               int32 result = String::multiByteToWideString (dest.str16 (), buffer, dest.getFree () / sizeof (char16), sourceCodePage);\r
-               if (result > 0)\r
-               {\r
-                       dest.setFillSize ((result - 1) * sizeof (char16));\r
-                       take (dest);\r
-                       return true;\r
-               }\r
-               return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::toMultibyteString (int32 destCodePage)\r
-{\r
-       if (getFillSize () > 0)\r
-       {\r
-               int32 textLength = getFillSize () / sizeof (char16); // wideStringToMultiByte only works with 0-terminated strings\r
-               if (str16 () [textLength - 1] != 0)\r
-                       endString16 ();\r
-\r
-               Buffer dest (getFillSize ());\r
-               int32 result = String::wideStringToMultiByte (dest.str8 (), str16 (), dest.getFree (), destCodePage);\r
-               if (result > 0)\r
-               {\r
-                       dest.setFillSize (result - 1);\r
-                       take (dest);\r
-                       return true;\r
-               }\r
-               return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h
deleted file mode 100644 (file)
index ff81b50..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fbuffer.h\r
-// Created by  : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include <cstring>\r
-\r
-namespace Steinberg {\r
-class String;\r
-\r
-//------------------------------------------------------------------------\r
-/** Buffer.\r
-@ingroup adt\r
-\r
-A Buffer is an object-oriented wrapper for a piece of memory.\r
-It adds several utility functions, e.g. for managing the size of the Buffer,\r
-appending or prepending values or strings to it.\r
-Internally it uses the standard memory functions malloc(), free(), etc. */\r
-//------------------------------------------------------------------------\r
-class Buffer\r
-{\r
-public:\r
-//---------------------------------------------------------------------\r
-\r
-       /**     Default constructor, allocates no memory at all.\r
-       */\r
-       Buffer ();\r
-\r
-       /**     Constructor - creates a new Buffer with a given size and copies contents from optional memory pointer.\r
-       \param[in] b : optional memory pointer with the size of at least the given size\r
-       \param[in] size : the size of the new Buffer to be allocated, in bytes.\r
-       */\r
-       Buffer (const void* b, uint32 size);\r
-\r
-       /**     Constructor - creates a new Buffer with a given size and fills it all with a given value.\r
-       \param[in] size : the size of the new Buffer to be allocated, in bytes.\r
-       \param[in] initVal : the initial value the Buffer will be completely filled with\r
-       */\r
-       Buffer (uint32 size, uint8 initVal);\r
-\r
-       /**     Constructor - creates a new Buffer with a given size.\r
-       \param[in] size : the size of the new Buffer to be allocated, in bytes.\r
-       */\r
-       Buffer (uint32 size);\r
-\r
-       /**     Copy constructor - creates a new Buffer from a given Buffer.\r
-       \param[in] buff : the Buffer from which all memory will be copied to the new one\r
-       */\r
-       Buffer (const Buffer& buff);\r
-\r
-       /**     Destructor - deallocates the internal memory.\r
-       */\r
-       ~Buffer ();\r
-\r
-       /**     Assignment operator - copies contents from a given Buffer and increases the size if necessary.\r
-       \param[in] buff : the Buffer from which all memory will be copied\r
-       */\r
-       void operator = (const Buffer& buff);\r
-\r
-       /**     Comparison operator - copies contents from a given Buffer and increases the size if necessary.\r
-       \param[in] buff : the Buffer to be compared to\r
-       \return true, if the given Buffer's content is equal to this one, else false\r
-       */\r
-       bool operator == (const Buffer& buff)const;\r
-\r
-       uint32 getSize () const {return memSize;}               ///< \return the actual size of the Buffer's memory, in bytes.\r
-\r
-       /**     Sets a new size for this Buffer, keeping as much content as possible.\r
-       \param[in] newSize : the new size for the Buffer, in bytes, newSize maybe zero\r
-       \return true, if the new size could be adapted, else false\r
-       */\r
-       bool setSize (uint32 newSize);\r
-\r
-       /**     Increases the Buffer to the next block, block size given by delta.\r
-       \param[in] memSize : the new minimum size of the Buffer, newSize maybe zero\r
-       \return true, if the Buffer could be grown successfully, else false\r
-       */\r
-       bool grow (uint32 memSize);\r
-       bool setMaxSize (uint32 size) {return grow (size);}     ///< see \ref grow()\r
-\r
-       void fillup (uint8 initVal = 0);                                ///< set from fillSize to end\r
-       uint32 getFillSize ()const {return fillSize;}   ///< \return the actual fill size\r
-       bool setFillSize (uint32 c);                                    ///< sets a new fill size, does not change any memory\r
-       inline void flush () {setFillSize (0);}                 ///< sets fill size to zero\r
-       bool truncateToFillSize ();                                             ///< \return always true, truncates the size of the Buffer to the actual fill size\r
-\r
-       bool isFull () const { return (fillSize == memSize); }  ///< \return true, if all memory is filled up, else false\r
-       uint32 getFree () const { return (memSize - fillSize); }///< \return remaining memory\r
-\r
-       inline void shiftStart (int32 amount) {return shiftAt (0, amount);} ///< moves all memory by given amount, grows the Buffer if necessary\r
-       void shiftAt (uint32 position, int32 amount);                                           ///< moves memory starting at the given position\r
-       void move (int32 amount, uint8 initVal = 0);                                            ///< shifts memory at start without growing the buffer, so data is lost and initialized with init val\r
-\r
-       bool copy (uint32 from, uint32 to, uint32 bytes);       ///< copies a number of bytes from one position to another, the size may be adapted\r
-       uint32 get (void* b, uint32 size);                                      ///< copy to buffer from fillSize, and shift fillSize\r
-\r
-       void setDelta (uint32 d) {delta = d;}                           ///< define the block size by which the Buffer grows, see \ref grow()\r
-\r
-       bool put (uint8);                                                       ///< append value at end, grows Buffer if necessary\r
-       bool put (char16 c);                        ///< append value at end, grows Buffer if necessary\r
-       bool put (char c);                                                      ///< append value at end, grows Buffer if necessary\r
-       bool put (const void* , uint32 size);           ///< append bytes from a given buffer, grows Buffer if necessary\r
-       bool put (void* , uint32 size);                         ///< append bytes from a given buffer, grows Buffer if necessary\r
-       bool put (uint8* , uint32 size);                        ///< append bytes from a given buffer, grows Buffer if necessary\r
-       bool put (char8* , uint32 size);                        ///< append bytes from a given buffer, grows Buffer if necessary\r
-       bool put (const uint8* , uint32 size);          ///< append bytes from a given buffer, grows Buffer if necessary\r
-       bool put (const char8* , uint32 size);          ///< append bytes from a given buffer, grows Buffer if necessary\r
-       bool put (const String&);                                       ///< append String at end, grows Buffer if necessary\r
-\r
-       void set (uint8 value);         ///< fills complete Buffer with given value\r
-\r
-       // strings ----------------\r
-       bool appendString (const tchar* s);\r
-       bool appendString (tchar* s);\r
-       bool appendString (tchar c)                   { return put (c); }\r
-\r
-       bool appendString8 (const char8* s);\r
-       bool appendString16 (const char16* s);\r
-\r
-       bool appendString8 (char8* s)                 { return appendString8 ((const char8*)s); }\r
-       bool appendString8 (unsigned char* s)             { return appendString8 ((const char8*)s); }\r
-       bool appendString8 (const unsigned char* s)   { return appendString8 ((const char8*)s); }\r
-\r
-       bool appendString8 (char8 c)                  { return put ((uint8)c); }\r
-       bool appendString8 (unsigned char c)          { return put (c); }\r
-       bool appendString16 (char16 c)                { return put (c); }\r
-       bool appendString16 (char16* s)               { return appendString16 ((const char16*)s); }\r
-\r
-       bool prependString (const tchar* s);\r
-       bool prependString (tchar* s);\r
-       bool prependString (tchar c);\r
-\r
-       bool prependString8 (const char8* s);\r
-       bool prependString16 (const char16* s);\r
-\r
-       bool prependString8 (char8 c);\r
-       bool prependString8 (unsigned char c)         { return prependString8 ((char8)c); }\r
-       bool prependString8 (char8* s)                { return prependString8 ((const char8*)s); }\r
-       bool prependString8 (unsigned char* s)        { return prependString8((const char8*)s); }\r
-       bool prependString8 (const unsigned char* s)  { return prependString8 ((const char8*)s); }\r
-       bool prependString16 (char16 c);\r
-       bool prependString16 (char16* s)              { return prependString16 ((const char16*)s); }\r
-\r
-       bool operator+= (const char* s)               { return appendString8 (s); }\r
-       bool operator+= (char c)                      { return appendString8 (c); }\r
-       bool operator+= (const char16* s)             { return appendString16 (s); }\r
-       bool operator+= (char16 c)                    { return appendString16 (c); }\r
-\r
-       bool operator= (const char* s)                { flush (); return appendString8 (s); }\r
-       bool operator= (const char16* s)              { flush (); return appendString16 (s); }\r
-       bool operator= (char8 c)                      { flush (); return appendString8 (c); }\r
-       bool operator= (char16 c)                     { flush (); return appendString16 (c); }\r
-\r
-       void endString () {put (tchar (0));}\r
-       void endString8 () {put (char8 (0));}\r
-       void endString16 () {put (char16 (0));}\r
-\r
-       bool makeHexString (String& result);\r
-       bool fromHexString (const char8* string);\r
-\r
-       // conversion\r
-       operator void* () const { return (void*)buffer; }                               ///< conversion\r
-       inline tchar*   str ()   const {return (tchar*)buffer;}                 ///< conversion\r
-       inline char8*   str8 ()   const {return (char8*)buffer;}                ///< conversion\r
-       inline char16*  str16 ()   const {return (char16*)buffer;}              ///< conversion\r
-       inline int8*   int8Ptr ()   const {return (int8*)buffer;}               ///< conversion\r
-       inline uint8*  uint8Ptr ()  const {return (uint8*)buffer; }             ///< conversion\r
-       inline int16*  int16Ptr ()  const {return (int16*)buffer; }             ///< conversion\r
-    inline uint16* uint16Ptr () const {return (uint16*)buffer; }       ///< conversion\r
-       inline int32*  int32Ptr ()  const {return (int32*)buffer; }             ///< conversion\r
-       inline uint32* uint32Ptr () const {return (uint32*)buffer; }    ///< conversion\r
-       inline float*  floatPtr ()  const {return (float*)buffer; }             ///< conversion\r
-       inline double* doublePtr () const {return (double*)buffer; }    ///< conversion\r
-       inline char16*  wcharPtr ()  const {return (char16*)buffer;}    ///< conversion\r
-\r
-       int8* operator + (uint32 i);    ///< \return the internal Buffer's address plus the given offset i, zero if offset is out of range\r
-\r
-       int32 operator ! ()  { return buffer == 0; }\r
-\r
-       enum swapSize\r
-       {\r
-               kSwap16 = 2,\r
-               kSwap32 = 4,\r
-               kSwap64 = 8\r
-       };\r
-       bool swap (int16 swapSize);                                                                                     ///< swap all bytes of this Buffer by the given swapSize\r
-       static bool swap (void* buffer, uint32 bufferSize, int16 swapSize);     ///< utility, swap given number of bytes in given buffer by the given swapSize\r
-\r
-       void take (Buffer& from);       ///< takes another Buffer's memory, frees the current Buffer's memory\r
-       int8* pass ();                          ///< pass the current Buffer's memory\r
-\r
-       /**     Converts a Buffer's content to UTF-16 from a given multi-byte code page, Buffer must contain char8 of given encoding.\r
-               \param[in] sourceCodePage : the actual code page of the Buffer's content\r
-               \return true, if the conversion was successful, else false\r
-       */\r
-       virtual bool toWideString (int32 sourceCodePage); // Buffer contains char8 of given encoding -> utf16\r
-\r
-       /**     Converts a Buffer's content from UTF-16 to a given multi-byte code page, Buffer must contain UTF-16 encoded characters.\r
-               \param[in] destCodePage : the desired code page to convert the Buffer's content to\r
-               \return true, if the conversion was successful, else false\r
-       */\r
-       virtual bool toMultibyteString (int32 destCodePage); // Buffer contains utf16 -> char8 of given encoding\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       static const uint32 defaultDelta = 0x1000; // 0x1000\r
-\r
-       int8* buffer;\r
-       uint32 memSize;\r
-       uint32 fillSize;\r
-       uint32 delta;\r
-};\r
-\r
-inline bool Buffer::put (void* p, uint32 count)     { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (uint8 * p, uint32 count)   { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (char8* p, uint32 count)    { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (const uint8* p, uint32 count) { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (const char8* p, uint32 count) { return put ((const void*)p , count ); }\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::appendString (const tchar* s)\r
-{\r
-#ifdef UNICODE\r
-       return appendString16 (s);\r
-#else\r
-       return appendString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::appendString (tchar* s)\r
-{\r
-#ifdef UNICODE\r
-       return appendString16 (s);\r
-#else\r
-       return appendString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::prependString (const tchar* s)\r
-{\r
-#ifdef UNICODE\r
-       return prependString16 (s);\r
-#else\r
-       return prependString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::prependString (tchar* s)\r
-{\r
-#ifdef UNICODE\r
-       return prependString16 (s);\r
-#else\r
-       return prependString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::prependString (tchar c)\r
-{\r
-#ifdef UNICODE\r
-       return prependString16 (c);\r
-#else\r
-       return prependString8 (c);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp
deleted file mode 100644 (file)
index 649375e..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fdebug.cpp\r
-// Created by  : Steinberg, 1995\r
-// Description : There are 2 levels of debugging messages:\r
-//                  DEVELOPMENT               During development\r
-//                  RELEASE                   Program is shipping.\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fdebug.h"\r
-\r
-#if DEVELOPMENT\r
-\r
-#include <assert.h>\r
-#include <cstdarg>\r
-#include <cstdio>\r
-\r
-#if SMTG_OS_WINDOWS\r
-#ifndef _WIN32_WINNT\r
-#define _WIN32_WINNT 0x0400\r
-#endif\r
-#include <intrin.h>\r
-#include <windows.h>\r
-#define vsnprintf _vsnprintf\r
-#define snprintf _snprintf\r
-\r
-#elif SMTG_OS_MACOS\r
-#include <errno.h>\r
-#include <mach/mach_init.h>\r
-#include <mach/mach_time.h>\r
-#include <new>\r
-#include <signal.h>\r
-#include <stdbool.h>\r
-#include <sys/sysctl.h>\r
-#include <sys/types.h>\r
-#include <unistd.h>\r
-\r
-static bool AmIBeingDebugged (void);\r
-\r
-#define THREAD_ALLOC_WATCH 0 // check allocations on specific threads\r
-\r
-#if THREAD_ALLOC_WATCH\r
-mach_port_t watchThreadID = 0;\r
-#endif\r
-\r
-#endif\r
-\r
-AssertionHandler gAssertionHandler = nullptr;\r
-AssertionHandler gPreAssertionHook = nullptr;\r
-DebugPrintLogger gDebugPrintLogger = nullptr;\r
-\r
-namespace boost {\r
-// Define the boost assertion handler to redirect to our assertion handler,\r
-// otherwise it just calls abort(). Note that we don't need to include any boost\r
-// headers for this, it just provides the handler.\r
-void assertion_failed (char const* expr, char const* function, char const* file, long line)\r
-{\r
-#if DEVELOPMENT\r
-       char message[512];\r
-       snprintf (message, 512, "%s at %s, %s:%ld", expr, function, file, line);\r
-       if (gAssertionHandler)\r
-       {\r
-               FDebugBreak (message);\r
-       }\r
-       else\r
-       {\r
-               assert (!(const char *)message);\r
-       }\r
-#endif\r
-}\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-static const int kDebugPrintfBufferSize = 10000;\r
-static bool neverDebugger = false; // so I can switch it off in the debugger...\r
-\r
-//--------------------------------------------------------------------------\r
-static void printDebugString (const char* string)\r
-{\r
-       if (!string)\r
-               return;\r
-\r
-       if (gDebugPrintLogger)\r
-       {\r
-               gDebugPrintLogger (string);\r
-       }\r
-       else\r
-       {\r
-#if SMTG_OS_MACOS\r
-               fprintf (stderr, "%s", string);\r
-#elif SMTG_OS_WINDOWS\r
-               OutputDebugStringA (string);\r
-#endif\r
-       }\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-//     printf style debugging output\r
-//--------------------------------------------------------------------------\r
-void FDebugPrint (const char* format, ...)\r
-{\r
-       char string[kDebugPrintfBufferSize];\r
-       va_list marker;\r
-       va_start (marker, format);\r
-       vsnprintf (string, kDebugPrintfBufferSize, format, marker);\r
-\r
-       printDebugString (string);\r
-}\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define AmIBeingDebugged IsDebuggerPresent\r
-#endif\r
-\r
-#if SMTG_OS_LINUX\r
-#include <signal.h>\r
-#include <sys/types.h>\r
-#include <unistd.h>\r
-//--------------------------------------------------------------------------\r
-static inline bool AmIBeingDebugged ()\r
-{\r
-       // TODO: check if GDB or LLDB is attached\r
-       return true;\r
-}\r
-#endif\r
-\r
-//--------------------------------------------------------------------------\r
-//     printf style debugging output\r
-//--------------------------------------------------------------------------\r
-void FDebugBreak (const char* format, ...)\r
-{\r
-       char string[kDebugPrintfBufferSize];\r
-       va_list marker;\r
-       va_start (marker, format);\r
-       vsnprintf (string, kDebugPrintfBufferSize, format, marker);\r
-\r
-       printDebugString (string);\r
-\r
-       // The Pre-assertion hook is always called, even if we're not running in the debugger,\r
-       // so that we can log asserts without displaying them\r
-       if (gPreAssertionHook)\r
-       {\r
-               gPreAssertionHook (string);\r
-       }\r
-\r
-       if (neverDebugger)\r
-               return;\r
-       if (AmIBeingDebugged ())\r
-       {\r
-               // do not crash if no debugger present\r
-               // If there  is an assertion handler defined then let this override the UI\r
-               // and tell us whether we want to break into the debugger\r
-               bool breakIntoDebugger = true;\r
-               if (gAssertionHandler && gAssertionHandler (string) == false)\r
-               {\r
-                       breakIntoDebugger = false;\r
-               }\r
-\r
-               if (breakIntoDebugger)\r
-               {\r
-#if SMTG_OS_WINDOWS\r
-                       __debugbreak (); // intrinsic version of DebugBreak()\r
-#elif __ppc64__ || __ppc__ || __arm__\r
-                       kill (getpid (), SIGINT);\r
-#elif __i386__ || __x86_64__\r
-                       {\r
-                               __asm__ volatile ("int3");\r
-                       }\r
-#endif\r
-               }\r
-       }\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-void FPrintLastError (const char* file, int line)\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       LPVOID lpMessageBuffer;\r
-       FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,\r
-                       GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
-                       (LPSTR)&lpMessageBuffer, 0, NULL);\r
-       FDebugPrint ("%s(%d) : %s\n", file, line, lpMessageBuffer);\r
-       LocalFree (lpMessageBuffer);\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-#if !__MACH__\r
-       extern int errno;\r
-#endif\r
-       FDebugPrint ("%s(%d) : Errno %d\n", file, line, errno);\r
-#endif\r
-}\r
-\r
-#if SMTG_OS_MACOS\r
-\r
-//------------------------------------------------------------------------\r
-void* operator new (size_t size, int, const char* file, int line)\r
-{\r
-#if THREAD_ALLOC_WATCH\r
-       mach_port_t threadID = mach_thread_self ();\r
-       if (watchThreadID == threadID)\r
-       {\r
-               FDebugPrint ("Watched Thread Allocation : %s (Line:%d)\n", file ? file : "Unknown", line);\r
-       }\r
-#endif\r
-       try\r
-       {\r
-               return ::operator new (size);\r
-       }\r
-       catch (std::bad_alloc exception)\r
-       {\r
-               FDebugPrint ("bad_alloc exception : %s (Line:%d)", file ? file : "Unknown", line);\r
-       }\r
-       return (void*)-1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void* operator new[] (size_t size, int, const char* file, int line)\r
-{\r
-#if THREAD_ALLOC_WATCH\r
-       mach_port_t threadID = mach_thread_self ();\r
-       if (watchThreadID == threadID)\r
-       {\r
-               FDebugPrint ("Watched Thread Allocation : %s (Line:%d)\n", file ? file : "Unknown", line);\r
-       }\r
-#endif\r
-       try\r
-       {\r
-               return ::operator new[] (size);\r
-       }\r
-       catch (std::bad_alloc exception)\r
-       {\r
-               FDebugPrint ("bad_alloc exception : %s (Line:%d)", file ? file : "Unknown", line);\r
-       }\r
-       return (void*)-1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void operator delete (void* p, int, const char* file, int line)\r
-{\r
-       ::operator delete (p);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void operator delete[] (void* p, int, const char* file, int line)\r
-{\r
-       ::operator delete[] (p);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// from Technical Q&A QA1361 (http://developer.apple.com/qa/qa2004/qa1361.html)\r
-//------------------------------------------------------------------------\r
-bool AmIBeingDebugged (void)\r
-// Returns true if the current process is being debugged (either\r
-// running under the debugger or has a debugger attached post facto).\r
-{\r
-       int mib[4];\r
-       struct kinfo_proc info;\r
-       size_t size;\r
-\r
-       // Initialize the flags so that, if sysctl fails for some bizarre\r
-       // reason, we get a predictable result.\r
-\r
-       info.kp_proc.p_flag = 0;\r
-\r
-       // Initialize mib, which tells sysctl the info we want, in this case\r
-       // we're looking for information about a specific process ID.\r
-\r
-       mib[0] = CTL_KERN;\r
-       mib[1] = KERN_PROC;\r
-       mib[2] = KERN_PROC_PID;\r
-       mib[3] = getpid ();\r
-\r
-       // Call sysctl.\r
-\r
-       size = sizeof (info);\r
-       sysctl (mib, sizeof (mib) / sizeof (*mib), &info, &size, NULL, 0);\r
-\r
-       // We're being debugged if the P_TRACED flag is set.\r
-       return ((info.kp_proc.p_flag & P_TRACED) != 0);\r
-}\r
-\r
-#endif // SMTG_OS_MACOS\r
-\r
-#endif // DEVELOPMENT\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h
deleted file mode 100644 (file)
index f2b9805..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fdebug.h\r
-// Created by  : Steinberg, 1995\r
-// Description : There are 2 levels of debugging messages:\r
-//                  DEVELOPMENT               During development\r
-//                  RELEASE                   Program is shipping.\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-//-----------------------------------------------------------------------------\r
-/** @file base/source/fdebug.h\r
-       Debugging tools.\r
-\r
-       There are 2 levels of debugging messages:\r
-       - DEVELOPMENT\r
-         - During development\r
-       - RELEASE\r
-         - Program is shipping.\r
-*/\r
-//-----------------------------------------------------------------------------\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include <string.h>\r
-\r
-#if SMTG_OS_MACOS\r
-#include <new>\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-// development / release\r
-//-----------------------------------------------------------------------------\r
-#if !defined (DEVELOPMENT) && !defined (RELEASE)\r
-       #ifdef _DEBUG\r
-               #define DEVELOPMENT 1\r
-       #elif defined (NDEBUG)\r
-               #define RELEASE 1\r
-       #else\r
-               #error DEVELOPMENT, RELEASE, _DEBUG, or NDEBUG  must be defined!\r
-       #endif\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-#if SMTG_OS_WINDOWS\r
-\r
-/** Disable compiler warning:\r
- * C4291: "No matching operator delete found; memory will not be freed if initialization throws an\r
- * exception. A placement new is used for which there is no placement delete." */\r
-#if DEVELOPMENT && defined(_MSC_VER)\r
-#pragma warning(disable : 4291)\r
-#pragma warning(disable : 4985)\r
-#endif\r
-\r
-#endif // SMTG_OS_WINDOWS\r
-\r
-#if DEVELOPMENT\r
-//-----------------------------------------------------------------------------\r
-/** If "f" is not true and a debugger is present, send an error string to the debugger for display\r
-   and cause a breakpoint exception to occur in the current process. SMTG_ASSERT is removed\r
-   completely in RELEASE configuration. So do not pass methods calls to this macro that are expected\r
-   to exist in the RELEASE build (for method calls that need to be present in a RELEASE build, use\r
-   the VERIFY macros instead)*/\r
-#define SMTG_ASSERT(f) \\r
-       if (!(f))          \\r
-               FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f);\r
-\r
-/** Send "comment" string to the debugger for display. */\r
-#define SMTG_WARNING(comment) FDebugPrint ("%s(%d) : %s\n", __FILE__, __LINE__, comment);\r
-\r
-/** Send the last error string to the debugger for display. */\r
-#define SMTG_PRINTSYSERROR FPrintLastError (__FILE__, __LINE__);\r
-\r
-/** If a debugger is present, send string "s" to the debugger for display and\r
-    cause a breakpoint exception to occur in the current process. */\r
-#define SMTG_DEBUGSTR(s) FDebugBreak (s);\r
-\r
-/** Use VERIFY for calling methods "f" having a bool result (expecting them to return 'true')\r
-     The call of "f" is not removed in RELEASE builds, only the result verification. eg: SMTG_VERIFY\r
-   (isValid ()) */\r
-#define SMTG_VERIFY(f) SMTG_ASSERT (f)\r
-\r
-/** Use VERIFY_IS for calling methods "f" and expect a certain result "r".\r
-    The call of "f" is not removed in RELEASE builds, only the result verification. eg:\r
-   SMTG_VERIFY_IS (callMethod (), kResultOK) */\r
-#define SMTG_VERIFY_IS(f, r) \\r
-       if ((f) != (r))          \\r
-               FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f);\r
-\r
-/** Use VERIFY_NOT for calling methods "f" and expect the result to be anything else but "r".\r
-     The call of "f" is not removed in RELEASE builds, only the result verification. eg:\r
-   SMTG_VERIFY_NOT (callMethod (), kResultError) */\r
-#define SMTG_VERIFY_NOT(f, r) \\r
-       if ((f) == (r))           \\r
-               FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f);\r
-\r
-/** @name Shortcut macros for sending strings to the debugger for display.\r
-       First parameter is always the format string (printf like).\r
-*/\r
-\r
-///@{\r
-#define DBPRT0(a) FDebugPrint (a);\r
-#define DBPRT1(a, b) FDebugPrint (a, b);\r
-#define DBPRT2(a, b, c) FDebugPrint (a, b, c);\r
-#define DBPRT3(a, b, c, d) FDebugPrint (a, b, c, d);\r
-#define DBPRT4(a, b, c, d, e) FDebugPrint (a, b, c, d, e);\r
-#define DBPRT5(a, b, c, d, e, f) FDebugPrint (a, b, c, d, e, f);\r
-///@}\r
-\r
-/** @name Helper functions for the above defined macros.\r
-\r
-    You shouldn't use them directly (if you do so, don't forget "#if DEVELOPMENT")!\r
-    It is recommended to use the macros instead.\r
-*/\r
-///@{\r
-void FDebugPrint (const char* format, ...);\r
-void FDebugBreak (const char* format, ...);\r
-void FPrintLastError (const char* file, int line);\r
-///@}\r
-\r
-/** @name Provide a custom assertion handler and debug print handler, eg\r
-        so that we can provide an assert with a custom dialog, or redirect\r
-        the debug output to a file or stream.\r
-*/\r
-///@{\r
-typedef bool (*AssertionHandler) (const char* message);\r
-extern AssertionHandler gAssertionHandler;\r
-extern AssertionHandler gPreAssertionHook;\r
-typedef void (*DebugPrintLogger) (const char* message);\r
-extern DebugPrintLogger gDebugPrintLogger;\r
-///@}\r
-\r
-/** Definition of memory allocation macros:\r
-    Use "NEW" to allocate storage for individual objects.\r
-    Use "NEWVEC" to allocate storage for an array of objects. */\r
-#if SMTG_OS_MACOS\r
-void* operator new (size_t, int, const char*, int);\r
-void* operator new[] (size_t, int, const char*, int);\r
-void operator delete (void* p, int, const char* file, int line);\r
-void operator delete[] (void* p, int, const char* file, int line);\r
-#ifndef NEW\r
-#define NEW new (1, __FILE__, __LINE__)\r
-#define NEWVEC new (1, __FILE__, __LINE__)\r
-#endif\r
-\r
-#define DEBUG_NEW DEBUG_NEW_LEAKS\r
-\r
-#elif SMTG_OS_WINDOWS && defined(_MSC_VER)\r
-#ifndef NEW\r
-void* operator new (size_t, int, const char*, int);\r
-#define NEW new (1, __FILE__, __LINE__)\r
-#define NEWVEC new (1, __FILE__, __LINE__)\r
-#endif\r
-\r
-#else\r
-#ifndef NEW\r
-#define NEW new\r
-#define NEWVEC new\r
-#endif\r
-#endif\r
-\r
-#else\r
-/** if DEVELOPMENT is not set, these macros will do nothing. */\r
-#define SMTG_ASSERT(f)\r
-#define SMTG_WARNING(s)\r
-#define SMTG_PRINTSYSERROR\r
-#define SMTG_DEBUGSTR(s)\r
-#define SMTG_VERIFY(f) f;\r
-#define SMTG_VERIFY_IS(f, r) f;\r
-#define SMTG_VERIFY_NOT(f, r) f;\r
-\r
-#define DBPRT0(a)\r
-#define DBPRT1(a, b)\r
-#define DBPRT2(a, b, c)\r
-#define DBPRT3(a, b, c, d)\r
-#define DBPRT4(a, b, c, d, e)\r
-#define DBPRT5(a, b, c, d, e, f)\r
-\r
-#ifndef NEW\r
-#define NEW new\r
-#define NEWVEC new\r
-\r
-#endif\r
-#endif\r
-\r
-#if SMTG_CPPUNIT_TESTING\r
-#define SMTG_IS_TEST true\r
-#else\r
-#define SMTG_IS_TEST false\r
-#endif\r
-\r
-#if !SMTG_RENAME_ASSERT\r
-#if SMTG_OS_WINDOWS\r
-#undef ASSERT\r
-#endif\r
-\r
-#define ASSERT                         SMTG_ASSERT\r
-#define WARNING                                SMTG_WARNING\r
-#define DEBUGSTR                       SMTG_DEBUGSTR\r
-#define VERIFY                         SMTG_VERIFY\r
-#define VERIFY_IS                      SMTG_VERIFY_IS\r
-#define VERIFY_NOT                     SMTG_VERIFY_NOT\r
-#define PRINTSYSERROR          SMTG_PRINTSYSERROR\r
-#endif\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp
deleted file mode 100644 (file)
index 89240b7..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fobject.cpp\r
-// Created by  : Steinberg, 2008\r
-// Description : Basic Object implementing FUnknown\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fobject.h"\r
-#include "base/thread/include/flock.h"\r
-\r
-#include <vector>\r
-\r
-namespace Steinberg {\r
-\r
-IUpdateHandler* FObject::gUpdateHandler = 0;\r
-\r
-//------------------------------------------------------------------------\r
-const FUID FObject::iid;\r
-\r
-//------------------------------------------------------------------------\r
-struct FObjectIIDInitializer\r
-{\r
-       // the object iid is always generated so that different components\r
-       // only can cast to their own objects\r
-       // this initializer must be after the definition of FObject::iid, otherwise\r
-       //  the default constructor of FUID will clear the generated iid\r
-       FObjectIIDInitializer ()\r
-       {\r
-               const_cast<FUID&> (FObject::iid).generate ();\r
-       }\r
-} gFObjectIidInitializer;\r
-\r
-//------------------------------------------------------------------------\r
-uint32 PLUGIN_API FObject::addRef ()\r
-{\r
-       return FUnknownPrivate::atomicAdd (refCount, 1);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 PLUGIN_API FObject::release ()\r
-{\r
-       if (FUnknownPrivate::atomicAdd (refCount, -1) == 0)\r
-       {\r
-               refCount = -1000;\r
-               delete this;\r
-               return 0;\r
-       }\r
-       return refCount;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FObject::queryInterface (const TUID _iid, void** obj)\r
-{\r
-       QUERY_INTERFACE (_iid, obj, FUnknown::iid, FUnknown)\r
-       QUERY_INTERFACE (_iid, obj, IDependent::iid, IDependent)\r
-       QUERY_INTERFACE (_iid, obj, FObject::iid, FObject)\r
-       *obj = 0;\r
-       return kNoInterface;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::addDependent (IDependent* dep)\r
-{\r
-       if (gUpdateHandler)\r
-               gUpdateHandler->addDependent (unknownCast (), dep);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::removeDependent (IDependent* dep)\r
-{\r
-       if (gUpdateHandler)\r
-               gUpdateHandler->removeDependent (unknownCast (), dep);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::changed (int32 msg)\r
-{\r
-       if (gUpdateHandler)\r
-               gUpdateHandler->triggerUpdates (unknownCast (), msg);\r
-       else\r
-               updateDone (msg);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::deferUpdate (int32 msg)\r
-{\r
-       if (gUpdateHandler)\r
-               gUpdateHandler->deferUpdates (unknownCast (), msg);\r
-       else\r
-               updateDone (msg);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Automatic creation and destruction of singleton instances. */\r
-//------------------------------------------------------------------------\r
-namespace Singleton\r
-{\r
-       typedef std::vector<FObject**> ObjectVector;\r
-       ObjectVector* singletonInstances = 0;\r
-       bool singletonsTerminated = false;\r
-       Steinberg::Base::Thread::FLock* singletonsLock;\r
-\r
-       bool isTerminated () {return singletonsTerminated;}\r
-\r
-       void lockRegister ()\r
-       {\r
-               if (!singletonsLock) // assume first call not from multiple threads\r
-                       singletonsLock = NEW Steinberg::Base::Thread::FLock;\r
-               singletonsLock->lock ();\r
-       }\r
-       void unlockRegister ()\r
-       {\r
-               singletonsLock->unlock ();\r
-       }\r
-\r
-       void registerInstance (FObject** o)\r
-       {\r
-               SMTG_ASSERT (singletonsTerminated == false)\r
-               if (singletonsTerminated == false)\r
-               {\r
-                       if (singletonInstances == 0)\r
-                               singletonInstances = NEW std::vector<FObject**>;\r
-                       singletonInstances->push_back (o);\r
-               }\r
-       }\r
-\r
-       struct Deleter\r
-       {\r
-               ~Deleter ()\r
-               {\r
-                       singletonsTerminated = true;\r
-                       if (singletonInstances)\r
-                       {\r
-                               for (ObjectVector::iterator it = singletonInstances->begin (),\r
-                                                                                       end = singletonInstances->end ();\r
-                                        it != end; ++it)\r
-                               {\r
-                                       FObject** obj = (*it);\r
-                                       (*obj)->release ();\r
-                                       *obj = 0;\r
-                                       obj = 0;\r
-                               }\r
-\r
-                               delete singletonInstances;\r
-                               singletonInstances = 0;\r
-                       }\r
-                       delete singletonsLock;\r
-                       singletonsLock = 0;\r
-               }\r
-       } deleter;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h
deleted file mode 100644 (file)
index c470846..0000000
+++ /dev/null
@@ -1,518 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fobject.h\r
-// Created by  : Steinberg, 2008\r
-// Description : Basic Object implementing FUnknown\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** @file base/source/fobject.h\r
-       Basic Object implementing FUnknown. */\r
-//------------------------------------------------------------------------\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/base/iupdatehandler.h"\r
-//#include "base/source/basefwd.h"\r
-#include "base/source/fdebug.h" // NEW\r
-\r
-\r
-namespace Steinberg {\r
-\r
-//----------------------------------\r
-\r
-typedef FIDString FClassID;\r
-\r
-//------------------------------------------------------------------------\r
-// Basic FObject - implements FUnknown + IDependent\r
-//------------------------------------------------------------------------\r
-/** Implements FUnknown and IDependent.\r
-\r
-FObject is a polymorphic class that implements IDependent (of SKI module)\r
-and therefore derived from FUnknown, which is the most abstract base class of all.\r
-\r
-All COM-like virtual methods of FUnknown such as queryInterface(), addRef(), release()\r
-are implemented here. On top of that, dependency-related methods are implemented too.\r
-\r
-Pointer casting is done via the template methods FCast, either FObject to FObject or\r
-FUnknown to FObject.\r
-\r
-FObject supports a new singleton concept, therefore these objects are deleted automatically upon program termination.\r
-\r
-- Runtime type information: An object can be queried at runtime, of what class\r
-it is. To do this correctly, every class must override some methods. This\r
-is simplified by using the OBJ_METHODS macros\r
-\r
-\r
-@see\r
-       - FUnknown\r
-       - IDependent\r
-       - IUpdateHandler\r
-*/\r
-//------------------------------------------------------------------------\r
-class FObject : public IDependent\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       FObject () : refCount (1) {}                                                                                    ///< default constructor...\r
-       FObject (const FObject&) : refCount (1) {}                                                              ///< overloaded constructor...\r
-       virtual ~FObject () {}                                                                                                  ///< destructor...\r
-       FObject& operator = (const FObject&) { return *this; }                                  ///< overloads operator "=" as the reference assignment\r
-\r
-       // OBJECT_METHODS\r
-       static inline FClassID getFClassID () {return "FObject";}                               ///< return Class ID as an ASCII string (statically)\r
-       virtual FClassID isA () const {return FObject::getFClassID ();}                 ///< a local alternative to getFClassID ()\r
-       virtual bool isA (FClassID s) const {return isTypeOf (s, false);}               ///< evaluates if the passed ID is of the FObject type\r
-       virtual bool isTypeOf (FClassID s, bool /*askBaseClass*/ = true) const {return classIDsEqual (s, FObject::getFClassID ());}\r
-                                                                                                                                                       ///< evaluates if the passed ID is of the FObject type\r
-       int32 getRefCount () {return refCount;}                                                                 ///< returns the current interface reference count\r
-       FUnknown* unknownCast () {return this;}                                                                 ///< get FUnknown interface from object\r
-\r
-       // FUnknown\r
-       virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) SMTG_OVERRIDE; ///< please refer to FUnknown::queryInterface ()\r
-       virtual uint32 PLUGIN_API addRef () SMTG_OVERRIDE;                                                                      ///< please refer to FUnknown::addref ()\r
-       virtual uint32 PLUGIN_API release () SMTG_OVERRIDE;                                                                     ///< please refer to FUnknown::release ()\r
-\r
-       // IDependent\r
-       virtual void PLUGIN_API update (FUnknown* /*changedUnknown*/, int32 /*message*/) SMTG_OVERRIDE {}\r
-                                                                                                                                                       ///< empty virtual method that should be overridden by derived classes for data updates upon changes\r
-       // IDependency\r
-       virtual void addDependent (IDependent* dep);                                                    ///< adds dependency to the object\r
-       virtual void removeDependent (IDependent* dep);                                                 ///< removes dependency from the object\r
-       virtual void changed (int32 msg = kChanged);                                                    ///< Inform all dependents, that the object has changed.\r
-       virtual void deferUpdate (int32 msg = kChanged);                                                ///< Similar to triggerUpdates, except only delivered in idle (usefull in collecting updates).\r
-       virtual void updateDone (int32 /* msg */) {}                                                                                    ///< empty virtual method that should be overridden by derived classes\r
-       virtual bool isEqualInstance (FUnknown* d) {return this == d;}\r
-\r
-       static void setUpdateHandler (IUpdateHandler* handler) {gUpdateHandler = handler;}      ///< set method for the local attribute\r
-       static IUpdateHandler* getUpdateHandler () {return gUpdateHandler;}                                     ///< get method for the local attribute\r
-\r
-       // static helper functions\r
-       static inline bool classIDsEqual (FClassID ci1, FClassID ci2);                  ///< compares (evaluates) 2 class IDs\r
-       static inline FObject* unknownToObject (FUnknown* unknown);                             ///< pointer conversion from FUnknown to FObject\r
-\r
-       /** Special UID that is used to cast an FUnknown pointer to a FObject */\r
-       static const FUID iid;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       int32 refCount;                                                                                                                 ///< COM-model local reference count\r
-\r
-       static IUpdateHandler* gUpdateHandler;\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// conversion from FUnknown to FObject\r
-//------------------------------------------------------------------------\r
-inline FObject* FObject::unknownToObject (FUnknown* unknown)\r
-{\r
-       FObject* object = 0;\r
-       if (unknown)\r
-       {\r
-               unknown->queryInterface (FObject::iid, (void**)&object);\r
-               if (object)\r
-                       object->release (); // queryInterface has added ref\r
-       }\r
-       return object;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool FObject::classIDsEqual (FClassID ci1, FClassID ci2)\r
-{\r
-       return (ci1 && ci2) ? (strcmp (ci1, ci2) == 0) : false;\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-/** FCast overload 1 - FObject to FObject */\r
-//-----------------------------------------------------------------------\r
-template <class C>\r
-inline C* FCast (const FObject* object)\r
-{\r
-       if (object && object->isTypeOf (C::getFClassID (), true))\r
-               return (C*) object;\r
-       return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-/** FCast overload 2 - FUnknown to FObject */\r
-//-----------------------------------------------------------------------\r
-template <class C>\r
-inline C* FCast (FUnknown* unknown)\r
-{\r
-       FObject* object = FObject::unknownToObject (unknown);\r
-       return FCast<C> (object);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-/** FUCast - casting from FUnknown to Interface */\r
-//-----------------------------------------------------------------------\r
-template <class C>\r
-inline C* FUCast (FObject* object)\r
-{\r
-       return FUnknownPtr<C> (object ? object->unknownCast () : 0);\r
-}\r
-\r
-template <class C>\r
-inline C* FUCast (FUnknown* object)\r
-{\r
-       return FUnknownPtr<C> (object);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Convenience methods that call release or delete respectively\r
-       on a pointer if it is non-zero, and then set the pointer to zero.\r
-       Note: you should prefer using IPtr or OPtr instead of these methods\r
-       whenever possible.\r
-       <b>Examples:</b>\r
-       @code\r
-       ~Foo ()\r
-       {\r
-               // instead of ...\r
-               if (somePointer)\r
-               {\r
-                       somePointer->release ();\r
-                       somePointer = 0;\r
-               }\r
-               // ... just being lazy I write\r
-               SafeRelease (somePointer)\r
-       }\r
-       @endcode\r
-*/\r
-///@{\r
-//-----------------------------------------------------------------------\r
-template <class I>\r
-inline void SafeRelease (I *& ptr)\r
-{\r
-       if (ptr)\r
-       {\r
-               ptr->release ();\r
-               ptr = 0;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class I>\r
-inline void SafeRelease (IPtr<I> & ptr)\r
-{\r
-       ptr = 0;\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void SafeDelete (T *& ptr)\r
-{\r
-       if (ptr)\r
-       {\r
-               delete ptr;\r
-               ptr = 0;\r
-       }\r
-}\r
-///@}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void AssignShared (T*& dest, T* newPtr)\r
-{\r
-       if (dest == newPtr)\r
-               return;\r
-\r
-       if (dest)\r
-               dest->release ();\r
-       dest = newPtr;\r
-       if (dest)\r
-               dest->addRef ();\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void AssignSharedDependent (IDependent* _this, T*& dest, T* newPtr)\r
-{\r
-       if (dest == newPtr)\r
-               return;\r
-\r
-       if (dest)\r
-               dest->removeDependent (_this);\r
-       AssignShared (dest, newPtr);\r
-       if (dest)\r
-               dest->addDependent (_this);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void AssignSharedDependent (IDependent* _this, IPtr<T>& dest, T* newPtr)\r
-{\r
-       if (dest == newPtr)\r
-               return;\r
-\r
-       if (dest)\r
-               dest->removeDependent (_this);\r
-       dest = newPtr;\r
-       if (dest)\r
-               dest->addDependent (_this);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void SafeReleaseDependent (IDependent* _this, T*& dest)\r
-{\r
-       if (dest)\r
-               dest->removeDependent (_this);\r
-       SafeRelease (dest);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void SafeReleaseDependent (IDependent* _this, IPtr<T>& dest)\r
-{\r
-       if (dest)\r
-               dest->removeDependent (_this);\r
-       SafeRelease (dest);\r
-}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Automatic creation and destruction of singleton instances. */\r
-namespace Singleton {\r
-       /** registers an instance (type FObject) */\r
-       void registerInstance (FObject** o);\r
-\r
-       /** Returns true when singleton instances were already released. */\r
-       bool isTerminated ();\r
-\r
-       /** lock and unlock the singleton registration for multi-threading safety */\r
-       void lockRegister ();\r
-       void unlockRegister ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
-\r
-//-----------------------------------------------------------------------\r
-#define SINGLETON(ClassName)   \\r
-       static ClassName* instance (bool create = true) \\r
-       { \\r
-               static Steinberg::FObject* inst = nullptr; \\r
-               if (inst == nullptr && create && Steinberg::Singleton::isTerminated () == false) \\r
-               {       \\r
-                       Steinberg::Singleton::lockRegister (); \\r
-                       if (inst == nullptr) \\r
-                       { \\r
-                               inst = NEW ClassName; \\r
-                               Steinberg::Singleton::registerInstance (&inst); \\r
-                       } \\r
-                       Steinberg::Singleton::unlockRegister (); \\r
-               }       \\r
-               return (ClassName*)inst; \\r
-       }\r
-\r
-//-----------------------------------------------------------------------\r
-#define OBJ_METHODS(className, baseClass)                                                              \\r
-       static inline Steinberg::FClassID getFClassID () {return (#className);}         \\r
-       virtual Steinberg::FClassID isA () const SMTG_OVERRIDE {return className::getFClassID ();}      \\r
-       virtual bool isA (Steinberg::FClassID s) const SMTG_OVERRIDE {return isTypeOf (s, false);}      \\r
-       virtual bool isTypeOf (Steinberg::FClassID s, bool askBaseClass = true) const SMTG_OVERRIDE     \\r
-    {  return (classIDsEqual (s, #className) ? true : (askBaseClass ? baseClass::isTypeOf (s, true) : false)); }\r
-\r
-//------------------------------------------------------------------------\r
-/** Delegate refcount functions to BaseClass.\r
-       BaseClase must implement ref counting.\r
-*/\r
-//------------------------------------------------------------------------\r
-#define REFCOUNT_METHODS(BaseClass) \\r
-virtual Steinberg::uint32 PLUGIN_API addRef ()SMTG_OVERRIDE{ return BaseClass::addRef (); } \\r
-virtual Steinberg::uint32 PLUGIN_API release ()SMTG_OVERRIDE{ return BaseClass::release (); }\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Macros to implement FUnknown::queryInterface ().\r
-\r
-       <b>Examples:</b>\r
-       @code\r
-       class Foo : public FObject, public IFoo2, public IFoo3\r
-       {\r
-           ...\r
-               DEFINE_INTERFACES\r
-               DEF_INTERFACE (IFoo2)\r
-               DEF_INTERFACE (IFoo3)\r
-           END_DEFINE_INTERFACES (FObject)\r
-           REFCOUNT_METHODS(FObject)\r
-           // Implement IFoo2 interface ...\r
-           // Implement IFoo3 interface ...\r
-           ...\r
-       };\r
-       @endcode\r
-*/\r
-///@{\r
-//------------------------------------------------------------------------\r
-/** Start defining interfaces. */\r
-//------------------------------------------------------------------------\r
-#define DEFINE_INTERFACES \\r
-Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID iid, void** obj) SMTG_OVERRIDE \\r
-{\r
-\r
-//------------------------------------------------------------------------\r
-/** Add a interfaces. */\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACE(InterfaceName) \\r
-       QUERY_INTERFACE (iid, obj, InterfaceName::iid, InterfaceName)\r
-\r
-//------------------------------------------------------------------------\r
-/** End defining interfaces. */\r
-//------------------------------------------------------------------------\r
-#define END_DEFINE_INTERFACES(BaseClass) \\r
-       return BaseClass::queryInterface (iid, obj); \\r
-}\r
-///@}\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Convenient macros to implement Steinberg::FUnknown::queryInterface ().\r
-       <b>Examples:</b>\r
-       @code\r
-       class Foo : public FObject, public IFoo2, public IFoo3\r
-       {\r
-           ...\r
-           DEF_INTERFACES_2(IFoo2,IFoo3,FObject)\r
-           REFCOUNT_METHODS(FObject)\r
-           ...\r
-       };\r
-       @endcode\r
-*/\r
-///@{\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_1(InterfaceName,BaseClass) \\r
-DEFINE_INTERFACES \\r
-DEF_INTERFACE (InterfaceName) \\r
-END_DEFINE_INTERFACES (BaseClass)\r
-\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \\r
-DEFINE_INTERFACES \\r
-DEF_INTERFACE (InterfaceName1) \\r
-DEF_INTERFACE (InterfaceName2) \\r
-END_DEFINE_INTERFACES (BaseClass)\r
-\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \\r
-DEFINE_INTERFACES \\r
-DEF_INTERFACE (InterfaceName1) \\r
-DEF_INTERFACE (InterfaceName2) \\r
-DEF_INTERFACE (InterfaceName3) \\r
-END_DEFINE_INTERFACES (BaseClass)\r
-\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \\r
-       DEFINE_INTERFACES \\r
-       DEF_INTERFACE (InterfaceName1) \\r
-       DEF_INTERFACE (InterfaceName2) \\r
-       DEF_INTERFACE (InterfaceName3) \\r
-       DEF_INTERFACE (InterfaceName4) \\r
-       END_DEFINE_INTERFACES (BaseClass)\r
-///@}\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Convenient macros to implement Steinberg::FUnknown methods.\r
-       <b>Examples:</b>\r
-       @code\r
-       class Foo : public FObject, public IFoo2, public IFoo3\r
-       {\r
-           ...\r
-           FUNKNOWN_METHODS2(IFoo2,IFoo3,FObject)\r
-           ...\r
-       };\r
-       @endcode\r
-*/\r
-///@{\r
-#define FUNKNOWN_METHODS(InterfaceName,BaseClass) \\r
-DEF_INTERFACES_1(InterfaceName,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-\r
-#define FUNKNOWN_METHODS2(InterfaceName1,InterfaceName2,BaseClass) \\r
-DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-\r
-#define FUNKNOWN_METHODS3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \\r
-DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-\r
-#define FUNKNOWN_METHODS4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \\r
-DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-///@}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-#if COM_COMPATIBLE\r
-//------------------------------------------------------------------------\r
-/** @name Macros to implement IUnknown interfaces with FObject.\r
-       <b>Examples:</b>\r
-       @code\r
-       class MyEnumFormat : public FObject, IEnumFORMATETC\r
-       {\r
-           ...\r
-               COM_UNKNOWN_METHODS (IEnumFORMATETC, IUnknown)\r
-           ...\r
-       };\r
-       @endcode\r
-*/\r
-///@{\r
-//------------------------------------------------------------------------\r
-#define IUNKNOWN_REFCOUNT_METHODS(BaseClass) \\r
-STDMETHOD_ (ULONG, AddRef) (void) {return BaseClass::addRef ();} \\r
-STDMETHOD_ (ULONG, Release) (void) {return BaseClass::release ();}\r
-\r
-//------------------------------------------------------------------------\r
-#define COM_QUERY_INTERFACE(iid, obj, InterfaceName)     \\r
-if (riid == __uuidof(InterfaceName))                     \\r
-{                                                        \\r
-       addRef ();                                           \\r
-       *obj = (InterfaceName*)this;                         \\r
-       return kResultOk;                                    \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define COM_OBJECT_QUERY_INTERFACE(InterfaceName,BaseClass)        \\r
-STDMETHOD (QueryInterface) (REFIID riid, void** object)            \\r
-{                                                                  \\r
-       COM_QUERY_INTERFACE (riid, object, InterfaceName)              \\r
-       return BaseClass::queryInterface ((FIDString)&riid, object);   \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define COM_UNKNOWN_METHODS(InterfaceName,BaseClass) \\r
-COM_OBJECT_QUERY_INTERFACE(InterfaceName,BaseClass) \\r
-IUNKNOWN_REFCOUNT_METHODS(BaseClass)\r
-///@}\r
-\r
-#endif // COM_COMPATIBLE\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp
deleted file mode 100644 (file)
index acd8f29..0000000
+++ /dev/null
@@ -1,726 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fstreamer.cpp\r
-// Created by  : Steinberg, 15.12.2005\r
-// Description : Extract of typed stream i/o methods from FStream\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "fstreamer.h"\r
-\r
-#include "base/source/fstring.h"\r
-#include "base/source/fbuffer.h"\r
-#include "pluginterfaces/base/ibstream.h"\r
-\r
-#ifndef UNICODE\r
-#include "pluginterfaces/base/futils.h"\r
-#endif\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-// IBStreamer\r
-//------------------------------------------------------------------------\r
-IBStreamer::IBStreamer (IBStream* stream, int16 _byteOrder)\r
-: FStreamer (_byteOrder)\r
-, stream (stream)\r
-{}\r
-\r
-//------------------------------------------------------------------------\r
-TSize IBStreamer::readRaw (void* buffer, TSize size)\r
-{\r
-       int32 numBytesRead = 0;\r
-       stream->read (buffer, (int32)size, &numBytesRead);\r
-       return numBytesRead;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize IBStreamer::writeRaw (const void* buffer, TSize size)\r
-{\r
-       int32 numBytesWritten = 0;\r
-       stream->write ((void*)buffer, (int32)size, &numBytesWritten);\r
-       return numBytesWritten;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int64 IBStreamer::seek (int64 pos, FSeekMode mode)\r
-{\r
-       int64 result = -1;\r
-       stream->seek (pos, mode, &result);\r
-       return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int64 IBStreamer::tell ()\r
-{\r
-       int64 pos = 0;\r
-       stream->tell (&pos);\r
-       return pos;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// FStreamSizeHolder Implementation\r
-//------------------------------------------------------------------------\r
-FStreamSizeHolder::FStreamSizeHolder (FStreamer &s)\r
-: stream (s), sizePos (-1)\r
-{}\r
-\r
-//------------------------------------------------------------------------\r
-void FStreamSizeHolder::beginWrite ()\r
-{\r
-       sizePos = stream.tell ();\r
-       stream.writeInt32 (0L);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamSizeHolder::endWrite ()\r
-{\r
-       if (sizePos < 0)\r
-               return 0;\r
-\r
-       int64 currentPos = stream.tell ();\r
-\r
-       stream.seek (sizePos, kSeekSet);\r
-       int32 size = int32 (currentPos - sizePos - sizeof (int32));\r
-       stream.writeInt32 (size);\r
-\r
-       stream.seek (currentPos, kSeekSet);\r
-       return size;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamSizeHolder::beginRead ()\r
-{\r
-       sizePos = stream.tell ();\r
-       int32 size = 0;\r
-       stream.readInt32 (size);\r
-       sizePos += size + sizeof (int32);\r
-       return size;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FStreamSizeHolder::endRead ()\r
-{\r
-       if (sizePos >= 0)\r
-               stream.seek (sizePos, kSeekSet);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// FStreamer\r
-//------------------------------------------------------------------------\r
-FStreamer::FStreamer (int16 _byteOrder)\r
-: byteOrder (_byteOrder)\r
-{}\r
-\r
-// int8 / char -----------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeChar8 (char8 c)\r
-{\r
-       return writeRaw ((void*)&c, sizeof (char8)) == sizeof (char8);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readChar8 (char8& c)\r
-{\r
-       return readRaw ((void*)&c, sizeof (char8)) == sizeof (char8);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeUChar8 (unsigned char c)\r
-{\r
-       return writeRaw ((void*)&c, sizeof (unsigned char)) == sizeof (unsigned char);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readUChar8 (unsigned char& c)\r
-{\r
-       return readRaw ((void*)&c, sizeof (unsigned char)) == sizeof (unsigned char);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeChar16 (char16 c)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_16 (c);\r
-       return writeRaw ((void*)&c, sizeof (char16)) == sizeof (char16);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readChar16 (char16& c)\r
-{\r
-       if (readRaw ((void*)&c, sizeof (char16)) == sizeof (char16))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_16 (c);\r
-               return true;\r
-       }\r
-       c = 0;\r
-       return false;\r
-}\r
-\r
-// int16 -----------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16 (int16 i)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_16 (i);\r
-       return writeRaw ((void*)&i, sizeof (int16)) == sizeof (int16);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16 (int16& i)\r
-{\r
-       if (readRaw ((void*)&i, sizeof (int16)) == sizeof (int16))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_16 (i);\r
-               return true;\r
-       }\r
-       i = 0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16Array (const int16* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeInt16 (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16Array (int16* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readInt16 (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16u (uint16 i)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_16 (i);\r
-       return writeRaw ((void*)&i, sizeof (uint16)) == sizeof (uint16);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16u (uint16& i)\r
-{\r
-       if (readRaw ((void*)&i, sizeof (uint16)) == sizeof (uint16))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_16 (i);\r
-               return true;\r
-       }\r
-       i = 0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16uArray (const uint16* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeInt16u (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16uArray (uint16* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readInt16u (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-// int32 -----------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32 (int32 i)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_32 (i);\r
-       return writeRaw ((void*)&i, sizeof (int32)) == sizeof (int32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32 (int32& i)\r
-{\r
-       if (readRaw ((void*)&i, sizeof (int32)) == sizeof (int32))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_32 (i);\r
-               return true;\r
-       }\r
-       i = 0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32Array (const int32* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeInt32 (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32Array (int32* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readInt32 (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32u (uint32 i)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_32 (i);\r
-       return writeRaw ((void*)&i, sizeof (uint32)) == sizeof (uint32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32u (uint32& i)\r
-{\r
-       if (readRaw ((void*)&i, sizeof (uint32)) == sizeof (uint32))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_32 (i);\r
-               return true;\r
-       }\r
-       i = 0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32uArray (const uint32* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeInt32u (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32uArray (uint32* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readInt32u (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-// int64 -----------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64 (int64 i)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_64 (i);\r
-       return writeRaw ((void*)&i, sizeof (int64)) == sizeof (int64);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64 (int64& i)\r
-{\r
-       if (readRaw ((void*)&i, sizeof (int64)) == sizeof (int64))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_64 (i);\r
-               return true;\r
-       }\r
-       i = 0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64Array (const int64* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeInt64 (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64Array (int64* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readInt64 (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64u (uint64 i)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_64 (i);\r
-       return writeRaw ((void*)&i, sizeof (uint64)) == sizeof (uint64);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64u (uint64& i)\r
-{\r
-       if (readRaw ((void*)&i, sizeof (uint64)) == sizeof (uint64))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_64 (i);\r
-               return true;\r
-       }\r
-       i = 0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64uArray (const uint64* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeInt64u (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64uArray (uint64* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readInt64u (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-// float / double --------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeFloat (float f)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_32 (f);\r
-       return writeRaw ((void*)&f, sizeof (float)) == sizeof (float);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readFloat (float& f)\r
-{\r
-       if (readRaw ((void*)&f, sizeof (float)) == sizeof (float))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_32 (f);\r
-               return true;\r
-       }\r
-       f = 0.f;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeFloatArray (const float* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeFloat (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readFloatArray (float* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readFloat (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeDouble (double d)\r
-{\r
-       if (BYTEORDER != byteOrder)\r
-               SWAP_64 (d);\r
-       return writeRaw ((void*)&d, sizeof (double)) == sizeof (double);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readDouble (double& d)\r
-{\r
-       if (readRaw ((void*)&d, sizeof (double)) == sizeof (double))\r
-       {\r
-               if (BYTEORDER != byteOrder)\r
-                       SWAP_64 (d);\r
-               return true;\r
-       }\r
-       d = 0.0;\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeDoubleArray (const double* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!writeDouble (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readDoubleArray (double* array, int32 count)\r
-{\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               if (!readDouble (array[i]))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readBool (bool& b)\r
-{\r
-       int16 v = 0;\r
-       bool res = readInt16 (v);\r
-       b = (v != 0);\r
-       return res;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeBool (bool b)\r
-{\r
-       return writeInt16 ((int16)b);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize FStreamer::writeString8 (const char8* ptr, bool terminate)\r
-{\r
-       TSize size = strlen (ptr);\r
-       if (terminate) // write \0\r
-               size++;\r
-\r
-       return writeRaw ((void*)ptr, size);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize FStreamer::readString8 (char8* ptr, TSize size)\r
-{\r
-       TSize i = 0;\r
-       char8 c = 0;\r
-       while (i < size)\r
-       {\r
-               if (readRaw ((void*)&c, sizeof (char)) != sizeof (char))\r
-                       break;\r
-               ptr[i] = c;\r
-               i++;\r
-               if (c == '\n' || c == '\0')\r
-                       break;\r
-       }\r
-       if (c == '\n' && ptr[i - 2] == '\r')\r
-               ptr[i - 2] = 0;\r
-       if (i < size)\r
-               ptr[i] = 0;\r
-       else\r
-               ptr[size - 1] = 0;\r
-\r
-       return strlen (ptr);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeStringUtf8 (const tchar* ptr)\r
-{\r
-       bool isUtf8 = false;\r
-\r
-       String str (ptr);\r
-       if (str.isAsciiString () == false)\r
-       {\r
-               str.toMultiByte (kCP_Utf8);\r
-               isUtf8 = true;\r
-       }\r
-       else\r
-       {\r
-               str.toMultiByte ();\r
-       }\r
-\r
-       if (isUtf8)\r
-               if (writeRaw (kBomUtf8, kBomUtf8Length) != kBomUtf8Length)\r
-                       return false;\r
-\r
-       TSize size = str.length () + 1;\r
-       if (writeRaw (str.text8 (), size) != size)\r
-               return false;\r
-\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamer::readStringUtf8 (tchar* ptr, int32 nChars)\r
-{\r
-       char8 c = 0;\r
-\r
-       ptr [0] = 0;\r
-\r
-       Buffer tmp;\r
-       tmp.setDelta (1024);\r
-\r
-       while (true)\r
-       {\r
-               if (readRaw ((void*)&c, sizeof (char)) != sizeof (char))\r
-                       break;\r
-               tmp.put (c);\r
-               if (c == '\0')\r
-                       break;\r
-       }\r
-\r
-       char8* source = tmp.int8Ptr ();\r
-       uint32 codePage = kCP_Default; // for legacy take default page if no utf8 bom is present...\r
-       if (tmp.getFillSize () > 2)\r
-       {\r
-               if (memcmp (source, kBomUtf8, kBomUtf8Length) == 0)\r
-               {\r
-                       codePage = kCP_Utf8;\r
-                       source += 3;\r
-               }\r
-       }\r
-\r
-       if (tmp.getFillSize () > 1)\r
-       {\r
-#ifdef UNICODE\r
-               ConstString::multiByteToWideString (ptr, source, nChars, codePage);\r
-#else\r
-               if (codePage == kCP_Utf8)\r
-               {\r
-                       Buffer wideBuffer (tmp.getFillSize () * 3);\r
-                       ConstString::multiByteToWideString (wideBuffer.wcharPtr (), source, wideBuffer.getSize () / 2, kCP_Utf8);\r
-                       ConstString::wideStringToMultiByte (ptr, wideBuffer.wcharPtr (), nChars);\r
-               }\r
-               else\r
-               {\r
-                       memcpy (ptr, source, Min<TSize> (nChars, tmp.getFillSize ()));\r
-               }\r
-#endif\r
-       }\r
-\r
-       ptr[nChars - 1] = 0;\r
-       return ConstString (ptr).length ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeStr8 (const char8* s)\r
-{\r
-       int32 length = (s) ? (int32) strlen (s) + 1 : 0;\r
-       if (!writeInt32 (length))\r
-               return false;\r
-\r
-       if (length > 0)\r
-               return writeRaw (s, sizeof (char8) * length) == static_cast<TSize>(sizeof (char8) * length);\r
-\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamer::getStr8Size (const char8* s)\r
-{\r
-       return sizeof (int32) + (int32)strlen (s) + 1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-char8* FStreamer::readStr8 ()\r
-{\r
-       int32 length;\r
-       if (!readInt32 (length))\r
-               return 0;\r
-\r
-       // check corruption\r
-       if (length > 262144)\r
-               return 0;\r
-\r
-       char8* s = (length > 0) ? NEWVEC char8[length] : 0;\r
-       if (s)\r
-               readRaw (s, length * sizeof (char8));\r
-       return s;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::skip (uint32 bytes)\r
-{\r
-    int8 tmp;\r
-       while (bytes-- > 0)\r
-       {\r
-               if (readInt8 (tmp) == false)\r
-                       return false;\r
-    }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::pad (uint32 bytes)\r
-{\r
-    while (bytes-- > 0)\r
-       {\r
-               if (writeInt8 (0) == false)\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h
deleted file mode 100644 (file)
index a0fde7e..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fstreamer.h\r
-// Created by  : Steinberg, 12/2005\r
-// Description : Extract of typed stream i/o methods from FStream\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-enum FSeekMode\r
-{\r
-       kSeekSet,\r
-       kSeekCurrent,\r
-       kSeekEnd\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// FStreamer\r
-//------------------------------------------------------------------------\r
-/** Byteorder-aware base class for typed stream i/o. */\r
-//------------------------------------------------------------------------\r
-class FStreamer\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       FStreamer (int16 byteOrder = BYTEORDER);\r
-       virtual ~FStreamer () {}\r
-\r
-       /** @name Implementing class must override. */\r
-       ///@{\r
-       virtual TSize readRaw (void*, TSize) = 0;          ///< Read one buffer of size.\r
-       virtual TSize writeRaw (const void*, TSize) = 0;   ///< Write one buffer of size.\r
-       virtual int64 seek (int64, FSeekMode) = 0;         ///< Set file position for stream.\r
-       virtual int64 tell () = 0;                         ///< Return current file position.\r
-       ///@}\r
-\r
-       /** @name Streams are byteOrder aware. */\r
-       ///@{\r
-       inline void setByteOrder (int32 e) { byteOrder = (int16)e; }\r
-       inline int32 getByteOrder () { return byteOrder; }\r
-       ///@}\r
-\r
-       /** @name read and write int8 and char. */\r
-       ///@{\r
-       bool writeChar8 (char8);\r
-       bool readChar8 (char8&);\r
-       bool writeUChar8 (unsigned char);\r
-       bool readUChar8 (unsigned char&);\r
-       bool writeChar16 (char16 c);\r
-       bool readChar16 (char16& c);\r
-\r
-       bool writeInt8 (int8 c){return writeChar8 (c);}\r
-       bool readInt8 (int8& c){return readChar8 (c);}\r
-       bool writeInt8u (uint8 c){return writeUChar8 (c);}\r
-       bool readInt8u (uint8& c){return readUChar8 (c);}\r
-       ///@}\r
-\r
-       /** @name read and write int16. */\r
-       ///@{\r
-       bool writeInt16 (int16);\r
-       bool readInt16 (int16&);\r
-       bool writeInt16Array (const int16* array, int32 count);\r
-       bool readInt16Array (int16* array, int32 count);\r
-       bool writeInt16u (uint16);\r
-       bool readInt16u (uint16&);\r
-       bool writeInt16uArray (const uint16* array, int32 count);\r
-       bool readInt16uArray (uint16* array, int32 count);\r
-       ///@}\r
-\r
-       /** @name read and write int32. */\r
-       ///@{\r
-       bool writeInt32 (int32);\r
-       bool readInt32 (int32&);\r
-       bool writeInt32Array (const int32* array, int32 count);\r
-       bool readInt32Array (int32* array, int32 count);\r
-       bool writeInt32u (uint32);\r
-       bool readInt32u (uint32&);\r
-       bool writeInt32uArray (const uint32* array, int32 count);\r
-       bool readInt32uArray (uint32* array, int32 count);\r
-       ///@}\r
-\r
-       /** @name read and write int64. */\r
-       ///@{\r
-       bool writeInt64 (int64);\r
-       bool readInt64 (int64&);\r
-       bool writeInt64Array (const int64* array, int32 count);\r
-       bool readInt64Array (int64* array, int32 count);\r
-       bool writeInt64u (uint64);\r
-       bool readInt64u (uint64&);\r
-       bool writeInt64uArray (const uint64* array, int32 count);\r
-       bool readInt64uArray (uint64* array, int32 count);\r
-       ///@}\r
-\r
-       /** @name read and write float and float array. */\r
-       ///@{\r
-       bool writeFloat (float);\r
-       bool readFloat (float&);\r
-       bool writeFloatArray (const float* array, int32 count);\r
-       bool readFloatArray (float* array, int32 count);\r
-       ///@}\r
-\r
-       /** @name read and write double and double array. */\r
-       ///@{\r
-       bool writeDouble (double);\r
-       bool readDouble (double&);\r
-       bool writeDoubleArray (const double* array, int32 count);\r
-       bool readDoubleArray (double* array, int32 count);\r
-       ///@}\r
-\r
-       /** @name read and write Boolean. */\r
-       ///@{\r
-       bool writeBool (bool);                                   ///< Write one boolean\r
-       bool readBool (bool&);                                   ///< Read one bool.\r
-       ///@}\r
-\r
-       /** @name read and write Strings. */\r
-       ///@{\r
-       TSize writeString8 (const char8* ptr, bool terminate = false); ///< a direct output function writing only one string (ascii 8bit)\r
-       TSize readString8 (char8* ptr, TSize size);                             ///< a direct input function reading only one string (ascii) (ended by a \n or \0 or eof)\r
-\r
-       bool writeStr8 (const char8* ptr);                                     ///< write a string length (strlen) and string itself\r
-       char8* readStr8 ();                                                                        ///< read a string length and string text (The return string must be deleted when use is finished)\r
-\r
-       static int32 getStr8Size (const char8* ptr);           ///< returns the size of a saved string\r
-\r
-       bool writeStringUtf8 (const tchar* ptr);               ///< always terminated, converts to utf8 if non ascii characters are in string\r
-       int32 readStringUtf8 (tchar* ptr, int32 maxSize);      ///< read a UTF8 string\r
-       ///@}\r
-\r
-       bool skip (uint32 bytes);\r
-       bool pad (uint32 bytes);\r
-\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       int16 byteOrder;\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** FStreamSizeHolder Declaration\r
-       remembers size of stream chunk for backward compatibility.\r
-\r
-       <b>Example:</b>\r
-       @code\r
-       externalize (a)\r
-       {\r
-               FStreamSizeHolder sizeHolder;\r
-               sizeHolder.beginWrite ();       // sets start mark, writes dummy size\r
-               a << ....\r
-               sizeHolder.endWrite ();         // jumps to start mark, updates size, jumps back here\r
-       }\r
-\r
-       internalize (a)\r
-       {\r
-               FStreamSizeHolder sizeHolder;\r
-               sizeHolder.beginRead ();        // reads size, mark\r
-               a >> ....\r
-               sizeHolder.endRead ();          // jumps forward if new version has larger size\r
-       }\r
-       @endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-class FStreamSizeHolder\r
-{\r
-public:\r
-       FStreamSizeHolder (FStreamer &s);\r
-\r
-       void beginWrite ();     ///< remembers position and writes 0\r
-       int32 endWrite ();      ///< writes and returns size (since the start marker)\r
-       int32 beginRead ();     ///< returns size\r
-       void endRead ();        ///< jump to end of chunk\r
-\r
-protected:\r
-       FStreamer &stream;\r
-       int64 sizePos;\r
-};\r
-\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-// IBStreamer\r
-//------------------------------------------------------------------------\r
-/** Wrapper class for typed reading/writing from or to IBStream.\r
-       Can be used framework-independent in Plug-ins. */\r
-//------------------------------------------------------------------------\r
-class IBStreamer: public FStreamer\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Constructor for a given IBSTream and a byteOrder. */\r
-       IBStreamer (IBStream* stream, int16 byteOrder = BYTEORDER);\r
-\r
-       IBStream* getStream () { return stream; }       ///< Returns the associated IBStream.\r
-\r
-       // FStreamer overrides:\r
-       TSize readRaw (void*, TSize) SMTG_OVERRIDE;                             ///< Read one buffer of size.\r
-       TSize writeRaw (const void*, TSize) SMTG_OVERRIDE;              ///< Write one buffer of size.\r
-       int64 seek (int64, FSeekMode) SMTG_OVERRIDE;                    ///< Set file position for stream.\r
-       int64 tell () SMTG_OVERRIDE;                                                    ///< Return current file position.\r
-//------------------------------------------------------------------------\r
-protected:\r
-       IBStream* stream;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp
deleted file mode 100644 (file)
index be33be5..0000000
+++ /dev/null
@@ -1,3996 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fstring.cpp\r
-// Created by  : Steinberg, 2008\r
-// Description : String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fstring.h"\r
-#include "base/source/fdebug.h"\r
-#include "pluginterfaces/base/futils.h"\r
-#include "pluginterfaces/base/fvariant.h"\r
-\r
-#include <cstdlib>\r
-#include <ctype.h>\r
-#include <cstdio>\r
-#include <stdarg.h>\r
-#include <utility>\r
-\r
-#if SMTG_OS_WINDOWS\r
-#include <windows.h>\r
-#pragma warning (disable : 4244)\r
-#pragma warning (disable : 4267)\r
-#pragma warning (disable : 4996)\r
-\r
-#if DEVELOPMENT\r
-#include <crtdbg.h>\r
-\r
-#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)\r
-#define realloc(p,s) _realloc_dbg(p,s,  _NORMAL_BLOCK, __FILE__, __LINE__)\r
-#define free(p) _free_dbg(p, _NORMAL_BLOCK)\r
-\r
-#endif\r
-\r
-#endif\r
-\r
-#ifndef kPrintfBufferSize\r
-#define kPrintfBufferSize 4096\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-#include <CoreFoundation/CoreFoundation.h>\r
-#include <CoreFoundation/CFString.h>\r
-#include <CoreFoundation/CFStringEncodingExt.h>\r
-#include <wchar.h>\r
-\r
-#if defined (__GNUC__) && (__GNUC__ >= 4) && !__LP64__\r
-// on 32 bit Mac OS X we can safely ignore the format warnings as sizeof(int) == sizeof(long)\r
-#pragma GCC diagnostic ignored "-Wformat"\r
-#endif\r
-\r
-#define SMTG_ENABLE_DEBUG_CFALLOCATOR 0\r
-#define SMTG_DEBUG_CFALLOCATOR (DEVELOPMENT && SMTG_ENABLE_DEBUG_CFALLOCATOR)\r
-\r
-#if SMTG_DEBUG_CFALLOCATOR\r
-#include <libkern/OSAtomic.h>\r
-#include <dlfcn.h>\r
-#endif\r
-\r
-namespace Steinberg {\r
-#if SMTG_DEBUG_CFALLOCATOR\r
-static CFAllocatorRef kCFAllocator = NULL;\r
-\r
-struct CFStringDebugAllocator : CFAllocatorContext\r
-{\r
-       CFStringDebugAllocator ()\r
-       {\r
-               version = 0;\r
-               info = this;\r
-               retain = nullptr;\r
-               release = nullptr;\r
-               copyDescription = nullptr;\r
-               allocate = allocateCallBack;\r
-               reallocate = reallocateCallBack;\r
-               deallocate = deallocateCallBack;\r
-               preferredSize = preferredSizeCallBack;\r
-\r
-               numAllocations = allocationSize = numDeallocations = 0;\r
-               cfAllocator = CFAllocatorCreate (kCFAllocatorUseContext, this);\r
-\r
-               Dl_info info;\r
-               if (dladdr ((const void*)CFStringDebugAllocator::allocateCallBack, &info))\r
-               {\r
-                       moduleName = info.dli_fname;\r
-               }\r
-               kCFAllocator = cfAllocator;\r
-       }\r
-\r
-       ~CFStringDebugAllocator ()\r
-       {\r
-               kCFAllocator = kCFAllocatorDefault;\r
-               CFRelease (cfAllocator);\r
-               FDebugPrint ("CFStringDebugAllocator (%s):\n", moduleName.text8 ());\r
-               FDebugPrint ("\tNumber of allocations  : %u\n", numAllocations);\r
-               FDebugPrint ("\tNumber of deallocations: %u\n", numDeallocations);\r
-               FDebugPrint ("\tAllocated Bytes        : %u\n", allocationSize);\r
-       }\r
-\r
-       String moduleName;\r
-       CFAllocatorRef cfAllocator;\r
-       volatile int64_t numAllocations;\r
-       volatile int64_t numDeallocations;\r
-       volatile int64_t allocationSize;\r
-\r
-       void* doAllocate (CFIndex allocSize, CFOptionFlags hint)\r
-       {\r
-               void* ptr = CFAllocatorAllocate (kCFAllocatorDefault, allocSize, hint);\r
-               OSAtomicIncrement64 (&numAllocations);\r
-               OSAtomicAdd64 (allocSize, &allocationSize);\r
-               return ptr;\r
-       }\r
-       void* doReallocate (void* ptr, CFIndex newsize, CFOptionFlags hint)\r
-       {\r
-               void* newPtr = CFAllocatorReallocate (kCFAllocatorDefault, ptr, newsize, hint);\r
-               return newPtr;\r
-       }\r
-       void doDeallocate (void* ptr)\r
-       {\r
-               CFAllocatorDeallocate (kCFAllocatorDefault, ptr);\r
-               OSAtomicIncrement64 (&numDeallocations);\r
-       }\r
-       CFIndex getPreferredSize (CFIndex size, CFOptionFlags hint)\r
-       {\r
-               return CFAllocatorGetPreferredSizeForSize (kCFAllocatorDefault, size, hint);\r
-       }\r
-\r
-       static void* allocateCallBack (CFIndex allocSize, CFOptionFlags hint, void* info)\r
-       {\r
-               return static_cast<CFStringDebugAllocator*> (info)->doAllocate (allocSize, hint);\r
-       }\r
-       static void* reallocateCallBack (void* ptr, CFIndex newsize, CFOptionFlags hint, void* info)\r
-       {\r
-               return static_cast<CFStringDebugAllocator*> (info)->doReallocate (ptr, newsize, hint);\r
-       }\r
-\r
-       static void deallocateCallBack (void* ptr, void* info)\r
-       {\r
-               static_cast<CFStringDebugAllocator*> (info)->doDeallocate (ptr);\r
-       }\r
-       static CFIndex preferredSizeCallBack (CFIndex size, CFOptionFlags hint, void* info)\r
-       {\r
-               return static_cast<CFStringDebugAllocator*> (info)->getPreferredSize (size, hint);\r
-       }\r
-};\r
-static CFStringDebugAllocator gDebugAllocator;\r
-#else\r
-\r
-static const CFAllocatorRef kCFAllocator = ::kCFAllocatorDefault;\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static void* toCFStringRef (const Steinberg::char8* source, Steinberg::uint32 encoding)\r
-{\r
-       if (encoding == 0xFFFF)\r
-               encoding = kCFStringEncodingASCII;\r
-       if (source)\r
-               return (void*)CFStringCreateWithCString (Steinberg::kCFAllocator, source, encoding);\r
-       else\r
-               return (void*)CFStringCreateWithCString (Steinberg::kCFAllocator, "", encoding);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static bool fromCFStringRef (Steinberg::char8* dest, Steinberg::int32 destSize, const void* cfStr, Steinberg::uint32 encoding)\r
-{\r
-       CFIndex usedBytes;\r
-       CFRange range = {0, CFStringGetLength ((CFStringRef)cfStr)};\r
-       bool result = CFStringGetBytes ((CFStringRef)cfStr, range, encoding, '?', false, (UInt8*)dest, destSize, &usedBytes);\r
-       dest[usedBytes] = 0;\r
-       return result;\r
-}\r
-#endif // SMTG_OS_MACOS\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define stricmp16 wcsicmp\r
-#define strnicmp16 wcsnicmp\r
-#define strrchr16 wcsrchr\r
-#define sprintf16 swprintf\r
-#define snprintf16 snwprintf\r
-#define vsnprintf16 vsnwprintf\r
-#define vsprintf16 wvsprintf\r
-#define vfprintf16 vfwprintf\r
-#define sscanf16 swscanf\r
-#define toupper16 towupper\r
-#define tolower16 towlower\r
-#define isupper16 iswupper\r
-#define islower16 iswlower\r
-#define isspace16 iswspace\r
-#define isalpha16 iswalpha\r
-#define isdigit16 iswdigit\r
-#define isalnum16 iswalnum\r
-\r
-#define stricmp _stricmp\r
-#define strnicmp _strnicmp\r
-#define snprintf _snprintf\r
-#define vsnprintf _vsnprintf\r
-#define snwprintf _snwprintf\r
-#define vsnwprintf _vsnwprintf\r
-\r
-#define wtoi _wtoi\r
-#define wtol _wtol\r
-#define wtof _wtof\r
-\r
-#elif SMTG_OS_LINUX\r
-#include <codecvt>\r
-#include <locale>\r
-#include <cstring>\r
-#include <string>\r
-#include <limits>\r
-#include <cassert>\r
-#include <wchar.h>\r
-\r
-using ConverterFacet = std::codecvt_utf8_utf16<char16_t>;\r
-using Converter = std::wstring_convert<ConverterFacet, char16_t>;\r
-\r
-//------------------------------------------------------------------------\r
-static ConverterFacet& converterFacet ()\r
-{\r
-       static ConverterFacet gFacet;\r
-       return gFacet;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-static Converter& converter ()\r
-{\r
-       static Converter gConverter;\r
-       return gConverter;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int stricasecmp (const Steinberg::char8* s1, const Steinberg::char8* s2)\r
-{\r
-       return ::strcasecmp (s1, s2);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int strnicasecmp (const Steinberg::char8* s1, const Steinberg::char8* s2, size_t n)\r
-{\r
-       return ::strncasecmp (s1, s2, n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int stricmp16 (const Steinberg::char16* s1, const Steinberg::char16* s2)\r
-{\r
-       auto str1 = converter ().to_bytes (s1);\r
-       auto str2 = converter ().to_bytes (s2);\r
-       return stricasecmp (str1.data (), str2.data ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int strnicmp16 (const Steinberg::char16* s1, const Steinberg::char16* s2, int n)\r
-{\r
-       auto str1 = converter ().to_bytes (s1);\r
-       auto str2 = converter ().to_bytes (s2);\r
-       return strnicasecmp (str1.data (), str2.data (), n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int sprintf16 (Steinberg::char16* wcs, const Steinberg::char16* format, ...)\r
-{\r
-#warning DEPRECATED No Linux implementation\r
-    assert(false && "DEPRECATED No Linux implementation");\r
-       return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int vsnwprintf (Steinberg::char16* wcs, size_t maxlen,\r
-                                                         const Steinberg::char16* format, va_list args)\r
-{\r
-       Steinberg::char8 str8[kPrintfBufferSize];\r
-       auto format_utf8 = converter ().to_bytes(format);\r
-       auto len = vsnprintf (str8, kPrintfBufferSize, format_utf8.data (), args);\r
-\r
-       auto tmp_str = converter ().from_bytes (str8, str8 + len);\r
-       auto target_len = std::min (tmp_str.size (), maxlen - 1);\r
-       tmp_str.copy (wcs, target_len);\r
-       wcs[target_len] = '\0';\r
-\r
-       return tmp_str.size ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::char16* strrchr16 (const Steinberg::char16* str, Steinberg::char16 c)\r
-{\r
-#warning DEPRECATED No Linux implementation\r
-    assert(false && "DEPRECATED No Linux implementation");\r
-       return nullptr;\r
-}\r
-\r
-#elif SMTG_OS_MACOS\r
-#define tstrtoi64 strtoll\r
-#define stricmp strcasecmp\r
-#define strnicmp strncasecmp\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 strnicmp16 (const Steinberg::char16* str1, const Steinberg::char16* str2, size_t size)\r
-{\r
-       if (size == 0)\r
-               return 0;\r
-\r
-       CFIndex str1Len = Steinberg::strlen16 (str1);\r
-       CFIndex str2Len = Steinberg::strlen16 (str2);\r
-       if (size < str2Len) // range is not applied to second string\r
-               str2Len = size;\r
-       CFStringRef cfStr1 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str1, str1Len, kCFAllocatorNull);\r
-       CFStringRef cfStr2 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str2, str2Len, kCFAllocatorNull);\r
-       CFComparisonResult result = CFStringCompareWithOptions (cfStr1, cfStr2, CFRangeMake (0, size), kCFCompareCaseInsensitive);\r
-       CFRelease (cfStr1);\r
-       CFRelease (cfStr2);\r
-       switch (result)\r
-       {\r
-               case kCFCompareEqualTo: return 0;\r
-               case kCFCompareLessThan: return -1;\r
-               case kCFCompareGreaterThan:\r
-               default: return 1;\r
-       };\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 stricmp16 (const Steinberg::char16* str1, CFIndex str1Len, const Steinberg::char16* str2, CFIndex str2Len)\r
-{\r
-       CFStringRef cfStr1 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str1, str1Len, kCFAllocatorNull);\r
-       CFStringRef cfStr2 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str2, str2Len, kCFAllocatorNull);\r
-       CFComparisonResult result = CFStringCompare (cfStr1, cfStr2, kCFCompareCaseInsensitive);\r
-       CFRelease (cfStr1);\r
-       CFRelease (cfStr2);\r
-       switch (result)\r
-       {\r
-               case kCFCompareEqualTo: return 0;\r
-               case kCFCompareLessThan: return -1;\r
-               case kCFCompareGreaterThan:\r
-               default: return 1;\r
-       };\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 stricmp16 (const Steinberg::ConstString& str1, const Steinberg::ConstString& str2)\r
-{\r
-       return stricmp16 (str1.text16 (), str1.length (), str2.text16 (), str2.length ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 stricmp16 (const Steinberg::char16* str1, const Steinberg::char16* str2)\r
-{\r
-       CFIndex str1Len = Steinberg::strlen16 (str1);\r
-       CFIndex str2Len = Steinberg::strlen16 (str2);\r
-       return stricmp16 (str1, str1Len, str2, str2Len);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::char16* strrchr16 (const Steinberg::char16* str, Steinberg::char16 c)\r
-{\r
-       Steinberg::int32 len = Steinberg::ConstString (str).length ();\r
-       while (len > 0)\r
-       {\r
-               if (str[len] == c)\r
-                       return const_cast<Steinberg::char16*>(str + len);\r
-               len--;\r
-       }\r
-       return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 vsnwprintf (Steinberg::char16* str, Steinberg::int32 size, const Steinberg::char16* format, va_list ap)\r
-{\r
-       // wrapped using CoreFoundation's CFString\r
-       CFMutableStringRef formatString = (CFMutableStringRef)Steinberg::ConstString (format).toCFStringRef (0xFFFF, true);\r
-       CFStringFindAndReplace (formatString, CFSTR("%s"), CFSTR("%S"), CFRangeMake (0, CFStringGetLength (formatString)), 0);\r
-       CFStringRef resultString = CFStringCreateWithFormatAndArguments (Steinberg::kCFAllocator, 0, formatString, ap);\r
-       CFRelease (formatString);\r
-       if (resultString)\r
-       {\r
-               Steinberg::String res;\r
-               res.fromCFStringRef (resultString);\r
-               res.copyTo16 (str, 0, size);\r
-               CFRelease (resultString);\r
-               return 0;\r
-       }\r
-       return 1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 sprintf16 (Steinberg::char16* str, const Steinberg::char16* format, ...)\r
-{\r
-       va_list marker;\r
-       va_start (marker, format);\r
-       return vsnwprintf (str, -1, format, marker);\r
-}\r
-\r
-#endif\r
-\r
-/*\r
-UTF-8                EF BB BF\r
-UTF-16 Big Endian    FE FF\r
-UTF-16 Little Endian FF FE\r
-UTF-32 Big Endian    00 00 FE FF\r
-UTF-32 Little Endian FF FE 00 00\r
-*/\r
-\r
-namespace Steinberg {\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline bool isCaseSensitive (ConstString::CompareMode mode)\r
-{\r
-       return mode == ConstString::kCaseSensitive;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-//     ConstString\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const char8* str, int32 length)\r
-: buffer8 ((char8*)str)\r
-, len (length < 0 ? (str ? static_cast<uint32> (strlen (str)) : 0) : length)\r
-, isWide (0)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const char16* str, int32 length)\r
-: buffer16 ((char16*)str)\r
-, len (length < 0 ? (str ? strlen16 (str) : 0) : length)\r
-, isWide (1)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const ConstString& str, int32 offset, int32 length)\r
-: buffer (str.buffer)\r
-, len (length < 0 ? (str.len - (offset > 0 ? offset : 0)) : length)\r
-, isWide (str.isWide)\r
-{\r
-       if (offset > 0)\r
-       {\r
-               if (isWide)\r
-                       buffer16 += offset;\r
-               else\r
-                       buffer8 += offset;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const FVariant& var)\r
-: buffer (0)\r
-, len (0)\r
-, isWide (0)\r
-{\r
-       switch (var.getType ())\r
-       {\r
-               case FVariant::kString8:\r
-                       buffer8 = (char8*)var.getString8 ();\r
-                       len = buffer8 ? strlen8 (buffer8) : 0;\r
-                       isWide = false;\r
-                       break;\r
-\r
-               case FVariant::kString16:\r
-                       buffer16 = (char16*)var.getString16 ();\r
-                       len = buffer16 ? strlen16 (buffer16) : 0;\r
-                       isWide = true;\r
-                       break;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString ()\r
-: buffer (0)\r
-, len (0)\r
-, isWide (0)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::testChar8 (uint32 index, char8 c) const\r
-{\r
-       if (index >= len)\r
-               return c == 0;\r
-       if (isWide)\r
-       {\r
-               // make c wide\r
-               char8 src[] = {c, 0};\r
-               char16 dest[2] = {0};\r
-               if (multiByteToWideString (dest, src, 2) > 0)\r
-                       return buffer16[index] == dest[0];\r
-               return false;\r
-       }\r
-       return buffer8[index] == c;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::testChar16 (uint32 index, char16 c) const\r
-{\r
-       if (index >= len)\r
-               return c == 0;\r
-       if (!isWide)\r
-       {\r
-               // make c ansi\r
-               char16 src[] = {c, 0};\r
-               char8 dest[8] = {0};\r
-               if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
-                       return buffer8[index] == dest[0];\r
-               return false;\r
-       }\r
-       return buffer16[index] == c;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::extract (String& result, uint32 idx, int32 n) const\r
-{\r
-       if (len == 0|| idx >= len)\r
-               return false;\r
-\r
-       if ((idx + n > len) || n < 0)\r
-               n = len - idx;\r
-\r
-       if (isWide)\r
-               result.assign (buffer16 + idx, n);\r
-       else\r
-               result.assign (buffer8 + idx, n);\r
-\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::copyTo8 (char8* str, uint32 idx, int32 n) const\r
-{\r
-       if (!str)\r
-               return 0;\r
-\r
-       if (isWide)\r
-       {\r
-               String tmp (text16 ());\r
-               if (tmp.toMultiByte () == false)\r
-                       return 0;\r
-               return tmp.copyTo8 (str, idx, n);\r
-       }\r
-\r
-       if (isEmpty () || idx >= len || !buffer8)\r
-       {\r
-               str[0] = 0;\r
-               return 0;\r
-       }\r
-\r
-       if ((idx + n > len) || n < 0)\r
-               n = len - idx;\r
-\r
-       memcpy (str, &(buffer8[idx]), n * sizeof (char8));\r
-       str[n] = 0;\r
-       return n;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::copyTo16 (char16* str, uint32 idx, int32 n) const\r
-{\r
-       if (!str)\r
-               return 0;\r
-\r
-       if (!isWide)\r
-       {\r
-               String tmp (text8 ());\r
-               if (tmp.toWideString () == false)\r
-                       return 0;\r
-               return tmp.copyTo16 (str, idx, n);\r
-       }\r
-\r
-       if (isEmpty () || idx >= len || !buffer16)\r
-       {\r
-               str[0] = 0;\r
-               return 0;\r
-       }\r
-\r
-       if ((idx + n > len) || n < 0)\r
-               n = len - idx;\r
-\r
-       memcpy (str, &(buffer16[idx]), n * sizeof (char16));\r
-       str[n] = 0;\r
-       return n;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::copyTo (tchar* str, uint32 idx, int32 n) const\r
-{\r
-#ifdef UNICODE\r
-       return copyTo16 (str, idx, n);\r
-#else\r
-       return copyTo8 (str, idx, n);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void ConstString::copyTo (IStringResult* result) const\r
-{\r
-       if (isWideString () == false)\r
-       {\r
-               result->setText (text8 ());\r
-       }\r
-       else\r
-       {\r
-               FUnknownPtr<IString> iStr (result);\r
-               if (iStr)\r
-               {\r
-                       iStr->setText16 (text16 ());\r
-               }\r
-               else\r
-               {\r
-                       String tmp (*this);\r
-                       tmp.toMultiByte ();\r
-                       result->setText (tmp.text8 ());\r
-               }\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void ConstString::copyTo (IString& string) const\r
-{\r
-       if (isWideString ())\r
-               string.setText16 (text16 ());\r
-       else\r
-               string.setText8 (text8 ());\r
-}\r
-\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::compare (const ConstString& str, int32 n, CompareMode mode) const\r
-{\r
-       if (n == 0)\r
-               return 0;\r
-\r
-       if (str.isEmpty ())\r
-       {\r
-               if (isEmpty ())\r
-                       return 0;\r
-               return 1;\r
-       }\r
-       else if (isEmpty ())\r
-               return -1;\r
-\r
-       if (!isWide && !str.isWide)\r
-       {\r
-               if (n < 0)\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strcmp (*this, str);\r
-                       else\r
-                               return stricmp (*this, str);\r
-               }\r
-               else\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strncmp (*this, str, n);\r
-                       else\r
-                               return strnicmp (*this, str, n);\r
-               }\r
-       }\r
-       else if (isWide && str.isWide)\r
-       {\r
-               if (n < 0)\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strcmp16 (*this, str);\r
-                       else\r
-                               return stricmp16 (*this, str);\r
-               }\r
-               else\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strncmp16 (*this, str, n);\r
-                       else\r
-                               return strnicmp16 (*this, str, n);\r
-               }\r
-       }\r
-       return compareAt (0, str, n, mode);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::compare (const ConstString& str, CompareMode mode) const\r
-{\r
-       return compare (str, -1, mode);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::compareAt (uint32 index, const ConstString& str, int32 n, CompareMode mode) const\r
-{\r
-       if (n == 0)\r
-               return 0;\r
-\r
-       if (str.isEmpty ())\r
-       {\r
-               if (isEmpty ())\r
-                       return 0;\r
-               return 1;\r
-       }\r
-       else if (isEmpty ())\r
-               return -1;\r
-\r
-       if (!isWide && !str.isWide)\r
-       {\r
-               char8* toCompare = buffer8;\r
-               if (index > 0)\r
-               {\r
-                       if (index >= len)\r
-                       {\r
-                               if (str.isEmpty ())\r
-                                       return 0;\r
-                               return -1;\r
-                       }\r
-                       toCompare += index;\r
-               }\r
-\r
-               if (n < 0)\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strcmp (toCompare, str);\r
-                       else\r
-                               return stricmp (toCompare, str);\r
-               }\r
-               else\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strncmp (toCompare, str, n);\r
-                       else\r
-                               return strnicmp (toCompare, str, n);\r
-               }\r
-       }\r
-       else if (isWide && str.isWide)\r
-       {\r
-               char16* toCompare = buffer16;\r
-               if (index > 0)\r
-               {\r
-                       if (index >= len)\r
-                       {\r
-                               if (str.isEmpty ())\r
-                                       return 0;\r
-                               return -1;\r
-                       }\r
-                       toCompare += index;\r
-               }\r
-\r
-               if (n < 0)\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strcmp16 (toCompare, str.text16 ());\r
-                       else\r
-                               return stricmp16 (toCompare, str.text16 ());\r
-               }\r
-               else\r
-               {\r
-                       if (isCaseSensitive (mode))\r
-                               return strncmp16 (toCompare, str.text16 (), n);\r
-                       else\r
-                               return strnicmp16 (toCompare, str.text16 (), n);\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (isWide)\r
-               {\r
-                       String tmp (str.text8 ());\r
-                       if (tmp.toWideString () == false)\r
-                               return -1;\r
-                       return compareAt (index, tmp, n, mode);\r
-               }\r
-               else\r
-               {\r
-                       String tmp (text8 ());\r
-                       if (tmp.toWideString () == false)\r
-                               return 1;\r
-                       return tmp.compareAt (index, str, n, mode);\r
-               }\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Steinberg::int32 ConstString::naturalCompare (const ConstString& str, CompareMode mode /*= kCaseSensitive*/) const\r
-{\r
-       if (str.isEmpty ())\r
-       {\r
-               if (isEmpty ())\r
-                       return 0;\r
-               return 1;\r
-       }\r
-       else if (isEmpty ())\r
-               return -1;\r
-\r
-       if (!isWide && !str.isWide)\r
-               return strnatcmp8 (buffer8, str.text8 (), isCaseSensitive (mode));\r
-       else if (isWide && str.isWide)\r
-               return strnatcmp16 (buffer16, str.text16 (), isCaseSensitive (mode));\r
-       else\r
-       {\r
-               if (isWide)\r
-               {\r
-                       String tmp (str.text8 ());\r
-                       tmp.toWideString ();\r
-                       return strnatcmp16 (buffer16, tmp.text16 (), isCaseSensitive (mode));\r
-               }\r
-               else\r
-               {\r
-                       String tmp (text8 ());\r
-                       tmp.toWideString ();\r
-                       return strnatcmp16 (tmp.text16 (), str.text16 (), isCaseSensitive (mode));\r
-               }\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::startsWith (const ConstString& str, CompareMode mode /*= kCaseSensitive*/) const\r
-{\r
-       if (str.isEmpty ())\r
-       {\r
-               return isEmpty ();\r
-       }\r
-       else if (isEmpty ())\r
-       {\r
-               return false;\r
-       }\r
-       if (length () < str.length ())\r
-       {\r
-               return false;\r
-       }\r
-       if (!isWide && !str.isWide)\r
-       {\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp (buffer8, str.buffer8, str.length ()) == 0;\r
-               return strnicmp (buffer8, str.buffer8, str.length ()) == 0;\r
-       }\r
-       else if (isWide && str.isWide)\r
-       {\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp16 (buffer16, str.buffer16, str.length ()) == 0;\r
-               return strnicmp16 (buffer16, str.buffer16, str.length ()) == 0;\r
-       }\r
-       else if (isWide)\r
-       {\r
-               String tmp (str.text8 ());\r
-               tmp.toWideString ();\r
-               if (tmp.length () > length ())\r
-                       return false;\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp16 (buffer16, tmp.buffer16, tmp.length ()) == 0;\r
-               return strnicmp16 (buffer16, tmp.buffer16, tmp.length ()) == 0;\r
-       }\r
-       else\r
-       {\r
-               String tmp (text8 ());\r
-               tmp.toWideString ();\r
-               if (str.length () > tmp.length ())\r
-                       return false;\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0;\r
-               return strnicmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::endsWith (const ConstString& str, CompareMode mode /*= kCaseSensitive*/) const\r
-{\r
-       if (str.isEmpty ())\r
-       {\r
-               return isEmpty ();\r
-       }\r
-       else if (isEmpty ())\r
-       {\r
-               return false;\r
-       }\r
-       if (length () < str.length ())\r
-       {\r
-               return false;\r
-       }\r
-       if (!isWide && !str.isWide)\r
-       {\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp (buffer8 + (length () - str.length ()), str.buffer8, str.length ()) == 0;\r
-               return strnicmp (buffer8 + (length () - str.length ()), str.buffer8, str.length ()) == 0;\r
-       }\r
-       else if (isWide && str.isWide)\r
-       {\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp16 (buffer16 + (length () - str.length ()), str.buffer16, str.length ()) == 0;\r
-               return strnicmp16 (buffer16 + (length () - str.length ()), str.buffer16, str.length ()) == 0;\r
-       }\r
-       else if (isWide)\r
-       {\r
-               String tmp (str.text8 ());\r
-               tmp.toWideString ();\r
-               if (tmp.length () > length ())\r
-                       return false;\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp16 (buffer16 + (length () - tmp.length ()), tmp.buffer16, tmp.length ()) == 0;\r
-               return strnicmp16 (buffer16 + (length () - tmp.length ()), tmp.buffer16, tmp.length ()) == 0;\r
-       }\r
-       else\r
-       {\r
-               String tmp (text8 ());\r
-               tmp.toWideString ();\r
-               if (str.length () > tmp.length ())\r
-                       return false;\r
-               if (isCaseSensitive (mode))\r
-                       return strncmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0;\r
-               return strnicmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::contains (const ConstString& str, CompareMode m) const\r
-{\r
-       return findFirst (str, -1, m) != -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findNext (int32 startIndex, const ConstString& str, int32 n, CompareMode mode, int32 endIndex) const\r
-{\r
-       uint32 endLength = len;\r
-       if (endIndex > -1 && (uint32)endIndex < len)\r
-               endLength = endIndex + 1;\r
-\r
-       if (isWide && str.isWide)\r
-       {\r
-               if (startIndex < 0)\r
-                       startIndex = 0;\r
-\r
-               uint32 stringLength = str.length ();\r
-               n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-               if (n > 0)\r
-               {\r
-                       uint32 i = 0;\r
-\r
-                       if (isCaseSensitive (mode))\r
-                       {\r
-                               for (i = startIndex; i < endLength; i++)\r
-                                       if (strncmp16 (buffer16 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-                       else\r
-                       {\r
-                               for (i = startIndex; i < endLength; i++)\r
-                                       if (strnicmp16 (buffer16 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       }\r
-       else if (!isWide && !str.isWide)\r
-       {\r
-               uint32 stringLength = str.length ();\r
-               n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-               if (startIndex < 0)\r
-                       startIndex = 0;\r
-\r
-               if (n > 0)\r
-               {\r
-                       uint32 i = 0;\r
-\r
-                       if (isCaseSensitive (mode))\r
-                       {\r
-                               for (i = startIndex; i < endLength; i++)\r
-                                       if (strncmp (buffer8 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-                       else\r
-                       {\r
-                               for (i = startIndex; i < endLength; i++)\r
-                                       if (strnicmp (buffer8 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       }\r
-       String tmp;\r
-       if (isWide)\r
-       {\r
-               tmp = str.text8 ();\r
-               tmp.toWideString ();\r
-               return findNext (startIndex, tmp, n , mode, endIndex);\r
-       }\r
-       tmp = text8 ();\r
-       tmp.toWideString ();\r
-       return tmp.findNext (startIndex, str, n, mode, endIndex);\r
-}\r
-\r
-//------------------------------------------------------------------------------------------------\r
-int32 ConstString::findNext (int32 startIndex, char8 c, CompareMode mode, int32 endIndex) const\r
-{\r
-       uint32 endLength = len;\r
-       if (endIndex > -1 && (uint32)endIndex < len)\r
-               endLength = endIndex + 1;\r
-\r
-       if (isWide)\r
-       {\r
-               char8 src[] = {c, 0};\r
-               char16 dest[8] = {0};\r
-               if (multiByteToWideString (dest, src, 2) > 0)\r
-                       return findNext (startIndex, dest[0], mode, endIndex);\r
-               return -1;\r
-       }\r
-\r
-       if (startIndex < 0)\r
-               startIndex = 0;\r
-       uint32 i;\r
-\r
-       if (isCaseSensitive (mode))\r
-       {\r
-               for (i = startIndex; i < endLength; i++)\r
-               {\r
-                       if (buffer8[i] == c)\r
-                               return i;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               c = toLower (c);\r
-               for (i = startIndex; i < endLength; i++)\r
-               {\r
-                       if (toLower (buffer8[i]) == c)\r
-                               return i;\r
-               }\r
-       }\r
-       return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findNext (int32 startIndex, char16 c, CompareMode mode, int32 endIndex) const\r
-{\r
-       uint32 endLength = len;\r
-       if (endIndex > -1 && (uint32)endIndex < len)\r
-               endLength = endIndex + 1;\r
-\r
-       if (!isWide)\r
-       {\r
-               char16 src[] = {c, 0};\r
-               char8 dest[8] = {0};\r
-               if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
-                       return findNext (startIndex, dest[0], mode, endIndex);\r
-\r
-               return -1;\r
-       }\r
-\r
-       uint32 i;\r
-       if (startIndex < 0)\r
-               startIndex = 0;\r
-\r
-       if (isCaseSensitive (mode))\r
-       {\r
-               for (i = startIndex; i < endLength; i++)\r
-               {\r
-                       if (buffer16[i] == c)\r
-                               return i;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               c = toLower (c);\r
-               for (i = startIndex; i < endLength; i++)\r
-               {\r
-                       if (toLower (buffer16[i]) == c)\r
-                               return i;\r
-               }\r
-       }\r
-       return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findPrev (int32 startIndex, char8 c, CompareMode mode) const\r
-{\r
-       if (len == 0)\r
-               return -1;\r
-\r
-       if (isWide)\r
-       {\r
-               char8 src[] = {c, 0};\r
-               char16 dest[8] = {0};\r
-               if (multiByteToWideString (dest, src, 2) > 0)\r
-                       return findPrev (startIndex, dest[0], mode);\r
-               return -1;\r
-       }\r
-\r
-       if (startIndex < 0 || startIndex > (int32)len)\r
-               startIndex = len;\r
-\r
-       int32 i;\r
-\r
-       if (isCaseSensitive (mode))\r
-       {\r
-               for (i = startIndex; i >= 0; i--)\r
-               {\r
-                       if (buffer8[i] == c)\r
-                               return i;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               c = toLower (c);\r
-               for (i = startIndex; i >= 0; i--)\r
-               {\r
-                       if (toLower (buffer8[i]) == c)\r
-                               return i;\r
-               }\r
-       }\r
-       return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findPrev (int32 startIndex, char16 c, CompareMode mode) const\r
-{\r
-       if (len == 0)\r
-               return -1;\r
-\r
-       if (!isWide)\r
-       {\r
-               char16 src[] = {c, 0};\r
-               char8 dest[8] = {0};\r
-               if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
-                       return findPrev (startIndex, dest[0], mode);\r
-\r
-               return -1;\r
-       }\r
-\r
-       if (startIndex < 0 || startIndex > (int32)len)\r
-               startIndex = len;\r
-\r
-       int32 i;\r
-\r
-       if (isCaseSensitive (mode))\r
-       {\r
-               for (i = startIndex; i >= 0; i--)\r
-               {\r
-                       if (buffer16[i] == c)\r
-                               return i;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               c = toLower (c);\r
-               for (i = startIndex; i >= 0; i--)\r
-               {\r
-                       if (toLower (buffer16[i]) == c)\r
-                               return i;\r
-               }\r
-       }\r
-       return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findPrev (int32 startIndex, const ConstString& str, int32 n, CompareMode mode) const\r
-{\r
-       if (isWide && str.isWide)\r
-       {\r
-               uint32 stringLength = str.length ();\r
-               n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-               if (startIndex < 0 || startIndex >= (int32)len)\r
-                       startIndex = len - 1;\r
-\r
-               if (n > 0)\r
-               {\r
-                       int32 i = 0;\r
-\r
-                       if (isCaseSensitive (mode))\r
-                       {\r
-                               for (i = startIndex; i >= 0; i--)\r
-                                       if (strncmp16 (buffer16 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-                       else\r
-                       {\r
-                               for (i = startIndex; i >= 0; i--)\r
-                                       if (strnicmp16 (buffer16 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       }\r
-       else if (!isWide && !str.isWide)\r
-       {\r
-               uint32 stringLength = str.length ();\r
-               n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-               if (startIndex < 0 || startIndex >= (int32)len)\r
-                       startIndex = len - 1;\r
-\r
-               if (n > 0)\r
-               {\r
-                       int32 i = 0;\r
-\r
-                       if (isCaseSensitive (mode))\r
-                       {\r
-                               for (i = startIndex; i >= 0; i--)\r
-                                       if (strncmp (buffer8 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-                       else\r
-                       {\r
-                               for (i = startIndex; i >= 0; i--)\r
-                                       if (strnicmp (buffer8 + i, str, n) == 0)\r
-                                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       }\r
-       if (isWide)\r
-       {\r
-               String tmp (str.text8 ());\r
-               tmp.toWideString ();\r
-               return findPrev (startIndex, tmp, n, mode);\r
-       }\r
-       String tmp (text8 ());\r
-       tmp.toWideString ();\r
-       return tmp.findPrev (startIndex, str, n, mode);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::countOccurences (char8 c, uint32 startIndex, CompareMode mode) const\r
-{\r
-       if (isWide)\r
-       {\r
-               char8 src[] = {c, 0};\r
-               char16 dest[8] = {0};\r
-               if (multiByteToWideString (dest, src, 2) > 0)\r
-                       return countOccurences (dest[0], startIndex, mode);\r
-               return -1;\r
-       }\r
-\r
-       int32 result = 0;\r
-       int32 next = startIndex;\r
-       while (true)\r
-       {\r
-               next = findNext (next, c, mode);\r
-               if (next >= 0)\r
-               {\r
-                       next++;\r
-                       result++;\r
-               }\r
-               else\r
-                       break;\r
-       }\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::countOccurences (char16 c, uint32 startIndex, CompareMode mode) const\r
-{\r
-       if (!isWide)\r
-       {\r
-               char16 src[] = {c, 0};\r
-               char8 dest[8] = {0};\r
-               if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
-                       return countOccurences (dest[0], startIndex, mode);\r
-\r
-               return -1;\r
-       }\r
-       int32 result = 0;\r
-       int32 next = startIndex;\r
-       while (true)\r
-       {\r
-               next = findNext (next, c, mode);\r
-               if (next >= 0)\r
-               {\r
-                       next++;\r
-                       result++;\r
-               }\r
-               else\r
-                       break;\r
-       }\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::getFirstDifferent (const ConstString& str, CompareMode mode) const\r
-{\r
-       if (str.isWide != isWide)\r
-       {\r
-               if (isWide)\r
-               {\r
-                       String tmp (str.text8 ());\r
-                       if (tmp.toWideString () == false)\r
-                               return -1;\r
-                       return getFirstDifferent (tmp, mode);\r
-               }\r
-               else\r
-               {\r
-                       String tmp (text8 ());\r
-                       if (tmp.toWideString () == false)\r
-                               return -1;\r
-                       return tmp.getFirstDifferent (str, mode);\r
-               }\r
-       }\r
-\r
-       uint32 len1 = len;\r
-       uint32 len2 = str.len;\r
-       uint32 i;\r
-\r
-       if (isWide)\r
-       {\r
-               if (isCaseSensitive (mode))\r
-               {\r
-                       for (i = 0; i <= len1 && i <= len2; i++)\r
-                       {\r
-                               if (buffer16[i] != str.buffer16[i])\r
-                                       return i;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       for (i = 0; i <= len1 && i <= len2; i++)\r
-                       {\r
-                               if (toLower (buffer16[i]) != toLower (str.buffer16[i]))\r
-                                       return i;\r
-                       }\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (isCaseSensitive (mode))\r
-               {\r
-                       for (i = 0; i <= len1 && i <= len2; i++)\r
-                       {\r
-                               if (buffer8[i] != str.buffer8[i])\r
-                                       return i;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       for (i = 0; i <= len1 && i <= len2; i++)\r
-                       {\r
-                               if (toLower (buffer8[i]) != toLower (str.buffer8[i]))\r
-                                       return i;\r
-                       }\r
-               }\r
-       }\r
-       return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64 (int64& value, uint32 offset, bool scanToEnd) const\r
-{\r
-       if (isEmpty () || offset >= len)\r
-               return false;\r
-\r
-       if (isWide)\r
-               return scanInt64_16 (buffer16 + offset, value, scanToEnd);\r
-       else\r
-               return scanInt64_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64 (uint64& value, uint32 offset, bool scanToEnd) const\r
-{\r
-       if (isEmpty () || offset >= len)\r
-               return false;\r
-\r
-       if (isWide)\r
-               return scanUInt64_16 (buffer16 + offset, value, scanToEnd);\r
-       else\r
-               return scanUInt64_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex (uint8& value, uint32 offset, bool scanToEnd) const\r
-{\r
-       if (isEmpty () || offset >= len)\r
-               return false;\r
-\r
-       if (isWide)\r
-               return scanHex_16 (buffer16 + offset, value, scanToEnd);\r
-       else\r
-               return scanHex_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt32 (int32& value, uint32 offset, bool scanToEnd) const\r
-{\r
-       if (isEmpty () || offset >= len)\r
-               return false;\r
-\r
-       if (isWide)\r
-               return scanInt32_16 (buffer16 + offset, value, scanToEnd);\r
-       else\r
-               return scanInt32_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt32 (uint32& value, uint32 offset, bool scanToEnd) const\r
-{\r
-       if (isEmpty () || offset >= len)\r
-               return false;\r
-\r
-       if (isWide)\r
-               return scanUInt32_16 (buffer16 + offset, value, scanToEnd);\r
-       else\r
-               return scanUInt32_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64_8 (const char8* text, int64& value, bool scanToEnd)\r
-{\r
-       while (text && text[0])\r
-       {\r
-               if (sscanf (text, "%" FORMAT_INT64A, &value) == 1)\r
-                       return true;\r
-               else if (scanToEnd == false)\r
-                       return false;\r
-               text++;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64_16 (const char16* text, int64& value, bool scanToEnd)\r
-{\r
-       if (text && text[0])\r
-       {\r
-               String str (text);\r
-               str.toMultiByte (kCP_Default);\r
-               return scanInt64_8 (str, value, scanToEnd);\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64_8 (const char8* text, uint64& value, bool scanToEnd)\r
-{\r
-       while (text && text[0])\r
-       {\r
-               if (sscanf (text, "%" FORMAT_UINT64A, &value) == 1)\r
-                       return true;\r
-               else if (scanToEnd == false)\r
-                       return false;\r
-               text++;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64_16 (const char16* text, uint64& value, bool scanToEnd)\r
-{\r
-       if (text && text[0])\r
-       {\r
-               String str (text);\r
-               str.toMultiByte (kCP_Default);\r
-               return scanUInt64_8 (str, value, scanToEnd);\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64 (const tchar* text, int64& value, bool scanToEnd)\r
-{\r
-#ifdef UNICODE\r
-       return scanInt64_16 (text, value,scanToEnd);\r
-#else\r
-       return scanInt64_8 (text, value, scanToEnd);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64 (const tchar* text, uint64& value, bool scanToEnd)\r
-{\r
-#ifdef UNICODE\r
-       return scanUInt64_16 (text, value, scanToEnd);\r
-#else\r
-       return scanUInt64_8 (text, value, scanToEnd);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex_8 (const char8* text, uint8& value, bool scanToEnd)\r
-{\r
-       while (text && text[0])\r
-       {\r
-               unsigned int v; // scanf expects an unsigned int for %x\r
-               if (sscanf (text, "%x", &v) == 1)\r
-               {\r
-                       value = (uint8)v;\r
-                       return true;\r
-               }\r
-               else if (scanToEnd == false)\r
-                       return false;\r
-               text++;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex_16 (const char16* text, uint8& value, bool scanToEnd)\r
-{\r
-       if (text && text[0])\r
-       {\r
-               String str (text);\r
-               str.toMultiByte (kCP_Default); // scanf uses default codepage\r
-               return scanHex_8 (str, value, scanToEnd);\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex (const tchar* text, uint8& value, bool scanToEnd)\r
-{\r
-#ifdef UNICODE\r
-       return scanHex_16 (text, value, scanToEnd);\r
-#else\r
-       return scanHex_8 (text, value, scanToEnd);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanFloat (double& value, uint32 offset, bool scanToEnd) const\r
-{\r
-       if (isEmpty () || offset >= len)\r
-               return false;\r
-\r
-       String str (*this);\r
-       int32 pos = -1;\r
-       if (isWide)\r
-       {\r
-               if ((pos = str.findNext (offset, STR(','))) >= 0 && ((uint32)pos) >= offset)\r
-                       str.setChar (pos, STR('.'));\r
-\r
-               str.toMultiByte (kCP_Default); // scanf uses default codepage\r
-       }\r
-       else\r
-       {\r
-               if ((pos = str.findNext (offset, ',')) >= 0 && ((uint32)pos) >= offset)\r
-                       str.setChar (pos, '.');\r
-       }\r
-\r
-       const char8* txt = str.text8 () + offset;\r
-       while (txt && txt[0])\r
-       {\r
-               if (sscanf (txt, "%lf", &value) == 1)\r
-                       return true;\r
-               else if (scanToEnd == false)\r
-                       return false;\r
-               txt++;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char16 ConstString::toLower (char16 c)\r
-{\r
-       #if SMTG_OS_WINDOWS\r
-               WCHAR temp[2] = {c, 0};\r
-        ::CharLowerW (temp);\r
-        return temp[0];\r
-       #elif SMTG_OS_MACOS\r
-               // only convert characters which in lowercase are also single characters\r
-               UniChar characters [2] = {0};\r
-               characters[0] = c;\r
-               CFMutableStringRef str = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, characters, 1, 2, kCFAllocatorNull);\r
-               if (str)\r
-               {\r
-                       CFStringLowercase (str, NULL);\r
-                       CFRelease (str);\r
-                       if (characters[1] == 0)\r
-                               return characters[0];\r
-               }\r
-               return c;\r
-       #elif SMTG_OS_LINUX\r
-       #warning DEPRECATED No Linux implementation\r
-       assert(false && "DEPRECATED No Linux implementation");\r
-               return c;\r
-       #else\r
-               return towlower (c);\r
-       #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char16 ConstString::toUpper (char16 c)\r
-{\r
-       #if SMTG_OS_WINDOWS\r
-               WCHAR temp[2] = {c, 0};\r
-        ::CharUpperW (temp);\r
-        return temp[0];\r
-       #elif SMTG_OS_MACOS\r
-               // only convert characters which in uppercase are also single characters (don't translate a sharp-s which would result in SS)\r
-               UniChar characters [2] = {0};\r
-               characters[0] = c;\r
-               CFMutableStringRef str = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, characters, 1, 2, kCFAllocatorNull);\r
-               if (str)\r
-               {\r
-                       CFStringUppercase (str, NULL);\r
-                       CFRelease (str);\r
-                       if (characters[1] == 0)\r
-                               return characters[0];\r
-               }\r
-               return c;\r
-    #elif SMTG_OS_LINUX\r
-       #warning DEPRECATED No Linux implementation\r
-       assert(false && "DEPRECATED No Linux implementation");\r
-               return c;\r
-       #else\r
-               return towupper (c);\r
-       #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char8 ConstString::toLower (char8 c)\r
-{\r
-       if ((c >= 'A') && (c <= 'Z'))\r
-               return c + ('a' - 'A');\r
-       #if SMTG_OS_WINDOWS\r
-               CHAR temp[2] = {c, 0};\r
-        ::CharLowerA (temp);\r
-        return temp[0];\r
-       #else\r
-               return tolower (c);\r
-       #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char8 ConstString::toUpper (char8 c)\r
-{\r
-       if ((c >= 'a') && (c <= 'z'))\r
-               return c - ('a' - 'A');\r
-       #if SMTG_OS_WINDOWS\r
-               CHAR temp[2] = {c, 0};\r
-        ::CharUpperA (temp);\r
-        return temp[0];\r
-       #else\r
-               return toupper (c);\r
-       #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharSpace (const char8 character)\r
-{\r
-       return isspace (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharSpace (const char16 character)\r
-{\r
-       switch (character)\r
-       {\r
-               case 0x0020:\r
-               case 0x00A0:\r
-               case 0x2002:\r
-               case 0x2003:\r
-               case 0x2004:\r
-               case 0x2005:\r
-               case 0x2006:\r
-               case 0x2007:\r
-               case 0x2008:\r
-               case 0x2009:\r
-               case 0x200A:\r
-               case 0x200B:\r
-               case 0x202F:\r
-               case 0x205F:\r
-               case 0x3000:\r
-                       return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlpha (const char8 character)\r
-{\r
-       return isalpha (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlpha (const char16 character)\r
-{\r
-       return iswalpha (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlphaNum (const char8 character)\r
-{\r
-       return isalnum (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlphaNum (const char16 character)\r
-{\r
-       return iswalnum (character) != 0; // this may not work on macOSX when another locale is set inside the c-lib\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharDigit (const char8 character)\r
-{\r
-       return isdigit (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharDigit (const char16 character)\r
-{\r
-       return iswdigit (character) != 0;       // this may not work on macOSX when another locale is set inside the c-lib\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAscii (char8 character)\r
-{\r
-       return character >= 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAscii (char16 character)\r
-{\r
-       return character < 128;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharUpper (char8 character)\r
-{\r
-       return toUpper (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharUpper (char16 character)\r
-{\r
-       return toUpper (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharLower (char8 character)\r
-{\r
-       return toLower (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharLower (char16 character)\r
-{\r
-       return toLower (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isDigit (uint32 index) const\r
-{\r
-       if (isEmpty () || index >= len)\r
-               return false;\r
-\r
-       if (isWide)\r
-               return ConstString::isCharDigit (buffer16[index]);\r
-       else\r
-               return ConstString::isCharDigit (buffer8[index]);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::getTrailingNumberIndex (uint32 width) const\r
-{\r
-       if (isEmpty ())\r
-               return -1;\r
-\r
-       int32 endIndex = len - 1;\r
-       int32 i = endIndex;\r
-       while (isDigit ((uint32) i) && i >= 0)\r
-               i--;\r
-\r
-       // now either all are digits or i is on the first non digit\r
-       if (i < endIndex)\r
-       {\r
-               if (width > 0 && (endIndex - i != static_cast<int32> (width)))\r
-                       return -1;\r
-\r
-               return i + 1;\r
-       }\r
-\r
-       return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int64 ConstString::getTrailingNumber (int64 fallback) const\r
-{\r
-       int32 index = getTrailingNumberIndex ();\r
-\r
-       int64 number = 0;\r
-\r
-       if (index >= 0)\r
-               if (scanInt64 (number, index))\r
-                       return number;\r
-\r
-       return fallback;\r
-}\r
-\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-void ConstString::toVariant (FVariant& var) const\r
-{\r
-       if (isWide)\r
-       {\r
-               var.setString16 (buffer16);\r
-       }\r
-       else\r
-       {\r
-               var.setString8 (buffer8);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isAsciiString () const\r
-{\r
-       uint32 i;\r
-       if (isWide)\r
-       {\r
-               for (i = 0; i < len; i++)\r
-                       if (ConstString::isCharAscii (buffer16 [i]) == false)\r
-                               return false;\r
-       }\r
-       else\r
-       {\r
-               for (i = 0; i < len; i++)\r
-                       if (ConstString::isCharAscii (buffer8 [i]) == false)\r
-                               return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-\r
-#if SMTG_OS_MACOS\r
-uint32 kDefaultSystemEncoding = kCFStringEncodingMacRoman;\r
-//-----------------------------------------------------------------------------\r
-static CFStringEncoding MBCodePageToCFStringEncoding (uint32 codePage)\r
-{\r
-       switch (codePage)\r
-       {\r
-               case kCP_ANSI:          return kDefaultSystemEncoding; // MacRoman or JIS\r
-               case kCP_MAC_ROMAN:     return kCFStringEncodingMacRoman;\r
-               case kCP_ANSI_WEL:      return kCFStringEncodingWindowsLatin1;\r
-               case kCP_MAC_CEE:       return kCFStringEncodingMacCentralEurRoman;\r
-               case kCP_Utf8:          return kCFStringEncodingUTF8;\r
-               case kCP_ShiftJIS:      return kCFStringEncodingShiftJIS_X0213_00;\r
-               case kCP_US_ASCII:      return kCFStringEncodingASCII;\r
-       }\r
-       return kCFStringEncodingASCII;\r
-}\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::multiByteToWideString (char16* dest, const char8* source, int32 charCount, uint32 sourceCodePage)\r
-{\r
-       if (source == 0 || source[0] == 0)\r
-       {\r
-               if (dest && charCount > 0)\r
-               {\r
-                       dest[0] = 0;\r
-               }\r
-               return 0;\r
-       }\r
-       int32 result = 0;\r
-#if SMTG_OS_WINDOWS\r
-       result = MultiByteToWideChar (sourceCodePage, MB_ERR_INVALID_CHARS, source, -1, dest, charCount);\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-       CFStringRef cfStr =\r
-           (CFStringRef)::toCFStringRef (source, MBCodePageToCFStringEncoding (sourceCodePage));\r
-       if (cfStr)\r
-       {\r
-               CFRange range = {0, CFStringGetLength (cfStr)};\r
-               CFIndex usedBytes;\r
-               if (CFStringGetBytes (cfStr, range, kCFStringEncodingUnicode, ' ', false, (UInt8*)dest,\r
-                                     charCount * 2, &usedBytes) > 0)\r
-               {\r
-                       result = static_cast<int32> (usedBytes / 2 + 1);\r
-                       if (dest)\r
-                               dest[usedBytes / 2] = 0;\r
-               }\r
-\r
-               CFRelease (cfStr);\r
-       }\r
-#endif\r
-\r
-#if SMTG_OS_LINUX\r
-       if (sourceCodePage == kCP_ANSI || sourceCodePage == kCP_Utf8)\r
-       {\r
-               if (dest == nullptr)\r
-               {\r
-                       auto state = std::mbstate_t ();\r
-                       auto maxChars = charCount ? charCount : std::numeric_limits<int32>::max () - 1;\r
-                       result = converterFacet ().length (state, source, source + strlen (source), maxChars);\r
-               }\r
-               else\r
-               {\r
-                       auto utf16Str = converter ().from_bytes (source);\r
-                       if (!utf16Str.empty ())\r
-                       {\r
-                               result = std::min<int32> (charCount, utf16Str.size ());\r
-                               memcpy (dest, utf16Str.data (), result * sizeof (char16));\r
-                               dest[result] = 0;\r
-                       }\r
-               }\r
-       }\r
-       else\r
-       {\r
-#warning DEPRECATED No Linux implementation\r
-               assert(false && "DEPRECATED No Linux implementation");\r
-       }\r
-\r
-#endif\r
-\r
-       SMTG_ASSERT (result > 0)\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::wideStringToMultiByte (char8* dest, const char16* wideString, int32 charCount, uint32 destCodePage)\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       return WideCharToMultiByte (destCodePage, 0, wideString, -1, dest, charCount, 0, 0);\r
-\r
-#elif SMTG_OS_MACOS\r
-       int32 result = 0;\r
-       if (wideString != 0)\r
-       {\r
-               if (dest)\r
-               {\r
-                       CFStringRef cfStr = CFStringCreateWithCharactersNoCopy (kCFAllocator, (const UniChar*)wideString, strlen16 (wideString), kCFAllocatorNull);\r
-                       if (cfStr)\r
-                       {\r
-                               if (fromCFStringRef (dest, charCount, cfStr, MBCodePageToCFStringEncoding (destCodePage)))\r
-                                       result = static_cast<int32> (strlen (dest) + 1);\r
-                               CFRelease (cfStr);\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       return static_cast<int32> (CFStringGetMaximumSizeForEncoding (strlen16 (wideString), MBCodePageToCFStringEncoding (destCodePage)));\r
-               }\r
-       }\r
-       return result;\r
-\r
-#elif SMTG_OS_LINUX\r
-       int32 result = 0;\r
-       if (destCodePage == kCP_Utf8)\r
-       {\r
-               if (dest == nullptr)\r
-               {\r
-                       auto maxChars = charCount ? charCount : tstrlen (wideString);\r
-                       result = converterFacet ().max_length () * maxChars;\r
-               }\r
-               else\r
-               {\r
-                       auto utf8Str = converter ().to_bytes (wideString);\r
-                       if (!utf8Str.empty ())\r
-                       {\r
-                               result = std::min<int32> (charCount, utf8Str.size ());\r
-                               memcpy (dest, utf8Str.data (), result * sizeof (char8));\r
-                               dest[result] = 0;\r
-                       }\r
-               }\r
-       }\r
-       else if (destCodePage == kCP_ANSI)\r
-       {\r
-               if (dest == nullptr)\r
-               {\r
-                       result = strlen16 (wideString) + 1;\r
-               }\r
-               else\r
-               {\r
-                       int32 i = 0;\r
-                       for (; i < charCount; ++i)\r
-                       {\r
-                               if (wideString[i] == 0)\r
-                                       break;\r
-                               if (wideString[i] <= 0x007F)\r
-                                       dest[i] = wideString[i];\r
-                               else\r
-                                       dest[i] = '_';\r
-                       }\r
-                       dest[i] = 0;\r
-                       result = i;\r
-               }\r
-       }\r
-       else\r
-       {\r
-#warning DEPRECATED No Linux implementation\r
-               assert(false && "DEPRECATED No Linux implementation");\r
-       }\r
-       return result;\r
-\r
-#else\r
-#warning DEPRECATED No Linux implementation\r
-       assert(false && "DEPRECATED No Linux implementation");\r
-       return 0;\r
-#endif\r
-\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isNormalized (UnicodeNormalization n)\r
-{\r
-       if (isWide == false)\r
-               return false;\r
-\r
-#if SMTG_OS_WINDOWS\r
-#ifdef UNICODE\r
-       if (n != kUnicodeNormC)\r
-               return false;\r
-       uint32 normCharCount = static_cast<uint32> (FoldString (MAP_PRECOMPOSED, buffer16, len, 0, 0));\r
-       return (normCharCount == len);\r
-#else\r
-       return false;\r
-#endif\r
-\r
-#elif SMTG_OS_MACOS\r
-       if (n != kUnicodeNormC)\r
-               return false;\r
-\r
-       CFStringRef cfStr = (CFStringRef)toCFStringRef ();\r
-       CFIndex charCount = CFStringGetLength (cfStr);\r
-       CFRelease (cfStr);\r
-       return (charCount == len);\r
-#else\r
-       return false;\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-//     String\r
-//-----------------------------------------------------------------------------\r
-String::String ()\r
-{\r
-       isWide = kWideStringDefault ? 1 : 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const char8* str, MBCodePage codePage, int32 n, bool isTerminated)\r
-{\r
-       isWide = 0;\r
-       if (str)\r
-       {\r
-               assign (str, n, isTerminated);\r
-               toWideString (codePage);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const char8* str, int32 n, bool isTerminated)\r
-{\r
-       if (str)\r
-               assign (str, n, isTerminated);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const char16* str, int32 n, bool isTerminated)\r
-{\r
-       isWide = 1;\r
-       if (str)\r
-               assign (str, n, isTerminated);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const String& str, int32 n)\r
-{\r
-       isWide = str.isWideString ();\r
-       if (!str.isEmpty ())\r
-               assign (str, n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const ConstString& str, int32 n)\r
-{\r
-       isWide = str.isWideString ();\r
-       if (!str.isEmpty ())\r
-               assign (str, n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const FVariant& var)\r
-{\r
-       isWide = kWideStringDefault ? 1 : 0;\r
-       fromVariant (var);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (IString* str)\r
-{\r
-       isWide = str->isWideString ();\r
-       if (isWide)\r
-               assign (str->getText16 ());\r
-       else\r
-               assign (str->getText8 ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::~String ()\r
-{\r
-       if (buffer)\r
-               resize (0, false);\r
-}\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-//-----------------------------------------------------------------------------\r
-String::String (String&& str)\r
-{\r
-       *this = std::move (str);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::operator= (String&& str)\r
-{\r
-       SMTG_ASSERT (buffer == 0 || buffer != str.buffer);\r
-       tryFreeBuffer ();\r
-\r
-       isWide = str.isWide;\r
-       buffer = str.buffer;\r
-       len = str.len;\r
-       str.buffer = nullptr;\r
-       str.len = 0;\r
-       return *this;\r
-}\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::updateLength ()\r
-{\r
-       if (isWide)\r
-               len = strlen16 (text16 ());\r
-       else\r
-               len = strlen8 (text8 ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::toWideString (uint32 sourceCodePage)\r
-{\r
-       if (!isWide)\r
-       {\r
-               if (buffer8 && len > 0)\r
-               {\r
-                       int32 bytesNeeded = multiByteToWideString (0, buffer8, 0, sourceCodePage) * sizeof (char16);\r
-                       if (bytesNeeded)\r
-                       {\r
-                               bytesNeeded += sizeof (char16);\r
-                               char16* newStr = (char16*) malloc (bytesNeeded);\r
-                               if (multiByteToWideString (newStr, buffer8, len + 1, sourceCodePage) <= 0)\r
-                               {\r
-                                       free (newStr);\r
-                                       return false;\r
-                               }\r
-                               free (buffer8);\r
-                               buffer16 = newStr;\r
-                               isWide = true;\r
-                               updateLength ();\r
-                       }\r
-                       else\r
-                       {\r
-                               return false;\r
-                       }\r
-               }\r
-               isWide = true;\r
-       }\r
-       return true;\r
-}\r
-\r
-#define SMTG_STRING_CHECK_CONVERSION 1\r
-#define SMTG_STRING_CHECK_CONVERSION_NO_BREAK 1\r
-\r
-#if SMTG_STRING_CHECK_CONVERSION_NO_BREAK\r
-       #define SMTG_STRING_CHECK_MSG FDebugPrint\r
-#else\r
-       #define SMTG_STRING_CHECK_MSG FDebugBreak\r
-#endif\r
-//-----------------------------------------------------------------------------\r
-bool String::checkToMultiByte (uint32 destCodePage) const\r
-{\r
-       if (!isWide || isEmpty ())\r
-               return true;\r
-\r
-#if DEVELOPMENT && SMTG_STRING_CHECK_CONVERSION\r
-       int debugLen = length ();\r
-       int debugNonASCII = 0;\r
-       for (int32 i = 0; i < length (); i++)\r
-       {\r
-               if (buffer16[i] > 127)\r
-                       ++debugNonASCII;\r
-       }\r
-\r
-       String* backUp = nullptr;\r
-       if (debugNonASCII > 0)\r
-               backUp = NEW String (*this);\r
-#endif\r
-\r
-       // this should be avoided, since it can lead to information loss\r
-       bool result = const_cast <String&> (*this).toMultiByte (destCodePage);\r
-\r
-#if DEVELOPMENT && SMTG_STRING_CHECK_CONVERSION\r
-       if (backUp)\r
-       {\r
-               String temp (*this);\r
-               temp.toWideString (destCodePage);\r
-\r
-               if (temp != *backUp)\r
-               {\r
-                       backUp->toMultiByte (kCP_Utf8);\r
-                       SMTG_STRING_CHECK_MSG ("Indirect string conversion information loss !   %d/%d non ASCII chars:   \"%s\"   ->    \"%s\"\n", debugNonASCII, debugLen, backUp->buffer8, buffer8);\r
-               }\r
-               else\r
-                       SMTG_STRING_CHECK_MSG ("Indirect string potential conversion information loss !   %d/%d non ASCII chars   result: \"%s\"\n", debugNonASCII, debugLen, buffer8);\r
-\r
-               delete backUp;\r
-       }\r
-#endif\r
-\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::toMultiByte (uint32 destCodePage)\r
-{\r
-       if (isWide)\r
-       {\r
-               if (buffer16 && len > 0)\r
-               {\r
-                       int32 numChars = wideStringToMultiByte (0, buffer16, 0, destCodePage) + sizeof (char8);\r
-                       char8* newStr = (char8*) malloc (numChars * sizeof (char8));\r
-                       if (wideStringToMultiByte (newStr, buffer16, numChars, destCodePage) <= 0)\r
-                       {\r
-                               free (newStr);\r
-                               return false;\r
-                       }\r
-                       free (buffer16);\r
-                       buffer8 = newStr;\r
-                       isWide = false;\r
-                       updateLength ();\r
-               }\r
-               isWide = false;\r
-       }\r
-       else if (destCodePage != kCP_Default)\r
-       {\r
-               if (toWideString () == false)\r
-                       return false;\r
-               return toMultiByte (destCodePage);\r
-       }\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::fromUTF8 (const char8* utf8String)\r
-{\r
-       assign (utf8String);\r
-       toWideString (kCP_Utf8);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::normalize (UnicodeNormalization n)\r
-{\r
-       if (isWide == false)\r
-               return false;\r
-\r
-       if (buffer16 == 0)\r
-               return true;\r
-\r
-#if SMTG_OS_WINDOWS\r
-#ifdef UNICODE\r
-       if (n != kUnicodeNormC)\r
-               return false;\r
-\r
-       uint32 normCharCount = static_cast<uint32> (FoldString (MAP_PRECOMPOSED, buffer16, len, 0, 0));\r
-       if (normCharCount == len)\r
-               return true;\r
-\r
-       char16* newString = (char16*)malloc ((normCharCount + 1) * sizeof (char16));\r
-       uint32 converterCount = static_cast<uint32> (FoldString (MAP_PRECOMPOSED, buffer16, len, newString, normCharCount + 1));\r
-       if (converterCount != normCharCount)\r
-       {\r
-               free (newString);\r
-               return false;\r
-       }\r
-       newString [converterCount] = 0;\r
-       free (buffer16);\r
-       buffer16 = newString;\r
-       updateLength ();\r
-       return true;\r
-#else\r
-       return false;\r
-#endif\r
-\r
-#elif SMTG_OS_MACOS\r
-       CFMutableStringRef origStr = (CFMutableStringRef)toCFStringRef (0xFFFF, true);\r
-       if (origStr)\r
-       {\r
-               CFStringNormalizationForm normForm = kCFStringNormalizationFormD;\r
-               switch (n)\r
-               {\r
-                       case kUnicodeNormC: normForm = kCFStringNormalizationFormC; break;\r
-                       case kUnicodeNormD: normForm = kCFStringNormalizationFormD; break;\r
-                       case kUnicodeNormKC: normForm = kCFStringNormalizationFormKC; break;\r
-                       case kUnicodeNormKD: normForm = kCFStringNormalizationFormKD; break;\r
-               }\r
-               CFStringNormalize (origStr, normForm);\r
-               bool result = fromCFStringRef (origStr);\r
-               CFRelease (origStr);\r
-               return result;\r
-       }\r
-       return false;\r
-#else\r
-       return false;\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::tryFreeBuffer ()\r
-{\r
-       if (buffer)\r
-       {\r
-               free (buffer);\r
-               buffer = 0;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::resize (uint32 newLength, bool wide, bool fill)\r
-{\r
-       if (newLength == 0)\r
-       {\r
-               tryFreeBuffer ();\r
-               len = 0;\r
-               isWide = wide ? 1 : 0;\r
-       }\r
-       else\r
-       {\r
-               size_t newCharSize = wide ? sizeof (char16) : sizeof (char8);\r
-               size_t oldCharSize = (isWide != 0) ? sizeof (char16) : sizeof (char8);\r
-\r
-               size_t newBufferSize = (newLength + 1) * newCharSize;\r
-               size_t oldBufferSize = (len + 1) * oldCharSize;\r
-\r
-               isWide = wide ? 1 : 0;\r
-\r
-               if (buffer)\r
-               {\r
-                       if (newBufferSize != oldBufferSize)\r
-                       {\r
-                               void* newstr = realloc (buffer, newBufferSize);\r
-                               if (newstr == 0)\r
-                                       return false;\r
-                               buffer = newstr;\r
-                               if (isWide)\r
-                                       buffer16[newLength] = 0;\r
-                               else\r
-                                       buffer8[newLength] = 0;\r
-                       }\r
-                       else if (wide && newCharSize != oldCharSize)\r
-                               buffer16[newLength] = 0;\r
-               }\r
-               else\r
-               {\r
-                       void* newstr = malloc (newBufferSize);\r
-                       if (newstr == 0)\r
-                               return false;\r
-                       buffer = newstr;\r
-                       if (isWide)\r
-                       {\r
-                               buffer16[0] = 0;\r
-                               buffer16[newLength] = 0;\r
-                       }\r
-                       else\r
-                       {\r
-                               buffer8[0] = 0;\r
-                               buffer8[newLength] = 0;\r
-                       }\r
-               }\r
-\r
-               if (fill && len < newLength && buffer)\r
-               {\r
-                       if (isWide)\r
-                       {\r
-                               char16 c = ' ';\r
-                               for (uint32 i = len; i < newLength; i++)\r
-                                       buffer16 [i] = c;\r
-                       }\r
-                       else\r
-                       {\r
-                               memset (buffer8 + len, ' ', newLength - len);\r
-                       }\r
-               }\r
-       }\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::setChar8 (uint32 index, char8 c)\r
-{\r
-       if (index == len && c == 0)\r
-               return true;\r
-\r
-       if (index >= len)\r
-       {\r
-               if (c == 0)\r
-               {\r
-                       if (resize (index, isWide, true) == false)\r
-                               return false;\r
-                       len = index;\r
-                       return true;\r
-               }\r
-               else\r
-               {\r
-                       if (resize (index + 1, isWide, true) == false)\r
-                               return false;\r
-                       len = index + 1;\r
-               }\r
-       }\r
-\r
-       if (index < len && buffer)\r
-       {\r
-               if (isWide)\r
-               {\r
-                       if (c == 0)\r
-                               buffer16[index] = 0;\r
-                       else\r
-                       {\r
-                               char8 src[] = {c, 0};\r
-                               char16 dest[8] = {0};\r
-                               if (multiByteToWideString (dest, src, 2) > 0)\r
-                                       buffer16[index] = dest[0];\r
-                       }\r
-                       SMTG_ASSERT (buffer16[len] == 0)\r
-               }\r
-               else\r
-               {\r
-                       buffer8[index] = c;\r
-                       SMTG_ASSERT (buffer8[len] == 0)\r
-               }\r
-\r
-               if (c == 0)\r
-                       updateLength ();\r
-\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::setChar16 (uint32 index, char16 c)\r
-{\r
-       if (index == len && c == 0)\r
-               return true;\r
-\r
-       if (index >= len)\r
-       {\r
-               if (c == 0)\r
-               {\r
-                       if (resize (index, isWide, true) == false)\r
-                               return false;\r
-                       len = index;\r
-                       return true;\r
-               }\r
-               else\r
-               {\r
-                       if (resize (index + 1, isWide, true) == false)\r
-                               return false;\r
-                       len = index + 1;\r
-               }\r
-       }\r
-\r
-       if (index < len && buffer)\r
-       {\r
-               if (isWide)\r
-               {\r
-                       buffer16[index] = c;\r
-                       SMTG_ASSERT (buffer16[len] == 0)\r
-               }\r
-               else\r
-               {\r
-                       SMTG_ASSERT (buffer8[len] == 0)\r
-                       char16 src[] = {c, 0};\r
-                       char8 dest[8] = {0};\r
-                       if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
-                               buffer8[index] = dest[0];\r
-                       else\r
-                               return false;\r
-               }\r
-\r
-               if (c == 0)\r
-                       updateLength ();\r
-\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (const ConstString& str, int32 n)\r
-{\r
-       if (str.isWideString ())\r
-               return assign (str.text16 (), n < 0 ? str.length () : n);\r
-       else\r
-               return assign (str.text8 (), n < 0 ? str.length () : n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (const char8* str, int32 n, bool isTerminated)\r
-{\r
-       if (str == buffer8)\r
-               return *this;\r
-\r
-       if (isTerminated)\r
-       {\r
-               uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
-               n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-       }\r
-       else if (n < 0)\r
-               return *this;\r
-\r
-       if (resize (n, false))\r
-       {\r
-               if (buffer8 && n > 0)\r
-               {\r
-                       memcpy (buffer8, str, n * sizeof (char8));\r
-                       SMTG_ASSERT (buffer8[n] == 0)\r
-               }\r
-               isWide = 0;\r
-               len = n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (const char16* str, int32 n, bool isTerminated)\r
-{\r
-       if (str == buffer16)\r
-               return *this;\r
-\r
-       if (isTerminated)\r
-       {\r
-               uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
-               n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-       }\r
-       else if (n < 0)\r
-               return *this;\r
-\r
-       if (resize (n, true))\r
-       {\r
-               if (buffer16 && n > 0)\r
-               {\r
-                       memcpy (buffer16, str, n * sizeof (char16));\r
-                       SMTG_ASSERT (buffer16[n] == 0)\r
-               }\r
-               isWide = 1;\r
-               len = n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (char8 c, int32 n)\r
-{\r
-       if (resize (n, false))\r
-       {\r
-               if (buffer8 && n > 0)\r
-               {\r
-                       memset (buffer8, c, n * sizeof (char8));\r
-                       SMTG_ASSERT (buffer8[n] == 0)\r
-               }\r
-               isWide = 0;\r
-               len = n;\r
-       }\r
-       return *this;\r
-\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (char16 c, int32 n)\r
-{\r
-       if (resize (n, true))\r
-       {\r
-               if (buffer && n > 0)\r
-               {\r
-                       for (int32 i = 0; i < n; i++)\r
-                               buffer16[i] = c;\r
-                       SMTG_ASSERT (buffer16[n] == 0)\r
-               }\r
-               isWide = 1;\r
-               len = n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const ConstString& str, int32 n)\r
-{\r
-       if (str.isWideString ())\r
-               return append (str.text16 (), n);\r
-       else\r
-               return append (str.text8 (), n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char8* str, int32 n)\r
-{\r
-       if (str == buffer8)\r
-               return *this;\r
-\r
-       if (len == 0)\r
-               return assign (str, n);\r
-\r
-       if (isWide)\r
-       {\r
-               String tmp (str);\r
-               if (tmp.toWideString () == false)\r
-                       return *this;\r
-\r
-               return append (tmp.buffer16, n);\r
-       }\r
-\r
-       uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
-       n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-       if (n > 0)\r
-       {\r
-               int32 newlen = n + len;\r
-               if (!resize (newlen, false))\r
-                       return *this;\r
-\r
-               if (buffer)\r
-               {\r
-                       memcpy (buffer8 + len, str, n * sizeof (char8));\r
-                       SMTG_ASSERT (buffer8[newlen] == 0)\r
-               }\r
-\r
-               len += n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char16* str, int32 n)\r
-{\r
-       if (str == buffer16)\r
-               return *this;\r
-\r
-       if (len == 0)\r
-               return assign (str, n);\r
-\r
-       if (!isWide)\r
-       {\r
-               if (toWideString () == false)\r
-                       return *this;\r
-       }\r
-\r
-       uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
-       n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-       if (n > 0)\r
-       {\r
-               int32 newlen = n + len;\r
-               if (!resize (newlen, true))\r
-                       return *this;\r
-\r
-               if (buffer16)\r
-               {\r
-                       memcpy (buffer16 + len, str, n * sizeof (char16));\r
-                       SMTG_ASSERT (buffer16[newlen] == 0)\r
-               }\r
-\r
-               len += n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char8 c, int32 n)\r
-{\r
-       char8 str[] = {c, 0};\r
-       if (n == 1)\r
-       {\r
-               return append (str, 1);\r
-       }\r
-       else if (n > 1)\r
-       {\r
-               if (isWide)\r
-               {\r
-                       String tmp (str);\r
-                       if (tmp.toWideString () == false)\r
-                               return *this;\r
-\r
-                       return append (tmp.buffer16[0], n);\r
-               }\r
-\r
-               int32 newlen = n + len;\r
-               if (!resize (newlen, false))\r
-                       return *this;\r
-\r
-               if (buffer)\r
-               {\r
-                       memset (buffer8 + len, c, n * sizeof (char8));\r
-                       SMTG_ASSERT (buffer8[newlen] == 0)\r
-               }\r
-\r
-               len += n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char16 c, int32 n)\r
-{\r
-       if (n == 1)\r
-       {\r
-               char16 str[] = {c, 0};\r
-               return append (str, 1);\r
-       }\r
-       else if (n > 1)\r
-       {\r
-               if (!isWide)\r
-               {\r
-                       if (toWideString () == false)\r
-                               return *this;\r
-               }\r
-\r
-               int32 newlen = n + len;\r
-               if (!resize (newlen, true))\r
-                       return *this;\r
-\r
-               if (buffer16)\r
-               {\r
-                       for (int32 i = len; i < newlen; i++)\r
-                               buffer16[i] = c;\r
-                       SMTG_ASSERT (buffer16[newlen] == 0)\r
-               }\r
-\r
-               len += n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::insertAt (uint32 idx, const ConstString& str, int32 n)\r
-{\r
-       if (str.isWideString ())\r
-               return insertAt (idx, str.text16 (), n);\r
-       else\r
-               return insertAt (idx, str.text8 (), n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::insertAt (uint32 idx, const char8* str, int32 n)\r
-{\r
-       if (idx > len)\r
-               return *this;\r
-\r
-       if (isWide)\r
-       {\r
-               String tmp (str);\r
-               if (tmp.toWideString () == false)\r
-                       return *this;\r
-               return insertAt (idx, tmp.buffer16, n);\r
-       }\r
-\r
-       uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
-       n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-       if (n > 0)\r
-       {\r
-               int32 newlen = len + n;\r
-               if (!resize (newlen, false))\r
-                       return *this;\r
-\r
-               if (buffer)\r
-               {\r
-                       if (idx < len)\r
-                               memmove (buffer8 + idx + n, buffer8 + idx, (len - idx) * sizeof (char8));\r
-                       memcpy (buffer8 + idx, str, n * sizeof (char8));\r
-                       SMTG_ASSERT (buffer8[newlen] == 0)\r
-               }\r
-\r
-               len += n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::insertAt (uint32 idx, const char16* str, int32 n)\r
-{\r
-       if (idx > len)\r
-               return *this;\r
-\r
-       if (!isWide)\r
-       {\r
-               if (toWideString () == false)\r
-                       return *this;\r
-       }\r
-\r
-       uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
-       n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
-       if (n > 0)\r
-       {\r
-               int32 newlen = len + n;\r
-               if (!resize (newlen, true))\r
-                       return *this;\r
-\r
-               if (buffer)\r
-               {\r
-                       if (idx < len)\r
-                               memmove (buffer16 + idx + n, buffer16 + idx, (len - idx) * sizeof (char16));\r
-                       memcpy (buffer16 + idx, str, n * sizeof (char16));\r
-                       SMTG_ASSERT (buffer16[newlen] == 0)\r
-               }\r
-\r
-               len += n;\r
-       }\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::replace (uint32 idx, int32 n1, const ConstString& str, int32 n2)\r
-{\r
-       if (str.isWideString ())\r
-               return replace (idx, n1, str.text16 (), n2);\r
-       else\r
-               return replace (idx, n1, str.text8 (), n2);\r
-}\r
-\r
-// "replace" replaces n1 number of characters at the specified index with\r
-// n2 characters from the specified string.\r
-//-----------------------------------------------------------------------------\r
-String& String::replace (uint32 idx, int32 n1, const char8* str, int32 n2)\r
-{\r
-       if (idx > len || str == 0)\r
-               return *this;\r
-\r
-       if (isWide)\r
-       {\r
-               String tmp (str);\r
-               if (tmp.toWideString () == false)\r
-                       return *this;\r
-               if (tmp.length () == 0 || n2 == 0)\r
-                       return remove (idx, n1);\r
-               return replace (idx, n1, tmp.buffer16, n2);\r
-       }\r
-\r
-       if (n1 < 0 || idx + n1 > len)\r
-               n1 = len - idx;\r
-       if (n1 == 0)\r
-               return *this;\r
-\r
-       uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
-       n2 = n2 < 0 ? stringLength : Min<uint32> (n2, stringLength);\r
-\r
-       uint32 newlen = len - n1 + n2;\r
-       if (newlen > len)\r
-               if (!resize (newlen, false))\r
-                       return *this;\r
-\r
-       if (buffer)\r
-       {\r
-               memmove (buffer8 + idx + n2, buffer8 + idx + n1, (len - (idx + n1)) * sizeof (char8));\r
-               memcpy (buffer8 + idx, str, n2 * sizeof (char8));\r
-               buffer8[newlen] = 0;    // cannot be removed because resize is not called called in all cases (newlen > len)\r
-       }\r
-\r
-       len = newlen;\r
-\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::replace (uint32 idx, int32 n1, const char16* str, int32 n2)\r
-{\r
-       if (idx > len || str == 0)\r
-               return *this;\r
-\r
-       if (!isWide)\r
-       {\r
-               if (toWideString () == false)\r
-                       return *this;\r
-       }\r
-\r
-       if (n1 < 0 || idx + n1 > len)\r
-               n1 = len - idx;\r
-       if (n1 == 0)\r
-               return *this;\r
-\r
-       uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
-       n2 = n2 < 0 ? stringLength : Min<uint32> (n2, stringLength);\r
-\r
-       uint32 newlen = len - n1 + n2;\r
-       if (newlen > len)\r
-               if (!resize (newlen, true))\r
-                       return *this;\r
-\r
-       if (buffer)\r
-       {\r
-               memmove (buffer16 + idx + n2, buffer16 + idx + n1, (len - (idx + n1)) * sizeof (char16));\r
-               memcpy (buffer16 + idx, str, n2 * sizeof (char16));\r
-               buffer16[newlen] = 0;   // cannot be removed because resize is not called called in all cases (newlen > len)\r
-       }\r
-\r
-       len = newlen;\r
-\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 String::replace (const char8* toReplace, const char8* toReplaceWith, bool all, CompareMode m)\r
-{\r
-       if (toReplace == 0 || toReplaceWith == 0)\r
-               return 0;\r
-\r
-       int32 result = 0;\r
-\r
-       int32 idx = findFirst (toReplace, -1, m);\r
-       if (idx > -1)\r
-       {\r
-               int32 toReplaceLen = static_cast<int32> (strlen (toReplace));\r
-               int32 toReplaceWithLen = static_cast<int32> (strlen (toReplaceWith));\r
-               while (idx > -1)\r
-               {\r
-                       replace (idx, toReplaceLen, toReplaceWith, toReplaceWithLen);\r
-                       result++;\r
-\r
-                       if (all)\r
-                               idx = findNext (idx + toReplaceWithLen , toReplace, -1, m);\r
-                       else\r
-                               break;\r
-               }\r
-       }\r
-\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 String::replace (const char16* toReplace, const char16* toReplaceWith, bool all, CompareMode m)\r
-{\r
-       if (toReplace == 0 || toReplaceWith == 0)\r
-               return 0;\r
-\r
-       int32 result = 0;\r
-\r
-       int32 idx = findFirst (toReplace, -1, m);\r
-       if (idx > -1)\r
-       {\r
-               int32 toReplaceLen = strlen16 (toReplace);\r
-               int32 toReplaceWithLen = strlen16 (toReplaceWith);\r
-               while (idx > -1)\r
-               {\r
-                       replace (idx, toReplaceLen, toReplaceWith, toReplaceWithLen);\r
-                       result++;\r
-\r
-                       if (all)\r
-                               idx = findNext (idx + toReplaceWithLen, toReplace, -1, m);\r
-                       else\r
-                               break;\r
-               }\r
-       }\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T>\r
-static bool performReplace (T* str, const T* toReplace, T toReplaceBy)\r
-{\r
-       bool anyReplace = false;\r
-       T* p = str;\r
-       while (*p)\r
-       {\r
-               const T* rep = toReplace;\r
-               while (*rep)\r
-               {\r
-                       if (*p == *rep)\r
-                       {\r
-                               *p = toReplaceBy;\r
-                               anyReplace = true;\r
-                               break;\r
-                       }\r
-                       rep++;\r
-               }\r
-               p++;\r
-       }\r
-       return anyReplace;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::replaceChars8 (const char8* toReplace, char8 toReplaceBy)\r
-{\r
-       if (isEmpty ())\r
-               return false;\r
-\r
-       if (isWide)\r
-       {\r
-               String toReplaceW (toReplace);\r
-               if (toReplaceW.toWideString () == false)\r
-                       return false;\r
-\r
-               char8 src[] = {toReplaceBy, 0};\r
-               char16 dest[2] = {0};\r
-               if (multiByteToWideString (dest, src, 2) > 0)\r
-               {\r
-                       return replaceChars16 (toReplaceW.text16 (), dest[0]);\r
-               }\r
-               return false;\r
-       }\r
-\r
-       if (toReplaceBy == 0)\r
-               toReplaceBy = ' ';\r
-\r
-       return performReplace<char8> (buffer8, toReplace, toReplaceBy);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::replaceChars16 (const char16* toReplace, char16 toReplaceBy)\r
-{\r
-       if (isEmpty ())\r
-               return false;\r
-\r
-       if (!isWide)\r
-       {\r
-               String toReplaceA (toReplace);\r
-               if (toReplaceA.toMultiByte () == false)\r
-                       return false;\r
-\r
-               if (toReplaceA.length () > 1)\r
-               {\r
-                       SMTG_WARNING("cannot replace non ASCII chars on non Wide String")\r
-                       return false;\r
-               }\r
-\r
-               char16 src[] = {toReplaceBy, 0};\r
-               char8 dest[8] = {0};\r
-               if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
-                       return replaceChars8 (toReplaceA.text8 (), dest[0]);\r
-\r
-               return false;\r
-       }\r
-\r
-       if (toReplaceBy == 0)\r
-               toReplaceBy = STR16 (' ');\r
-\r
-       return performReplace<char16> (buffer16, toReplace, toReplaceBy);\r
-}\r
-\r
-// "remove" removes the specified number of characters from the string\r
-// starting at the specified index.\r
-//-----------------------------------------------------------------------------\r
-String& String::remove (uint32 idx, int32 n)\r
-{\r
-       if (isEmpty () || idx >= len || n == 0)\r
-               return *this;\r
-\r
-       if ((idx + n > len) || n < 0)\r
-               n = len - idx;\r
-       else\r
-       {\r
-               int32 toMove = len - idx - n;\r
-               if (buffer)\r
-               {\r
-                       if (isWide)\r
-                               memmove (buffer16 + idx, buffer16 + idx + n, toMove * sizeof (char16));\r
-                       else\r
-                               memmove (buffer8 + idx, buffer8 + idx + n, toMove * sizeof (char8));\r
-               }\r
-       }\r
-\r
-       resize (len - n, isWide);\r
-       updateLength ();\r
-\r
-       return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::removeSubString (const ConstString& subString, bool allOccurences)\r
-{\r
-       bool removed = false;\r
-       while (!removed || allOccurences)\r
-       {\r
-               int32 idx = findFirst (subString);\r
-               if (idx < 0)\r
-                       break;\r
-               remove (idx, subString.length ());\r
-               removed = true;\r
-       }\r
-       return removed;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T, class F>\r
-static uint32 performTrim (T* str, uint32 length, F func, bool funcResult)\r
-{\r
-       uint32 toRemoveAtHead = 0;\r
-       uint32 toRemoveAtTail = 0;\r
-\r
-       T* p = str;\r
-\r
-       while ((*p) && ((func (*p) != 0) == funcResult))\r
-               p++;\r
-\r
-       toRemoveAtHead = static_cast<uint32> (p - str);\r
-\r
-       if (toRemoveAtHead < length)\r
-       {\r
-               p = str + length - 1;\r
-\r
-               while (((func (*p) != 0) == funcResult) && (p > str))\r
-               {\r
-                       p--;\r
-                       toRemoveAtTail++;\r
-               }\r
-       }\r
-\r
-       uint32 newLength = length - (toRemoveAtHead + toRemoveAtTail);\r
-       if (newLength != length)\r
-       {\r
-               if (toRemoveAtHead)\r
-                       memmove (str, str + toRemoveAtHead, newLength * sizeof (T));\r
-       }\r
-       return newLength;\r
-}\r
-\r
-// "trim" trims the leading and trailing unwanted characters from the string.\r
-//-----------------------------------------------------------------------------\r
-bool String::trim (String::CharGroup group)\r
-{\r
-       if (isEmpty ())\r
-               return false;\r
-\r
-       uint32 newLength;\r
-\r
-       switch (group)\r
-       {\r
-               case kSpace:\r
-                       if (isWide)\r
-                               newLength = performTrim<char16> (buffer16, len, iswspace, true);\r
-                       else\r
-                               newLength = performTrim<char8> (buffer8, len, isspace, true);\r
-                       break;\r
-\r
-               case kNotAlphaNum:\r
-                       if (isWide)\r
-                               newLength = performTrim<char16> (buffer16, len, iswalnum, false);\r
-                       else\r
-                               newLength = performTrim<char8> (buffer8, len, isalnum, false);\r
-                       break;\r
-\r
-               case kNotAlpha:\r
-                       if (isWide)\r
-                               newLength = performTrim<char16> (buffer16, len, iswalpha, false);\r
-                       else\r
-                               newLength = performTrim<char8> (buffer8, len, isalpha, false);\r
-                       break;\r
-\r
-        default: // Undefined enum value\r
-            return false;\r
-       }\r
-\r
-       if (newLength != len)\r
-       {\r
-               resize (newLength, isWide);\r
-               len = newLength;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T, class F>\r
-static uint32 performRemove (T* str, uint32 length, F func, bool funcResult)\r
-{\r
-       T* p = str;\r
-\r
-       while (*p)\r
-       {\r
-               if ((func (*p) != 0) == funcResult)\r
-               {\r
-                       size_t toMove = length - (p - str);\r
-                       memmove (p, p + 1, toMove * sizeof (T));\r
-                       length--;\r
-               }\r
-               else\r
-                       p++;\r
-       }\r
-       return length;\r
-}\r
-//-----------------------------------------------------------------------------\r
-void String::removeChars (CharGroup group)\r
-{\r
-       if (isEmpty ())\r
-               return;\r
-\r
-       uint32 newLength;\r
-\r
-       switch (group)\r
-       {\r
-               case kSpace:\r
-                       if (isWide)\r
-                               newLength = performRemove<char16> (buffer16, len, iswspace, true);\r
-                       else\r
-                               newLength = performRemove<char8> (buffer8, len, isspace, true);\r
-                       break;\r
-\r
-               case kNotAlphaNum:\r
-                       if (isWide)\r
-                               newLength = performRemove<char16> (buffer16, len, iswalnum, false);\r
-                       else\r
-                               newLength = performRemove<char8> (buffer8, len, isalnum, false);\r
-                       break;\r
-\r
-               case kNotAlpha:\r
-                       if (isWide)\r
-                               newLength = performRemove<char16> (buffer16, len, iswalpha, false);\r
-                       else\r
-                               newLength = performRemove<char8> (buffer8, len, isalpha, false);\r
-                       break;\r
-\r
-        default: // Undefined enum value\r
-            return;\r
-       }\r
-\r
-       if (newLength != len)\r
-       {\r
-               resize (newLength, isWide);\r
-               len = newLength;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T>\r
-static uint32 performRemoveChars (T* str, uint32 length, const T* toRemove)\r
-{\r
-       T* p = str;\r
-\r
-       while (*p)\r
-       {\r
-               bool found = false;\r
-               const T* rem = toRemove;\r
-               while (*rem)\r
-               {\r
-                       if (*p == *rem)\r
-                       {\r
-                               found = true;\r
-                               break;\r
-                       }\r
-                       rem++;\r
-               }\r
-\r
-               if (found)\r
-               {\r
-                       size_t toMove = length - (p - str);\r
-                       memmove (p, p + 1, toMove * sizeof (T));\r
-                       length--;\r
-               }\r
-               else\r
-                       p++;\r
-       }\r
-       return length;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::removeChars8 (const char8* toRemove)\r
-{\r
-       if (isEmpty () || toRemove == 0)\r
-               return true;\r
-\r
-       if (isWide)\r
-       {\r
-               String wStr (toRemove);\r
-               if (wStr.toWideString () == false)\r
-                       return false;\r
-               return removeChars16 (wStr.text16 ());\r
-       }\r
-\r
-       uint32 newLength = performRemoveChars<char8> (buffer8, len, toRemove);\r
-\r
-       if (newLength != len)\r
-       {\r
-               resize (newLength, false);\r
-               len = newLength;\r
-       }\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::removeChars16 (const char16* toRemove)\r
-{\r
-       if (isEmpty () || toRemove == 0)\r
-               return true;\r
-\r
-       if (!isWide)\r
-       {\r
-               String str8 (toRemove);\r
-               if (str8.toMultiByte () == false)\r
-                       return false;\r
-               return removeChars8 (str8.text8 ());\r
-       }\r
-\r
-       uint32 newLength = performRemoveChars<char16> (buffer16, len, toRemove);\r
-\r
-       if (newLength != len)\r
-       {\r
-               resize (newLength, true);\r
-               len = newLength;\r
-       }\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printf (const char8* format, ...)\r
-{\r
-       char8 string[kPrintfBufferSize];\r
-\r
-       va_list marker;\r
-       va_start (marker, format);\r
-\r
-       vsnprintf (string, kPrintfBufferSize-1, format, marker);\r
-       return assign (string);\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printf (const char16* format, ...)\r
-{\r
-       char16 string[kPrintfBufferSize];\r
-\r
-       va_list marker;\r
-       va_start (marker, format);\r
-\r
-       vsnwprintf (string, kPrintfBufferSize-1, format, marker);\r
-       return assign (string);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::vprintf (const char8* format, va_list args)\r
-{\r
-       char8 string[kPrintfBufferSize];\r
-\r
-       vsnprintf (string, kPrintfBufferSize-1, format, args);\r
-       return assign (string);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::vprintf (const char16* format, va_list args)\r
-{\r
-       char16 string[kPrintfBufferSize];\r
-\r
-       vsnwprintf (string, kPrintfBufferSize-1, format, args);\r
-       return assign (string);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printInt64 (int64 value)\r
-{\r
-       if (isWide)\r
-       {\r
-       #if SMTG_CPP11\r
-               return String::printf (STR("%") STR(FORMAT_INT64A), value);\r
-       #else\r
-               return String::printf (STR("%" FORMAT_INT64A), value);\r
-       #endif\r
-       }\r
-       else\r
-               return String::printf ("%" FORMAT_INT64A, value);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printFloat (double value)\r
-{\r
-       if (isWide)\r
-       {\r
-               char16 string[kPrintfBufferSize];\r
-               sprintf16 (string, STR16 ("%lf"), value);\r
-\r
-               char16* pointPtr = strrchr16 (string, STR ('.'));\r
-               if (pointPtr)\r
-               {\r
-                       pointPtr++; // keep 1st digit after point\r
-                       int32 index = strlen16 (string) - 1;\r
-                       char16 zero = STR16 ('0');\r
-                       while (pointPtr < (string + index))\r
-                       {\r
-                               if (string[index] == zero)\r
-                               {\r
-                                       string[index] = 0;\r
-                                       index--;\r
-                               }\r
-                               else\r
-                                       break;\r
-                       }\r
-               }\r
-               return assign (string);\r
-       }\r
-       else\r
-       {\r
-               char8 string[kPrintfBufferSize];\r
-               sprintf (string, "%lf", value);\r
-\r
-               char8* pointPtr = strrchr (string, '.');\r
-               if (pointPtr)\r
-               {\r
-                       pointPtr++; // keep 1st digit after point\r
-                       int32 index = (int32) (strlen (string) - 1);\r
-                       while (pointPtr < (string + index))\r
-                       {\r
-                               if (string[index] == '0')\r
-                               {\r
-                                       string[index] = 0;\r
-                                       index--;\r
-                               }\r
-                               else\r
-                                       break;\r
-                       }\r
-               }\r
-               return assign (string);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::incrementTrailingNumber (uint32 width, tchar separator, uint32 minNumber, bool applyOnlyFormat)\r
-{\r
-       if (width > 32)\r
-               return false;\r
-\r
-       int64 number = 1;\r
-       int32 index = getTrailingNumberIndex ();\r
-       if (index >= 0)\r
-       {\r
-               if (scanInt64 (number, index))\r
-                       if (!applyOnlyFormat)\r
-                               number++;\r
-\r
-               if (separator != 0 && index > 0 && testChar (index - 1, separator) == true)\r
-                       index--;\r
-\r
-               remove (index);\r
-       }\r
-\r
-       if (number < minNumber)\r
-               number = minNumber;\r
-\r
-       if (isWide)\r
-       {\r
-               char16 format[64];\r
-               char16 trail[128];\r
-               if (separator && isEmpty () == false)\r
-               {\r
-                       sprintf16 (format, STR16 ("%%c%%0%uu"), width);\r
-                       sprintf16 (trail, format, separator, (uint32) number);\r
-               }\r
-               else\r
-               {\r
-                       sprintf16 (format, STR16 ("%%0%uu"), width);\r
-                       sprintf16 (trail, format, (uint32) number);\r
-               }\r
-               append (trail);\r
-       }\r
-       else\r
-       {\r
-               char format[64];\r
-               char trail[128];\r
-               if (separator && isEmpty () == false)\r
-               {\r
-                       sprintf (format, "%%c%%0%uu", width);\r
-                       sprintf (trail, format, separator, (uint32) number);\r
-               }\r
-               else\r
-               {\r
-                       sprintf (format, "%%0%uu", width);\r
-                       sprintf (trail, format, (uint32) number);\r
-               }\r
-               append (trail);\r
-       }\r
-\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toLower (uint32 index)\r
-{\r
-       if (buffer && index < len)\r
-       {\r
-               if (isWide)\r
-                       buffer16[index] = ConstString::toLower (buffer16[index]);\r
-               else\r
-                       buffer8[index] = ConstString::toLower (buffer8[index]);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toLower ()\r
-{\r
-       int32 i = len;\r
-       if (buffer && i > 0)\r
-       {\r
-               if (isWide)\r
-               {\r
-#if SMTG_OS_MACOS\r
-                       CFMutableStringRef cfStr = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, (UniChar*)buffer16, len, len+1, kCFAllocatorNull);\r
-                       CFStringLowercase (cfStr, NULL);\r
-                       CFRelease (cfStr);\r
-#else\r
-                       char16* c = buffer16;\r
-                       while (i--)\r
-                       {\r
-                               *c = ConstString::toLower (*c);\r
-                               c++;\r
-                       }\r
-#endif\r
-               }\r
-               else\r
-               {\r
-                       char8* c = buffer8;\r
-                       while (i--)\r
-                       {\r
-                               *c = ConstString::toLower (*c);\r
-                               c++;\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toUpper (uint32 index)\r
-{\r
-       if (buffer && index < len)\r
-       {\r
-               if (isWide)\r
-                       buffer16[index] = ConstString::toUpper (buffer16[index]);\r
-               else\r
-                       buffer8[index] = ConstString::toUpper (buffer8[index]);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toUpper ()\r
-{\r
-       int32 i = len;\r
-       if (buffer && i > 0)\r
-       {\r
-               if (isWide)\r
-               {\r
-#if SMTG_OS_MACOS\r
-                       CFMutableStringRef cfStr = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, (UniChar*)buffer16, len, len+1, kCFAllocatorNull);\r
-                       CFStringUppercase (cfStr, NULL);\r
-                       CFRelease (cfStr);\r
-#else\r
-                       char16* c = buffer16;\r
-                       while (i--)\r
-                       {\r
-                               *c = ConstString::toUpper (*c);\r
-                               c++;\r
-                       }\r
-#endif\r
-               }\r
-               else\r
-               {\r
-                       char8* c = buffer8;\r
-                       while (i--)\r
-                       {\r
-                               *c = ConstString::toUpper (*c);\r
-                               c++;\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::fromVariant (const FVariant& var)\r
-{\r
-       switch (var.getType ())\r
-       {\r
-               case FVariant::kString8:\r
-                       assign (var.getString8 ());\r
-                       return true;\r
-\r
-               case FVariant::kString16:\r
-                       assign (var.getString16 ());\r
-                       return true;\r
-\r
-               case FVariant::kFloat:\r
-                       printFloat (var.getFloat ());\r
-                       return true;\r
-\r
-               case FVariant::kInteger:\r
-                       printInt64 (var.getInt ());\r
-                       return true;\r
-\r
-               default:\r
-                       remove ();\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toVariant (FVariant& var) const\r
-{\r
-       if (isWide)\r
-       {\r
-               var.setString16 (text16 ());\r
-       }\r
-       else\r
-       {\r
-               var.setString8 (text8 ());\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::fromAttributes (IAttributes* a, IAttrID attrID)\r
-{\r
-       FVariant variant;\r
-       if (a->get (attrID, variant) == kResultTrue)\r
-               return fromVariant (variant);\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::toAttributes (IAttributes* a, IAttrID attrID)\r
-{\r
-       FVariant variant;\r
-       toVariant (variant);\r
-       if (a->set (attrID, variant) == kResultTrue)\r
-               return true;\r
-       return false;\r
-}\r
-\r
-// "swapContent" swaps ownership of the strings pointed to\r
-//-----------------------------------------------------------------------------\r
-void String::swapContent (String& s)\r
-{\r
-       void* tmp = s.buffer;\r
-       uint32 tmpLen = s.len;\r
-       bool tmpWide = s.isWide;\r
-       s.buffer = buffer;\r
-       s.len = len;\r
-       s.isWide = isWide;\r
-       buffer = tmp;\r
-       len = tmpLen;\r
-       isWide = tmpWide;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::take (String& other)\r
-{\r
-       resize (0, other.isWide);\r
-       buffer = other.buffer;\r
-       len = other.len;\r
-\r
-       other.buffer = 0;\r
-       other.len = 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::take (void* b, bool wide)\r
-{\r
-       resize (0, wide);\r
-       buffer = b;\r
-       isWide = wide;\r
-       updateLength ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void* String::pass ()\r
-{\r
-       void* res = buffer;\r
-       len = 0;\r
-       buffer = 0;\r
-       return res;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::passToVariant (FVariant& var)\r
-{\r
-       void* passed = pass ();\r
-\r
-       if (isWide)\r
-       {\r
-               if (passed)\r
-               {\r
-                       var.setString16 ((const char16*)passed);\r
-                       var.setOwner (true);\r
-               }\r
-               else\r
-                       var.setString16 (kEmptyString16);\r
-       }\r
-       else\r
-       {\r
-               if (passed)\r
-               {\r
-                       var.setString8 ((const char8*)passed);\r
-                       var.setOwner (true);\r
-               }\r
-               else\r
-                       var.setString8 (kEmptyString8);\r
-       }\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-unsigned char* String::toPascalString (unsigned char* buf)\r
-{\r
-       if (buffer)\r
-       {\r
-               if (isWide)\r
-               {\r
-                       String tmp (*this);\r
-                       tmp.toMultiByte ();\r
-                       return tmp.toPascalString (buf);\r
-               }\r
-\r
-               int32 length = len;\r
-               if (length > 255)\r
-                       length = 255;\r
-               buf[0] = (uint8)length;\r
-               while (length >= 0)\r
-               {\r
-                       buf[length + 1] = buffer8[length];\r
-                       length--;\r
-               }\r
-               return buf;\r
-       }\r
-       else\r
-       {\r
-               *buf = 0;\r
-               return buf;\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const String& String::fromPascalString (const unsigned char* buf)\r
-{\r
-       resize (0, false);\r
-       isWide = 0;\r
-       int32 length = buf[0];\r
-       resize (length + 1, false);\r
-       buffer8[length] = 0;    // cannot be removed, because we only do the 0-termination for multibyte buffer8\r
-       while (--length >= 0)\r
-               buffer8[length] = buf[length + 1];\r
-       len = buf[0];\r
-       return *this;\r
-}\r
-\r
-#if SMTG_OS_MACOS\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::fromCFStringRef (const void* cfStr, uint32 encoding)\r
-{\r
-       if (cfStr == 0)\r
-               return false;\r
-\r
-       CFStringRef strRef = (CFStringRef)cfStr;\r
-       if (isWide)\r
-       {\r
-               CFRange range = { 0, CFStringGetLength (strRef)};\r
-               CFIndex usedBytes;\r
-               if (resize (static_cast<int32> (range.length + 1), true))\r
-               {\r
-                       if (encoding == 0xFFFF)\r
-                               encoding = kCFStringEncodingUnicode;\r
-                       if (CFStringGetBytes (strRef, range, encoding, ' ', false, (UInt8*)buffer16, range.length * 2, &usedBytes) > 0)\r
-                       {\r
-                               buffer16[usedBytes/2] = 0;\r
-                               this->len = strlen16 (buffer16);\r
-                               return true;\r
-                       }\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (cfStr == 0)\r
-                       return false;\r
-               if (encoding == 0xFFFF)\r
-                       encoding = kCFStringEncodingASCII;\r
-               int32 len = static_cast<int32> (CFStringGetLength (strRef) * 2);\r
-               if (resize (++len, false))\r
-               {\r
-                       if (CFStringGetCString (strRef, buffer8, len, encoding))\r
-                       {\r
-                               this->len = static_cast<int32> (strlen (buffer8));\r
-                               return true;\r
-                       }\r
-               }\r
-       }\r
-\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void* ConstString::toCFStringRef (uint32 encoding, bool mutableCFString) const\r
-{\r
-       if (mutableCFString)\r
-       {\r
-               CFMutableStringRef str = CFStringCreateMutable (kCFAllocator, 0);\r
-               if (isWide)\r
-               {\r
-                       CFStringAppendCharacters (str, (const UniChar *)buffer16, len);\r
-                       return str;\r
-               }\r
-               else\r
-               {\r
-                       if (encoding == 0xFFFF)\r
-                               encoding = kCFStringEncodingASCII;\r
-                       CFStringAppendCString (str, buffer8, encoding);\r
-                       return str;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (isWide)\r
-               {\r
-                       if (encoding == 0xFFFF)\r
-                               encoding = kCFStringEncodingUnicode;\r
-                       return (void*)CFStringCreateWithBytes (kCFAllocator, (const unsigned char*)buffer16, len * 2, encoding, false);\r
-               }\r
-               else\r
-               {\r
-                       if (encoding == 0xFFFF)\r
-                               encoding = kCFStringEncodingASCII;\r
-                       if (buffer8)\r
-                               return (void*)CFStringCreateWithCString (kCFAllocator, buffer8, encoding);\r
-                       else\r
-                               return (void*)CFStringCreateWithCString (kCFAllocator, "", encoding);\r
-               }\r
-       }\r
-       return 0;\r
-}\r
-\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 hashString8 (const char8* s, uint32 m)\r
-{\r
-       uint32 h = 0;\r
-       if (s)\r
-       {\r
-               for (h = 0; *s != '\0'; s++)\r
-                       h = (64 * h + *s) % m;\r
-       }\r
-       return h;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 hashString16 (const char16* s, uint32 m)\r
-{\r
-       uint32 h = 0;\r
-       if (s)\r
-       {\r
-               for (h = 0; *s != 0; s++)\r
-                       h = (64 * h + *s) % m;\r
-       }\r
-       return h;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class T> int32 tstrnatcmp (const T* s1, const T* s2, bool caseSensitive = true)\r
-{\r
-       if (s1 == 0 && s2 == 0)\r
-               return 0;\r
-       else if (s1 == 0)\r
-               return -1;\r
-       else if (s2 == 0)\r
-               return 1;\r
-\r
-       while (*s1 && *s2)\r
-       {\r
-               if (ConstString::isCharDigit (*s1) && ConstString::isCharDigit (*s2))\r
-               {\r
-                       int32 s1LeadingZeros = 0;\r
-                       while (*s1 == '0')\r
-                       {\r
-                               s1++; // skip leading zeros\r
-                               s1LeadingZeros++;\r
-                       }\r
-                       int32 s2LeadingZeros = 0;\r
-                       while (*s2 == '0')\r
-                       {\r
-                               s2++; // skip leading zeros\r
-                               s2LeadingZeros++;\r
-                       }\r
-\r
-                       int32 countS1Digits = 0;\r
-                       while (*(s1 + countS1Digits) && ConstString::isCharDigit (*(s1 + countS1Digits)))\r
-                               countS1Digits++;\r
-                       int32 countS2Digits = 0;\r
-                       while (*(s2 + countS2Digits) && ConstString::isCharDigit (*(s2 + countS2Digits)))\r
-                               countS2Digits++;\r
-\r
-                       if (countS1Digits != countS2Digits)\r
-                               return countS1Digits - countS2Digits; // one number is longer than the other\r
-\r
-                       for (int32 i = 0; i < countS1Digits; i++)\r
-                       {\r
-                               // countS1Digits == countS2Digits\r
-                               if (*s1 != *s2)\r
-                                       return (int32)(*s1 - *s2); // the digits differ\r
-                               s1++;\r
-                               s2++;\r
-                       }\r
-\r
-                       if (s1LeadingZeros != s2LeadingZeros)\r
-                               return s1LeadingZeros - s2LeadingZeros; // differentiate by the number of leading zeros\r
-               }\r
-               else\r
-               {\r
-                       if (caseSensitive == false)\r
-                       {\r
-                               T srcToUpper = toupper (*s1);\r
-                               T dstToUpper = toupper (*s2);\r
-                               if (srcToUpper != dstToUpper)\r
-                                       return (int32)(srcToUpper - dstToUpper);\r
-                       }\r
-                       else if (*s1 != *s2)\r
-                               return (int32)(*s1 - *s2);\r
-\r
-                       s1++;\r
-                       s2++;\r
-               }\r
-       }\r
-\r
-       if (*s1 == 0 && *s2 == 0)\r
-               return 0;\r
-       else if (*s1 == 0)\r
-               return -1;\r
-       else if (*s2 == 0)\r
-               return 1;\r
-       else\r
-               return (int32)(*s1 - *s2);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 strnatcmp8 (const char8* s1, const char8* s2, bool caseSensitive /*= true*/)\r
-{\r
-       return tstrnatcmp (s1, s2, caseSensitive);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 strnatcmp16 (const char16* s1, const char16* s2, bool caseSensitive /*= true*/)\r
-{\r
-       return tstrnatcmp (s1, s2, caseSensitive);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-// StringObject Implementation\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::setText (const char8* text)\r
-{\r
-       assign (text);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::setText8 (const char8* text)\r
-{\r
-       assign (text);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::setText16 (const char16* text)\r
-{\r
-       assign (text);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const char8* PLUGIN_API StringObject::getText8 ()\r
-{\r
-       return text8 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const char16* PLUGIN_API StringObject::getText16 ()\r
-{\r
-       return text16 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::take (void* s, bool _isWide)\r
-{\r
-       String::take (s, _isWide);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool PLUGIN_API StringObject::isWideString () const\r
-{\r
-       return String::isWideString ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h
deleted file mode 100644 (file)
index 28b3519..0000000
+++ /dev/null
@@ -1,747 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/fstring.h\r
-// Created by  : Steinberg, 2008\r
-// Description : String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include "pluginterfaces/base/fstrdefs.h"\r
-#include "pluginterfaces/base/istringresult.h"\r
-#include "pluginterfaces/base/ipersistent.h"\r
-\r
-#include "base/source/fobject.h"\r
-\r
-#include <stdarg.h>\r
-\r
-namespace Steinberg {\r
-\r
-class FVariant;\r
-class String;\r
-\r
-#ifdef UNICODE\r
-static const bool kWideStringDefault = true;\r
-#else\r
-static const bool kWideStringDefault = false;\r
-#endif\r
-\r
-static const uint16 kBomUtf16 = 0xFEFF;                                        ///< UTF16 Byte Order Mark\r
-static const char8* const kBomUtf8 = "\xEF\xBB\xBF";   ///< UTF8 Byte Order Mark\r
-static const int32 kBomUtf8Length = 3;\r
-\r
-\r
-enum MBCodePage\r
-{\r
-       kCP_ANSI = 0,                   ///< Default ANSI codepage.\r
-       kCP_MAC_ROMAN = 2,              ///< Default Mac codepage.\r
-\r
-       kCP_ANSI_WEL = 1252,    ///< West European Latin Encoding.\r
-       kCP_MAC_CEE = 10029,    ///< Mac Central European Encoding.\r
-       kCP_Utf8 = 65001,               ///< UTF8 Encoding.\r
-       kCP_ShiftJIS = 932,             ///< Shifted Japan Industrial Standard Encoding.\r
-       kCP_US_ASCII = 20127,   ///< US-ASCII (7-bit).\r
-\r
-       kCP_Default = kCP_ANSI  ///< Default ANSI codepage.\r
-};\r
-\r
-enum UnicodeNormalization\r
-{\r
-       kUnicodeNormC,  ///< Unicode normalization Form C, canonical composition.\r
-       kUnicodeNormD,  ///< Unicode normalization Form D, canonical decomposition.\r
-       kUnicodeNormKC, ///< Unicode normalization form KC, compatibility composition.\r
-       kUnicodeNormKD  ///< Unicode normalization form KD, compatibility decomposition.\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// Helper functions to create hash codes from string data.\r
-//------------------------------------------------------------------------\r
-extern uint32 hashString8 (const char8* s, uint32 m);\r
-extern uint32 hashString16 (const char16* s, uint32 m);\r
-inline uint32 hashString (const tchar* s, uint32 m)\r
-{\r
-#ifdef UNICODE\r
-       return hashString16 (s, m);\r
-#else\r
-       return hashString8 (s, m);\r
-#endif\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-/** Invariant String.\r
-@ingroup adt\r
-\r
-A base class which provides methods to work with its\r
-member string. Neither of the operations allows modifying the member string and\r
-that is why all operation are declared as const.\r
-\r
-There are operations for access, comparison, find, numbers and conversion.\r
-\r
-Almost all operations exist in three versions for char8, char16 and the\r
-polymorphic type tchar. The type tchar can either be char8 or char16 depending\r
-on whether UNICODE is activated or not.*/\r
-//-----------------------------------------------------------------------------\r
-class ConstString\r
-{\r
-public:\r
-//-----------------------------------------------------------------------------\r
-       ConstString (const char8* str, int32 length = -1);      ///< Assign from string of type char8 (length=-1: all)\r
-       ConstString (const char16* str, int32 length = -1);     ///< Assign from string of type char16 (length=-1: all)\r
-       ConstString (const ConstString& str, int32 offset = 0, int32 length = -1); ///< Copy constructor (length=-1: all).\r
-       ConstString (const FVariant& var);      ///< Assign a string from FVariant\r
-       ConstString ();\r
-       virtual ~ConstString () {}                      ///< Destructor.\r
-\r
-       // access -----------------------------------------------------------------\r
-       virtual int32 length () const {return static_cast<int32> (len);}        ///< Return length of string\r
-       inline bool isEmpty () const {return buffer == 0 || len == 0;}          ///< Return true if string is empty\r
-\r
-       operator const char8* () const {return text8 ();}                                                       ///< Returns pointer to string of type char8 (no modification allowed)\r
-       operator const char16* () const {return text16 ();}                                                     ///< Returns pointer to string of type char16(no modification allowed)\r
-       inline tchar operator[] (short idx) const {return getChar (static_cast<uint32> (idx));} ///< Returns character at 'idx'\r
-       inline tchar operator[] (long idx) const {return getChar (static_cast<uint32> (idx));}\r
-       inline tchar operator[] (int idx) const {return getChar (static_cast<uint32> (idx));}\r
-       inline tchar operator[] (unsigned short idx) const {return getChar (idx);}\r
-       inline tchar operator[] (unsigned long idx) const {return getChar (static_cast<uint32> (idx));}\r
-       inline tchar operator[] (unsigned int idx) const {return getChar (idx);}\r
-\r
-       inline virtual const char8* text8 () const;             ///< Returns pointer to string of type char8\r
-       inline virtual const char16* text16 () const;   ///< Returns pointer to string of type char16\r
-       inline virtual const tchar* text () const;              ///< Returns pointer to string of type tchar\r
-       inline virtual const void* ptr () const {return buffer;}        ///< Returns pointer to string of type void\r
-\r
-       inline virtual char8 getChar8 (uint32 index) const;             ///< Returns character of type char16 at 'index'\r
-       inline virtual char16 getChar16 (uint32 index) const;   ///< Returns character of type char8 at 'index'\r
-       inline tchar getChar (uint32 index) const;                              ///< Returns character of type tchar at 'index'\r
-       inline tchar getCharAt (uint32 index) const;                    ///< Returns character of type tchar at 'index', no conversion!\r
-\r
-       bool testChar8 (uint32 index, char8 c) const;                   ///< Returns true if character is equal at position 'index'\r
-       bool testChar16 (uint32 index, char16 c) const;\r
-       inline bool testChar (uint32 index, char8 c) const {return testChar8 (index, c);}\r
-       inline bool testChar (uint32 index, char16 c) const {return testChar16 (index, c);}\r
-\r
-       bool extract (String& result, uint32 idx, int32 n = -1) const;          ///< Get n characters long substring starting at index (n=-1: until end)\r
-       int32 copyTo8 (char8* str, uint32 idx = 0, int32 n = -1) const;\r
-       int32 copyTo16 (char16* str, uint32 idx = 0, int32 n = -1) const;\r
-       int32 copyTo (tchar* str, uint32 idx = 0, int32 n = -1) const;\r
-       void copyTo (IStringResult* result) const;                                                      ///< Copies whole member string\r
-       void copyTo (IString& string) const;                                                        ///< Copies whole member string\r
-\r
-       inline uint32 hash (uint32 tsize) const\r
-       {\r
-               return isWide ? hashString16 (buffer16, tsize) : hashString8 (buffer8, tsize) ;\r
-       }\r
-       //-------------------------------------------------------------------------\r
-\r
-       // compare ----------------------------------------------------------------\r
-       enum CompareMode\r
-       {\r
-               kCaseSensitive,         ///< Comparison is done with regard to character's case\r
-               kCaseInsensitive        ///< Comparison is done without regard to character's case\r
-       };\r
-\r
-       int32 compareAt (uint32 index, const ConstString& str, int32 n = -1, CompareMode m = kCaseSensitive) const;                             ///< Compare n characters of str with n characters of this starting at index (return: see above)\r
-       int32 compare (const ConstString& str, int32 n, CompareMode m = kCaseSensitive) const;                                                                          ///< Compare n characters of str with n characters of this (return: see above)\r
-       int32 compare (const ConstString& str, CompareMode m = kCaseSensitive) const;                                                                                           ///< Compare all characters of str with this (return: see above)\r
-\r
-       int32 naturalCompare (const ConstString& str, CompareMode mode = kCaseSensitive) const;\r
-\r
-       bool startsWith (const ConstString& str, CompareMode m = kCaseSensitive) const;                                                                                         ///< Check if this starts with str\r
-       bool endsWith (const ConstString& str, CompareMode m = kCaseSensitive) const;                                                                                           ///< Check if this ends with str\r
-       bool contains (const ConstString& str, CompareMode m = kCaseSensitive) const;                                                                                           ///< Check if this contains str\r
-\r
-       // static methods\r
-       static bool isCharSpace (char8 character);         ///< Returns true if character is a space\r
-       static bool isCharSpace (char16 character);    ///< @copydoc isCharSpace(const char8)\r
-       static bool isCharAlpha (char8 character);         ///< Returns true if character is an alphabetic character\r
-       static bool isCharAlpha (char16 character);    ///< @copydoc isCharAlpha(const char8)\r
-       static bool isCharAlphaNum (char8 character);  ///< Returns true if character is an alphanumeric character\r
-       static bool isCharAlphaNum (char16 character); ///< @copydoc isCharAlphaNum(const char8)\r
-       static bool isCharDigit (char8 character);         ///< Returns true if character is a number\r
-       static bool isCharDigit (char16 character);    ///< @copydoc isCharDigit(const char8)\r
-       static bool isCharAscii (char8 character);     ///< Returns true if character is in ASCII range\r
-       static bool isCharAscii (char16 character);    ///< Returns true if character is in ASCII range\r
-       static bool isCharUpper (char8 character);\r
-       static bool isCharUpper (char16 character);\r
-       static bool isCharLower (char8 character);\r
-       static bool isCharLower (char16 character);\r
-       //-------------------------------------------------------------------------\r
-\r
-       /** @name Find first occurrence of n characters of str in this (n=-1: all) ending at endIndex (endIndex = -1: all)*/\r
-       ///@{\r
-       inline int32 findFirst (const ConstString& str, int32 n = -1, CompareMode m = kCaseSensitive, int32 endIndex = -1) const {return findNext (0, str, n, m, endIndex);}\r
-       inline int32 findFirst (char8 c, CompareMode m = kCaseSensitive, int32 endIndex = -1) const {return findNext (0, c, m, endIndex);}\r
-       inline int32 findFirst (char16 c, CompareMode m = kCaseSensitive, int32 endIndex = -1) const {return findNext (0, c, m, endIndex);}\r
-       ///@}\r
-       /** @name Find next occurrence of n characters of str starting at startIndex in this (n=-1: all) ending at endIndex (endIndex = -1: all)*/\r
-       ///@{\r
-       int32 findNext (int32 startIndex, const ConstString& str, int32 n = -1, CompareMode = kCaseSensitive, int32 endIndex = -1) const;\r
-       int32 findNext (int32 startIndex, char8 c, CompareMode = kCaseSensitive, int32 endIndex = -1) const;\r
-       int32 findNext (int32 startIndex, char16 c, CompareMode = kCaseSensitive, int32 endIndex = -1) const;\r
-       ///@}\r
-       /** @name Find previous occurrence of n characters of str starting at startIndex in this (n=-1: all) */\r
-       ///@{\r
-       int32 findPrev (int32 startIndex, const ConstString& str, int32 n = -1, CompareMode = kCaseSensitive) const;\r
-       int32 findPrev (int32 startIndex, char8 c, CompareMode = kCaseSensitive) const;\r
-       int32 findPrev (int32 startIndex, char16 c, CompareMode = kCaseSensitive) const;\r
-       ///@}\r
-\r
-       inline int32 findLast (const ConstString& str, int32 n = -1, CompareMode m = kCaseSensitive) const {return findPrev (-1, str, n, m);}   ///< Find last occurrence of n characters of str in this (n=-1: all)\r
-       inline int32 findLast (char8 c, CompareMode m = kCaseSensitive) const {return findPrev (-1, c, m);}\r
-       inline int32 findLast (char16 c, CompareMode m = kCaseSensitive) const {return findPrev (-1, c, m);}\r
-\r
-       int32 countOccurences (char8 c, uint32 startIndex, CompareMode = kCaseSensitive) const; ///< Counts occurences of c within this starting at index\r
-       int32 countOccurences (char16 c, uint32 startIndex, CompareMode = kCaseSensitive) const;\r
-       int32 getFirstDifferent (const ConstString& str, CompareMode = kCaseSensitive) const;   ///< Returns position of first different character\r
-       //-------------------------------------------------------------------------\r
-\r
-       // numbers ----------------------------------------------------------------\r
-       bool isDigit (uint32 index) const;      ///< Returns true if character at position is a digit\r
-       bool scanFloat (double& value, uint32 offset = 0, bool scanToEnd = true) const;         ///< Converts string to double value starting at offset\r
-       bool scanInt64 (int64& value, uint32 offset = 0, bool scanToEnd = true) const;          ///< Converts string to int64 value starting at offset\r
-       bool scanUInt64 (uint64& value, uint32 offset = 0, bool scanToEnd = true) const;        ///< Converts string to uint64 value starting at offset\r
-       bool scanInt32 (int32& value, uint32 offset = 0, bool scanToEnd = true) const;          ///< Converts string to int32 value starting at offset\r
-       bool scanUInt32 (uint32& value, uint32 offset = 0, bool scanToEnd = true) const;        ///< Converts string to uint32 value starting at offset\r
-       bool scanHex (uint8& value, uint32 offset = 0, bool scanToEnd = true) const;            ///< Converts string to hex/uint8 value starting at offset\r
-\r
-       int32 getTrailingNumberIndex (uint32 width = 0) const;  ///< Returns start index of trailing number\r
-       int64 getTrailingNumber (int64 fallback = 0) const;             ///< Returns result of scanInt64 or the fallback\r
-       int64 getNumber () const;                                                               ///< Returns result of scanInt64\r
-\r
-       // static methods\r
-       static bool scanInt64_8 (const char8* text, int64& value, bool scanToEnd = true);       ///< Converts string of type char8 to int64 value\r
-       static bool scanInt64_16 (const char16* text, int64& value, bool scanToEnd = true);     ///< Converts string of type char16 to int64 value\r
-       static bool scanInt64 (const tchar* text, int64& value, bool scanToEnd = true);         ///< Converts string of type tchar to int64 value\r
-\r
-       static bool scanUInt64_8 (const char8* text, uint64& value, bool scanToEnd = true);             ///< Converts string of type char8 to uint64 value\r
-       static bool scanUInt64_16 (const char16* text, uint64& value, bool scanToEnd = true);   ///< Converts string of type char16 to uint64 value\r
-       static bool scanUInt64 (const tchar* text, uint64& value, bool scanToEnd = true);               ///< Converts string of type tchar to uint64 value\r
-\r
-       static bool scanInt32_8 (const char8* text, int32& value, bool scanToEnd = true);               ///< Converts string of type char8 to int32 value\r
-       static bool scanInt32_16 (const char16* text, int32& value, bool scanToEnd = true);             ///< Converts string of type char16 to int32 value\r
-       static bool scanInt32 (const tchar* text, int32& value, bool scanToEnd = true);                 ///< Converts string of type tchar to int32 value\r
-\r
-       static bool scanUInt32_8 (const char8* text, uint32& value, bool scanToEnd = true);             ///< Converts string of type char8 to int32 value\r
-       static bool scanUInt32_16 (const char16* text, uint32& value, bool scanToEnd = true);           ///< Converts string of type char16 to int32 value\r
-       static bool scanUInt32 (const tchar* text, uint32& value, bool scanToEnd = true);                       ///< Converts string of type tchar to int32 value\r
-\r
-       static bool scanHex_8 (const char8* text, uint8& value, bool scanToEnd = true);         ///< Converts string of type char8 to hex/unit8 value\r
-       static bool scanHex_16 (const char16* text, uint8& value, bool scanToEnd = true);       ///< Converts string of type char16 to hex/unit8 value\r
-       static bool scanHex (const tchar* text, uint8& value, bool scanToEnd = true);           ///< Converts string of type tchar to hex/unit8 value\r
-       //-------------------------------------------------------------------------\r
-\r
-       // conversion -------------------------------------------------------------\r
-       void toVariant (FVariant& var) const;\r
-\r
-       static char8 toLower (char8 c);         ///< Converts to lower case\r
-       static char8 toUpper (char8 c);         ///< Converts to upper case\r
-       static char16 toLower (char16 c);\r
-       static char16 toUpper (char16 c);\r
-\r
-       static int32 multiByteToWideString (char16* dest, const char8* source, int32 wcharCount, uint32 sourceCodePage = kCP_Default);  ///< If dest is zero, this returns the maximum number of bytes needed to convert source\r
-       static int32 wideStringToMultiByte (char8* dest, const char16* source, int32 char8Count, uint32 destCodePage = kCP_Default);    ///< If dest is zero, this returns the maximum number of bytes needed to convert source\r
-\r
-       bool isWideString () const {return isWide != 0;}        ///< Returns true if string is wide\r
-       bool isAsciiString () const;                                            ///< Checks if all characters in string are in ascii range\r
-\r
-       bool isNormalized (UnicodeNormalization = kUnicodeNormC); ///< On PC only kUnicodeNormC is working\r
-\r
-#if SMTG_OS_MACOS\r
-       virtual void* toCFStringRef (uint32 encoding = 0xFFFF, bool mutableCFString = false) const;     ///< CFString conversion\r
-#endif\r
-//-------------------------------------------------------------------------\r
-\r
-//-----------------------------------------------------------------------------\r
-protected:\r
-\r
-       union\r
-       {\r
-               void* buffer;\r
-               char8* buffer8;\r
-               char16* buffer16;\r
-       };\r
-       uint32 len : 30;\r
-       uint32 isWide : 1;\r
-};\r
-\r
-//-----------------------------------------------------------------------------\r
-/** String.\r
-@ingroup adt\r
-\r
-Extends class ConstString by operations which allow modifications.\r
-\r
-\see ConstString */\r
-//-----------------------------------------------------------------------------\r
-class String : public ConstString\r
-{\r
-public:\r
-//-----------------------------------------------------------------------------\r
-       String ();\r
-       String (const char8* str, MBCodePage codepage, int32 n = -1, bool isTerminated = true);                                                 ///< assign n characters of str and convert to wide string by using the specified codepage\r
-       String (const char8* str, int32 n = -1, bool isTerminated = true);      ///< assign n characters of str (-1: all)\r
-       String (const char16* str, int32 n = -1, bool isTerminated = true);     ///< assign n characters of str (-1: all)\r
-       String (const String& str, int32 n = -1);                                                       ///< assign n characters of str (-1: all)\r
-       String (const ConstString& str, int32 n = -1);          ///< assign n characters of str (-1: all)\r
-       String (const FVariant& var);                                           ///< assign from FVariant\r
-       String (IString* str);                                          ///< assign from IString\r
-       ~String ();\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-       String (String&& str);\r
-       String& operator= (String&& str);\r
-#endif\r
-\r
-       // access------------------------------------------------------------------\r
-       void updateLength (); ///< Call this when the string is truncated outside (not recommended though)\r
-       virtual const char8* text8 () const SMTG_OVERRIDE;\r
-       virtual const char16* text16 () const SMTG_OVERRIDE;\r
-       virtual char8 getChar8 (uint32 index) const SMTG_OVERRIDE;\r
-       virtual char16 getChar16 (uint32 index) const SMTG_OVERRIDE;\r
-\r
-       bool setChar8 (uint32 index, char8 c);\r
-       bool setChar16 (uint32 index, char16 c);\r
-       inline bool setChar (uint32 index, char8 c) {return setChar8 (index, c);}\r
-       inline bool setChar (uint32 index, char16 c) {return setChar16 (index, c);}\r
-       //-------------------------------------------------------------------------\r
-\r
-       // assignment--------------------------------------------------------------\r
-       String& operator= (const char8* str) {return assign (str);}     ///< Assign from a string of type char8\r
-       String& operator= (const char16* str) {return assign (str);}\r
-       String& operator= (const ConstString& str) {return assign (str);}\r
-       String& operator= (const String& str) {return assign (str);}\r
-       String& operator= (char8 c) {return assign (c);}\r
-       String& operator= (char16 c) {return assign (c);}\r
-\r
-       String& assign (const ConstString& str, int32 n = -1);                  ///< Assign n characters of str (-1: all)\r
-       String& assign (const char8* str, int32 n = -1, bool isTerminated = true);                      ///< Assign n characters of str (-1: all)\r
-       String& assign (const char16* str, int32 n = -1, bool isTerminated = true);                     ///< Assign n characters of str (-1: all)\r
-       String& assign (char8 c, int32 n = 1);\r
-       String& assign (char16 c, int32 n = 1);\r
-       //-------------------------------------------------------------------------\r
-\r
-       // concat------------------------------------------------------------------\r
-       String& append (const ConstString& str, int32 n = -1);          ///< Append n characters of str to this (n=-1: all)\r
-       String& append (const char8* str, int32 n = -1);                        ///< Append n characters of str to this (n=-1: all)\r
-       String& append (const char16* str, int32 n = -1);                       ///< Append n characters of str to this (n=-1: all)\r
-       String& append (const char8 c, int32 n = 1);                ///< Append char c n times\r
-       String& append (const char16 c, int32 n = 1);               ///< Append char c n times\r
-\r
-       String& insertAt (uint32 idx, const ConstString& str, int32 n = -1);    ///< Insert n characters of str at position idx (n=-1: all)\r
-       String& insertAt (uint32 idx, const char8* str, int32 n = -1);  ///< Insert n characters of str at position idx (n=-1: all)\r
-       String& insertAt (uint32 idx, const char16* str, int32 n = -1); ///< Insert n characters of str at position idx (n=-1: all)\r
-       String& insertAt (uint32 idx, char8 c) {char8 str[] = {c, 0}; return insertAt (idx, str, 1);}\r
-       String& insertAt (uint32 idx, char16 c) {char16 str[] = {c, 0}; return insertAt (idx, str, 1);}\r
-\r
-       String& operator+= (const String& str) {return append (str);}\r
-       String& operator+= (const ConstString& str) {return append (str);}\r
-       String& operator+= (const char8* str) {return append (str);}\r
-       String& operator+= (const char16* str) {return append (str);}\r
-       String& operator+= (const char8 c) {return append (c);}\r
-       String& operator+= (const char16 c) {return append (c);}\r
-       //-------------------------------------------------------------------------\r
-\r
-       // replace-----------------------------------------------------------------\r
-       String& replace (uint32 idx, int32 n1, const ConstString& str, int32 n2 = -1);          ///< Replace n1 characters of this (starting at idx) with n2 characters of str (n1,n2=-1: until end)\r
-       String& replace (uint32 idx, int32 n1, const char8* str, int32 n2 = -1);                        ///< Replace n1 characters of this (starting at idx) with n2 characters of str (n1,n2=-1: until end)\r
-       String& replace (uint32 idx, int32 n1, const char16* str, int32 n2 = -1);                       ///< Replace n1 characters of this (starting at idx) with n2 characters of str (n1,n2=-1: until end)\r
-\r
-       int32 replace (const char8* toReplace, const char8* toReplaceWith, bool all = false, CompareMode m = kCaseSensitive);                   ///< Replace find string with replace string - returns number of replacements\r
-       int32 replace (const char16* toReplace, const char16* toReplaceWith, bool all = false, CompareMode m = kCaseSensitive);         ///< Replace find string with replace string - returns number of replacements\r
-\r
-       bool replaceChars8 (const char8* toReplace, char8 toReplaceBy); ///< Returns true when any replacement was done\r
-       bool replaceChars16 (const char16* toReplace, char16 toReplaceBy);\r
-       inline bool replaceChars8 (char8 toReplace, char8 toReplaceBy)  {char8 str[] = {toReplace, 0}; return replaceChars8 (str, toReplaceBy);}\r
-       inline bool replaceChars16 (char16 toReplace, char16 toReplaceBy)  {char16 str[] = {toReplace, 0}; return replaceChars16 (str, toReplaceBy);}\r
-       inline bool replaceChars (char8 toReplace, char8 toReplaceBy) {return replaceChars8 (toReplace, toReplaceBy);}\r
-       inline bool replaceChars (char16 toReplace, char16 toReplaceBy) {return replaceChars16 (toReplace, toReplaceBy);}\r
-       inline bool replaceChars (const char8* toReplace, char8 toReplaceBy) {return replaceChars8 (toReplace, toReplaceBy);}\r
-       inline bool replaceChars (const char16* toReplace, char16 toReplaceBy) {return replaceChars16 (toReplace, toReplaceBy);}\r
-       //-------------------------------------------------------------------------\r
-\r
-       // remove------------------------------------------------------------------\r
-       String& remove (uint32 index = 0, int32 n = -1);                ///< Remove n characters from string starting at index (n=-1: until end)\r
-       enum CharGroup {kSpace, kNotAlphaNum, kNotAlpha};\r
-       bool trim (CharGroup mode = kSpace);                                    ///< Trim lead/trail.\r
-       void removeChars (CharGroup mode = kSpace);                             ///< Removes all of group.\r
-       bool removeChars8 (const char8* which);                                 ///< Remove all occurrences of each char in 'which'\r
-       bool removeChars16 (const char16* which);                               ///< Remove all occurrences of each char in 'which'\r
-       inline bool removeChars8 (const char8 which) {char8 str[] = {which, 0}; return removeChars8 (str); }\r
-       inline bool removeChars16 (const char16 which) {char16 str[] = {which, 0}; return removeChars16 (str); }\r
-       inline bool removeChars (const char8* which) {return removeChars8 (which);}\r
-       inline bool removeChars (const char16* which) {return removeChars16 (which);}\r
-       inline bool removeChars (const char8 which) {return removeChars8 (which);}\r
-       inline bool removeChars (const char16 which) {return removeChars16 (which);}\r
-       bool removeSubString (const ConstString& subString, bool allOccurences = true);\r
-       //-------------------------------------------------------------------------\r
-\r
-       // print-------------------------------------------------------------------\r
-       String& printf (const char8* format, ...);                                      ///< Print formatted data into string\r
-       String& printf (const char16* format, ...);                                     ///< Print formatted data into string\r
-       String& vprintf (const char8* format, va_list args);\r
-       String& vprintf (const char16* format, va_list args);\r
-       //-------------------------------------------------------------------------\r
-\r
-       // numbers-----------------------------------------------------------------\r
-       String& printInt64 (int64 value);\r
-       String& printFloat (double value);\r
-       /** Increment the trailing number if present else start with minNumber, width specifies the string width format (width 2 for number 3 is 03),\r
-               applyOnlyFormat set to true will only format the string to the given width without incrementing the founded trailing number */\r
-       bool incrementTrailingNumber (uint32 width = 2, tchar separator = STR (' '), uint32 minNumber = 1, bool applyOnlyFormat = false);\r
-       //-------------------------------------------------------------------------\r
-\r
-       // conversion--------------------------------------------------------------\r
-       bool fromVariant (const FVariant& var);         ///< Assigns string from FVariant\r
-       void toVariant (FVariant& var) const;\r
-       bool fromAttributes (IAttributes* a, IAttrID attrID);   ///< Assigns string from FAttributes\r
-       bool toAttributes (IAttributes* a, IAttrID attrID);\r
-\r
-       void swapContent (String& s);                                                           ///< Swaps ownership of the strings pointed to\r
-       void take (String& str);                                                                ///< Take ownership of the string of 'str'\r
-       void take (void* _buffer, bool wide);                                           ///< Take ownership of buffer\r
-       void* pass ();\r
-       void passToVariant (FVariant& var);                                                     ///< Pass ownership of buffer to Variant - sets Variant ownership\r
-\r
-       void toLower (uint32 index);                                                            ///< Lower case the character.\r
-       void toLower ();                                                                                        ///< Lower case the string.\r
-       void toUpper (uint32 index);                                                            ///< Upper case the character.\r
-       void toUpper ();                                                                                        ///< Upper case the string.\r
-\r
-       unsigned char* toPascalString (unsigned char* buf);                     ///< Pascal string conversion\r
-       const String& fromPascalString (const unsigned char* buf);      ///< Pascal string conversion\r
-\r
-       bool toWideString (uint32 sourceCodePage = kCP_Default);        ///< Converts to wide string according to sourceCodePage\r
-       bool toMultiByte (uint32 destCodePage = kCP_Default);\r
-\r
-       void fromUTF8 (const char8* utf8String);                                ///< Assigns from UTF8 string\r
-       bool normalize (UnicodeNormalization = kUnicodeNormC);  ///< On PC only kUnicodeNormC is working\r
-\r
-#if SMTG_OS_MACOS\r
-       virtual bool fromCFStringRef (const void*, uint32 encoding = 0xFFFF);   ///< CFString conversion\r
-#endif\r
-       //-------------------------------------------------------------------------\r
-\r
-       //-----------------------------------------------------------------------------\r
-protected:\r
-       bool resize (uint32 newSize, bool wide, bool fill = false);\r
-\r
-private:\r
-       void tryFreeBuffer ();\r
-       bool checkToMultiByte (uint32 destCodePage = kCP_Default) const; // to remove debug code from inline - const_cast inside!!!\r
-};\r
-\r
-// String concatenation functions.\r
-inline String operator+ (const ConstString& s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const ConstString& s1, const char8* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const ConstString& s1, const char16* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char8* s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char16* s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const ConstString& s1, const String& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const String& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const char8* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const char16* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char8* s1, const String& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char16* s1, const String& s2) {return String (s1).append (s2);}\r
-\r
-//-----------------------------------------------------------------------------\r
-// ConstString\r
-//-----------------------------------------------------------------------------\r
-inline const tchar* ConstString::text () const\r
-{\r
-#ifdef UNICODE\r
-       return text16 ();\r
-#else\r
-       return text8 ();\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char8* ConstString::text8 () const\r
-{\r
-       return (!isWide && buffer8) ? buffer8: kEmptyString8;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char16* ConstString::text16 () const\r
-{\r
-       return (isWide && buffer16) ? buffer16 : kEmptyString16;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char8 ConstString::getChar8 (uint32 index) const\r
-{\r
-       if (index < len && buffer8 && !isWide)\r
-               return buffer8[index];\r
-       return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char16 ConstString::getChar16 (uint32 index) const\r
-{\r
-       if (index < len && buffer16 && isWide)\r
-               return buffer16[index];\r
-       return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline tchar ConstString::getChar (uint32 index) const\r
-{\r
-#ifdef UNICODE\r
-       return getChar16 (index);\r
-#else\r
-       return getChar8 (index);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline tchar ConstString::getCharAt (uint32 index) const\r
-{\r
-#ifdef UNICODE\r
-       if (isWide)\r
-               return getChar16 (index);\r
-#endif\r
-\r
-       return static_cast<tchar> (getChar8 (index));\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline int64 ConstString::getNumber () const\r
-{\r
-       int64 tmp = 0;\r
-       scanInt64 (tmp);\r
-       return tmp;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanInt32_8 (const char8* text, int32& value, bool scanToEnd)\r
-{\r
-       int64 tmp;\r
-       if (scanInt64_8 (text, tmp, scanToEnd))\r
-       {\r
-               value = (int32)tmp;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanInt32_16 (const char16* text, int32& value, bool scanToEnd)\r
-{\r
-       int64 tmp;\r
-       if (scanInt64_16 (text, tmp, scanToEnd))\r
-       {\r
-               value = (int32)tmp;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanInt32 (const tchar* text, int32& value, bool scanToEnd)\r
-{\r
-       int64 tmp;\r
-       if (scanInt64 (text, tmp, scanToEnd))\r
-       {\r
-               value = (int32)tmp;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanUInt32_8 (const char8* text, uint32& value, bool scanToEnd)\r
-{\r
-       uint64 tmp;\r
-       if (scanUInt64_8 (text, tmp, scanToEnd))\r
-       {\r
-               value = (uint32)tmp;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanUInt32_16 (const char16* text, uint32& value, bool scanToEnd)\r
-{\r
-       uint64 tmp;\r
-       if (scanUInt64_16 (text, tmp, scanToEnd))\r
-       {\r
-               value = (uint32)tmp;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanUInt32 (const tchar* text, uint32& value, bool scanToEnd)\r
-{\r
-       uint64 tmp;\r
-       if (scanUInt64 (text, tmp, scanToEnd))\r
-       {\r
-               value = (uint32)tmp;\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char8* String::text8 () const\r
-{\r
-       if (isWide && !isEmpty ())\r
-               checkToMultiByte (); // this should be avoided, since it can lead to information loss\r
-\r
-       return ConstString::text8 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char16* String::text16 () const\r
-{\r
-       if (!isWide && !isEmpty ())\r
-       {\r
-               const_cast<String&> (*this).toWideString ();\r
-       }\r
-       return ConstString::text16 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char8 String::getChar8 (uint32 index) const\r
-{\r
-       if (isWide && !isEmpty ())\r
-               checkToMultiByte (); // this should be avoided, since it can lead to information loss\r
-\r
-       return ConstString::getChar8 (index);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char16 String::getChar16 (uint32 index) const\r
-{\r
-       if (!isWide && !isEmpty ())\r
-       {\r
-               const_cast<String&> (*this).toWideString ();\r
-       }\r
-       return ConstString::getChar16 (index);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-\r
-\r
-inline bool operator<  (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) < 0) ? true : false;}\r
-inline bool operator<= (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) <= 0) ? true : false;}\r
-inline bool operator>  (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) > 0) ? true : false;}\r
-inline bool operator>= (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) >= 0) ? true : false;}\r
-inline bool operator== (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) == 0) ? true : false;}\r
-inline bool operator!= (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) != 0) ? true : false;}\r
-\r
-inline bool operator<  (const ConstString& s1, const char8* s2) {return (s1.compare (s2) < 0) ? true : false;}\r
-inline bool operator<= (const ConstString& s1, const char8* s2) {return (s1.compare (s2) <= 0) ? true : false;}\r
-inline bool operator>  (const ConstString& s1, const char8* s2) {return (s1.compare (s2) > 0) ? true : false;}\r
-inline bool operator>= (const ConstString& s1, const char8* s2) {return (s1.compare (s2) >= 0) ? true : false;}\r
-inline bool operator== (const ConstString& s1, const char8* s2) {return (s1.compare (s2) == 0) ? true : false;}\r
-inline bool operator!= (const ConstString& s1, const char8* s2) {return (s1.compare (s2) != 0) ? true : false;}\r
-inline bool operator<  (const char8* s1, const ConstString& s2) {return (s2.compare (s1) > 0) ? true : false;}\r
-inline bool operator<= (const char8* s1, const ConstString& s2) {return (s2.compare (s1) >= 0) ? true : false;}\r
-inline bool operator>  (const char8* s1, const ConstString& s2) {return (s2.compare (s1) < 0) ? true : false;}\r
-inline bool operator>= (const char8* s1, const ConstString& s2) {return (s2.compare (s1) <= 0) ? true : false;}\r
-inline bool operator== (const char8* s1, const ConstString& s2) {return (s2.compare (s1) == 0) ? true : false;}\r
-inline bool operator!= (const char8* s1, const ConstString& s2) {return (s2.compare (s1) != 0) ? true : false;}\r
-\r
-inline bool operator<  (const ConstString& s1, const char16* s2) {return (s1.compare (s2) < 0) ? true : false;}\r
-inline bool operator<= (const ConstString& s1, const char16* s2) {return (s1.compare (s2) <= 0) ? true : false;}\r
-inline bool operator>  (const ConstString& s1, const char16* s2) {return (s1.compare (s2) > 0) ? true : false;}\r
-inline bool operator>= (const ConstString& s1, const char16* s2) {return (s1.compare (s2) >= 0) ? true : false;}\r
-inline bool operator== (const ConstString& s1, const char16* s2) {return (s1.compare (s2) == 0) ? true : false;}\r
-inline bool operator!= (const ConstString& s1, const char16* s2) {return (s1.compare (s2) != 0) ? true : false;}\r
-inline bool operator<  (const char16* s1, const ConstString& s2) {return (s2.compare (s1) > 0) ? true : false;}\r
-inline bool operator<= (const char16* s1, const ConstString& s2) {return (s2.compare (s1) >= 0) ? true : false;}\r
-inline bool operator>  (const char16* s1, const ConstString& s2) {return (s2.compare (s1) < 0) ? true : false;}\r
-inline bool operator>= (const char16* s1, const ConstString& s2) {return (s2.compare (s1) <= 0) ? true : false;}\r
-inline bool operator== (const char16* s1, const ConstString& s2) {return (s2.compare (s1) == 0) ? true : false;}\r
-inline bool operator!= (const char16* s1, const ConstString& s2) {return (s2.compare (s1) != 0) ? true : false;}\r
-\r
-// The following functions will only work with European Numbers!\r
-// (e.g. Arabic, Tibetan, and Khmer digits are not supported)\r
-extern int32 strnatcmp8 (const char8* s1, const char8* s2, bool caseSensitive = true);\r
-extern int32 strnatcmp16 (const char16* s1, const char16* s2, bool caseSensitive = true);\r
-inline int32 strnatcmp (const tchar* s1, const tchar* s2, bool caseSensitive = true)\r
-{\r
-#ifdef UNICODE\r
-       return strnatcmp16 (s1, s2, caseSensitive);\r
-#else\r
-       return strnatcmp8 (s1, s2, caseSensitive);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-/** StringObject implements IStringResult and IString methods.\r
-    It can therefore be exchanged with other Steinberg objects using one or both of these\r
-interfaces.\r
-\r
-\see String, ConstString\r
-*/\r
-//-----------------------------------------------------------------------------\r
-class StringObject : public FObject, public String, public IStringResult, public IString\r
-{\r
-public:\r
-//-----------------------------------------------------------------------------\r
-       StringObject () {}\r
-       StringObject (const char16* str, int32 n = -1, bool isTerminated = true) : String (str, n, isTerminated) {}\r
-       StringObject (const char8* str, int32 n = -1, bool isTerminated = true) : String (str, n, isTerminated) {}\r
-       StringObject (const StringObject& str, int32 n = -1) : String (str, n) {}\r
-       StringObject (const String& str, int32 n = -1) : String (str, n) {}\r
-       StringObject (const FVariant& var) : String (var) {}\r
-\r
-       using String::operator=;\r
-\r
-       // IStringResult ----------------------------------------------------------\r
-       virtual void PLUGIN_API setText (const char8* text) SMTG_OVERRIDE;\r
-       //-------------------------------------------------------------------------\r
-\r
-       // IString-----------------------------------------------------------------\r
-       virtual void PLUGIN_API setText8 (const char8* text) SMTG_OVERRIDE;\r
-       virtual void PLUGIN_API setText16 (const char16* text) SMTG_OVERRIDE;\r
-\r
-       virtual const char8* PLUGIN_API getText8 () SMTG_OVERRIDE;\r
-       virtual const char16* PLUGIN_API getText16 () SMTG_OVERRIDE;\r
-\r
-       virtual void PLUGIN_API take (void* s, bool _isWide) SMTG_OVERRIDE;\r
-       virtual bool PLUGIN_API isWideString () const SMTG_OVERRIDE;\r
-       //-------------------------------------------------------------------------\r
-\r
-       OBJ_METHODS (StringObject, FObject)\r
-       FUNKNOWN_METHODS2 (IStringResult, IString, FObject)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp
deleted file mode 100644 (file)
index 6e75c2c..0000000
+++ /dev/null
@@ -1,721 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/updatehandler.cpp\r
-// Created by  : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/updatehandler.h"\r
-#include "base/source/classfactoryhelpers.h"\r
-#include "base/source/fstring.h"\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-#include <unordered_map>\r
-#else\r
-#include <map>\r
-#endif\r
-#include <deque>\r
-#include <vector>\r
-#include <algorithm>\r
-\r
-#define NON_EXISTING_DEPENDENCY_CHECK 0 // not yet\r
-#define CLASS_NAME_TRACKED DEVELOPMENT\r
-\r
-using Steinberg::Base::Thread::FGuard;\r
-\r
-namespace Steinberg {\r
-\r
-DEF_CLASS_IID (IUpdateManager)\r
-bool UpdateHandler::lockUpdates = false;\r
-\r
-namespace Update {\r
-const uint32 kHashSize = (1 << 8); // must be power of 2 (16 bytes * 256 == 4096)\r
-const uint32 kMapSize = 1024 * 10;\r
-\r
-//------------------------------------------------------------------------\r
-inline uint32 hashPointer (void* p)\r
-{\r
-       return (uint32)((uint64 (p) >> 12) & (kHashSize - 1));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline IPtr<FUnknown> getUnknownBase (FUnknown* unknown)\r
-{\r
-       FUnknown* result = nullptr;\r
-       if (unknown)\r
-               unknown->queryInterface (FUnknown::iid, (void**)&result);\r
-\r
-       return owned (result);\r
-}\r
-\r
-#if CLASS_NAME_TRACKED\r
-//------------------------------------------------------------------------\r
-struct Dependency\r
-{\r
-       Dependency (FUnknown* o, IDependent* d)\r
-       : obj (o), dep (d), objClass (nullptr), depClass (nullptr)\r
-       {\r
-       }\r
-\r
-       inline bool operator== (const Dependency& d) const { return obj == d.obj; }\r
-       inline bool operator!= (const Dependency& d) const { return obj != d.obj; }\r
-       inline bool operator< (const Dependency& d) const { return obj < d.obj; }\r
-       inline bool operator> (const Dependency& d) const { return obj > d.obj; }\r
-       FUnknown* obj;\r
-       IDependent* dep;\r
-\r
-       FClassID objClass;\r
-       FClassID depClass;\r
-};\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-struct DeferedChange\r
-{\r
-       DeferedChange (FUnknown* o, int32 m = 0) : obj (o), msg (m) {}\r
-       ~DeferedChange () {}\r
-       DeferedChange (const DeferedChange& r) : obj (r.obj), msg (r.msg) {}\r
-       inline bool operator== (const DeferedChange& d) const { return obj == d.obj; }\r
-       inline bool operator!= (const DeferedChange& d) const { return obj != d.obj; }\r
-       FUnknown* obj;\r
-       int32 msg;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-struct UpdateData\r
-{\r
-       UpdateData (FUnknown* o, IDependent** d, uint32 c)\r
-       : obj (o), dependents (d), count (c)\r
-       {\r
-       }\r
-       FUnknown* obj;\r
-       IDependent** dependents;\r
-       uint32 count;\r
-       bool operator== (const UpdateData& d) const\r
-       {\r
-               return d.obj == obj && d.dependents == dependents;\r
-       }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-typedef std::deque<DeferedChange> DeferedChangeList;\r
-typedef DeferedChangeList::const_iterator DeferedChangeListIterConst;\r
-typedef DeferedChangeList::iterator DeferedChangeListIter;\r
-\r
-typedef std::deque<UpdateData> UpdateDataList;\r
-typedef UpdateDataList::const_iterator UpdateDataListIterConst;\r
-\r
-#if CLASS_NAME_TRACKED\r
-typedef std::vector<Dependency> DependentList;\r
-#else\r
-typedef std::vector<IDependent*> DependentList;\r
-#endif\r
-typedef DependentList::iterator DependentListIter;\r
-typedef DependentList::const_iterator DependentListIterConst;\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-typedef std::unordered_map<const FUnknown*, DependentList> DependentMap;\r
-#else\r
-typedef std::map<const FUnknown*, DependentList> DependentMap;\r
-#endif\r
-typedef DependentMap::iterator DependentMapIter;\r
-typedef DependentMap::const_iterator DependentMapIterConst;\r
-\r
-struct Table\r
-{\r
-       DependentMap depMap[kHashSize];\r
-       DeferedChangeList defered;\r
-       UpdateDataList updateData;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-void updateDone (FUnknown* unknown, int32 message)\r
-{\r
-       if (message != IDependent::kDestroyed)\r
-       {\r
-               FObject* obj = FObject::unknownToObject (unknown);\r
-               if (obj)\r
-                       obj->updateDone (message);\r
-       }\r
-}\r
-} // namespace Update\r
-\r
-//------------------------------------------------------------------------\r
-static int32 countEntries (Update::DependentMap& map)\r
-{\r
-       int32 total = 0;\r
-       Update::DependentMapIterConst iterMap = map.begin ();\r
-       while (iterMap != map.end ())\r
-       {\r
-               const Update::DependentList& list = iterMap->second;\r
-               Update::DependentListIterConst iterList = list.begin ();\r
-               while (iterList != list.end ())\r
-               {\r
-                       total++;\r
-                       ++iterList;\r
-               }\r
-               ++iterMap;\r
-       }\r
-       return total;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UpdateHandler::UpdateHandler ()\r
-{\r
-       table = NEW Update::Table;\r
-       if (FObject::getUpdateHandler () == nullptr)\r
-               FObject::setUpdateHandler (this);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UpdateHandler::~UpdateHandler ()\r
-{\r
-       if (FObject::getUpdateHandler () == this)\r
-               FObject::setUpdateHandler (nullptr);\r
-       delete table;\r
-       table = nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::addDependent (FUnknown* u, IDependent* _dependent)\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
-       if (!unknown || !_dependent)\r
-               return kResultFalse;\r
-\r
-       FGuard guard (lock);\r
-\r
-#if CLASS_NAME_TRACKED\r
-       Update::Dependency dependent (unknown, _dependent);\r
-\r
-       FObject* obj = FObject::unknownToObject (unknown);\r
-       if (obj)\r
-               dependent.objClass = obj->isA ();\r
-       obj = FObject::unknownToObject (_dependent);\r
-       if (obj)\r
-               dependent.depClass = obj->isA ();\r
-#else\r
-       IDependent* dependent = _dependent;\r
-#endif\r
-\r
-       Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-       Update::DependentMapIter it = map.find (unknown);\r
-       if (it == map.end ())\r
-       {\r
-               Update::DependentList list;\r
-               list.push_back (dependent);\r
-               map[unknown] = list;\r
-       }\r
-       else\r
-       {\r
-               (*it).second.push_back (dependent);\r
-       }\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::removeDependent (FUnknown* u, IDependent* dependent)\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
-       if (unknown == nullptr && dependent == nullptr)\r
-               return kResultFalse;\r
-\r
-       FGuard guard (lock);\r
-\r
-       Update::UpdateDataListIterConst iter = table->updateData.begin ();\r
-       while (iter != table->updateData.end ())\r
-       {\r
-               if ((*iter).obj == unknown || unknown == nullptr)\r
-               {\r
-                       for (uint32 count = 0; count < (*iter).count; count++)\r
-                       {\r
-                               if ((*iter).dependents[count] == dependent)\r
-                                       (*iter).dependents[count] = 0;\r
-                       }\r
-               }\r
-               ++iter;\r
-       }\r
-       // Remove all objects for the given dependent\r
-       if (unknown == nullptr)\r
-       {\r
-               for (uint32 j = 0; j < Update::kHashSize; j++)\r
-               {\r
-                       Update::DependentMap& map = table->depMap[j];\r
-                       Update::DependentMapIter iterMap = map.begin ();\r
-                       while (iterMap != map.end ())\r
-                       {\r
-                               Update::DependentList& list = (*iterMap).second;\r
-                               Update::DependentListIter iterList = list.begin ();\r
-                               while (iterList != list.end ())\r
-                               {\r
-#if CLASS_NAME_TRACKED\r
-                                       if ((*iterList).dep == dependent)\r
-#else\r
-                                       if ((*iterList) == dependent)\r
-#endif\r
-                                       {\r
-                                               iterList = list.erase (iterList);\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ++iterList;\r
-                                       }\r
-                               }\r
-                               ++iterMap;\r
-                       }\r
-               }\r
-       }\r
-       else\r
-       {\r
-               bool mustFlush = true;\r
-\r
-               Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-               Update::DependentMapIter iterList = map.find (unknown);\r
-\r
-#if NON_EXISTING_DEPENDENCY_CHECK\r
-               SMTG_ASSERT (iterList != map.end () && "ERROR: Trying to remove a non existing dependency!")\r
-#endif\r
-               if (iterList != map.end ())\r
-               {\r
-                       if (dependent == nullptr) // Remove all dependents of object\r
-                       {\r
-                               map.erase (iterList);\r
-                       }\r
-                       else // Remove one dependent\r
-                       {\r
-                               int32 eraseCount = 0;\r
-                               Update::DependentList& dependentlist = (*iterList).second;\r
-                               Update::DependentListIter iterDependentlist = dependentlist.begin ();\r
-                               while (iterDependentlist != dependentlist.end ())\r
-                               {\r
-#if CLASS_NAME_TRACKED\r
-                                       if ((*iterDependentlist).dep == dependent)\r
-#else\r
-                                       if ((*iterDependentlist) == dependent)\r
-#endif\r
-                                       {\r
-                                               iterDependentlist = dependentlist.erase (iterDependentlist);\r
-                                               eraseCount++;\r
-                                               if (dependentlist.empty ())\r
-                                               {\r
-                                                       map.erase (iterList);\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ++iterDependentlist;\r
-                                               mustFlush = false;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               if (mustFlush)\r
-                       cancelUpdates (unknown);\r
-       }\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult UpdateHandler::doTriggerUpdates (FUnknown* u, int32 message, bool suppressUpdateDone)\r
-{\r
-       if (lockUpdates)\r
-               return kResultFalse;\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
-       if (!unknown)\r
-               return kResultFalse;\r
-\r
-       // to avoid crashes due to stack overflow, we reduce the amount of memory reserved for the\r
-       // dependents\r
-       IDependent* smallDependents[Update::kMapSize / 10]; // 8kB for x64\r
-       IDependent** dependents = smallDependents;\r
-       int32 maxDependents = Update::kMapSize / 10;\r
-       int32 count = 0;\r
-\r
-       {\r
-               FGuard guard (lock); // scope for lock\r
-\r
-               Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-               Update::DependentMapIterConst iterList = map.find (unknown);\r
-               if (iterList != map.end ())\r
-               {\r
-                       const Update::DependentList& dependentlist = (*iterList).second;\r
-                       Update::DependentListIterConst iterDependentlist = dependentlist.begin ();\r
-                       while (iterDependentlist != dependentlist.end ())\r
-                       {\r
-#if CLASS_NAME_TRACKED\r
-                               dependents[count] = (*iterDependentlist).dep;\r
-#else\r
-                               dependents[count] = *iterDependentlist;\r
-#endif\r
-                               count++;\r
-\r
-                               if (count >= maxDependents)\r
-                               {\r
-                                       if (dependents == smallDependents)\r
-                                       {\r
-                                               dependents = new IDependent*[Update::kMapSize];\r
-                                               memcpy (dependents, smallDependents, count * sizeof (dependents[0]));\r
-                                               maxDependents = Update::kMapSize;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               SMTG_WARNING ("Dependency overflow")\r
-                                               break;\r
-                                       }\r
-                               }\r
-                               ++iterDependentlist;\r
-                       }\r
-               }\r
-\r
-               // push update data on the stack\r
-               if (count > 0)\r
-               {\r
-                       Update::UpdateData data (unknown, dependents, count);\r
-                       table->updateData.push_back (data);\r
-               }\r
-       } // end scope\r
-\r
-       int32 i = 0;\r
-       while (i < count)\r
-       {\r
-               if (dependents[i])\r
-                       dependents[i]->update (unknown, message);\r
-               i++;\r
-       }\r
-\r
-       if (dependents != smallDependents)\r
-               delete[] dependents;\r
-\r
-       // remove update data from the stack\r
-       if (count > 0)\r
-       {\r
-               FGuard guard (lock);\r
-\r
-               table->updateData.pop_back ();\r
-       }\r
-\r
-       // send update done message\r
-       if (suppressUpdateDone == false)\r
-               Update::updateDone (unknown, message);\r
-\r
-       return count > 0 ? kResultTrue : kResultFalse; // Object was found and has been updated\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::triggerUpdates (FUnknown* u, int32 message)\r
-{\r
-       return doTriggerUpdates (u, message, false);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::deferUpdates (FUnknown* u, int32 message)\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
-       if (!unknown)\r
-               return kResultFalse;\r
-\r
-       FGuard guard (lock);\r
-\r
-       Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-       Update::DependentMapIterConst iterList = map.find (unknown);\r
-\r
-       bool hasDependency = (iterList != map.end ());\r
-       if (hasDependency == false)\r
-       {\r
-               Update::updateDone (unknown, message);\r
-               return kResultTrue;\r
-       }\r
-\r
-       bool found = false;\r
-       Update::DeferedChangeListIterConst iter = table->defered.begin ();\r
-       while (iter != table->defered.end ())\r
-       {\r
-               if ((*iter).obj == unknown && (*iter).msg == message)\r
-               {\r
-                       found = true;\r
-                       break;\r
-               }\r
-               ++iter;\r
-       }\r
-\r
-       if (!found)\r
-       {\r
-               Update::DeferedChange change (unknown, message);\r
-               table->defered.push_back (change);\r
-       }\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::triggerDeferedUpdates (FUnknown* unknown)\r
-{\r
-       Update::DeferedChangeList deferedAgain;\r
-       if (!unknown)\r
-       {\r
-               while (table->defered.empty () == false)\r
-               {\r
-                       // Remove first from queue\r
-                       lock.lock ();\r
-\r
-                       FUnknown* obj = table->defered.front ().obj;\r
-                       int32 msg = table->defered.front ().msg;\r
-                       table->defered.pop_front ();\r
-\r
-                       // check if this object is currently being updated. in this case, defer update again...\r
-                       bool canSignal = true;\r
-                       Update::UpdateDataListIterConst iter = table->updateData.begin ();\r
-                       while (iter != table->updateData.end ())\r
-                       {\r
-                               if ((*iter).obj == obj)\r
-                               {\r
-                                       canSignal = false;\r
-                                       break;\r
-                               }\r
-                               ++iter;\r
-                       }\r
-                       lock.unlock ();\r
-\r
-                       if (canSignal)\r
-                       {\r
-                               triggerUpdates (obj, msg);\r
-                       }\r
-                       else\r
-                       {\r
-                               Update::DeferedChange change (obj, msg);\r
-                               deferedAgain.push_back (change);\r
-                       }\r
-               }\r
-       }\r
-       else\r
-       {\r
-               IPtr<FUnknown> object = Update::getUnknownBase (unknown);\r
-               Update::DeferedChange tmp (object);\r
-\r
-               while (true)\r
-               {\r
-                       lock.lock ();\r
-                       Update::DeferedChangeListIter it =\r
-                           std::find (table->defered.begin (), table->defered.end (), tmp);\r
-                       if (it == table->defered.end ())\r
-                       {\r
-                               lock.unlock ();\r
-                               return kResultTrue;\r
-                       }\r
-\r
-                       if ((*it).obj != nullptr)\r
-                       {\r
-                               int32 msg = (*it).msg;\r
-                               table->defered.erase (it);\r
-\r
-                               // check if this object is currently being updated. in this case, defer update\r
-                               // again...\r
-                               bool canSignal = true;\r
-                               Update::UpdateDataListIterConst iter = table->updateData.begin ();\r
-                               while (iter != table->updateData.end ())\r
-                               {\r
-                                       if ((*iter).obj == object)\r
-                                       {\r
-                                               canSignal = false;\r
-                                               break;\r
-                                       }\r
-                                       ++iter;\r
-                               }\r
-                               lock.unlock ();\r
-\r
-                               if (canSignal)\r
-                               {\r
-                                       triggerUpdates (object, msg);\r
-                               }\r
-                               else\r
-                               {\r
-                                       Update::DeferedChange change (object, msg);\r
-                                       deferedAgain.push_back (change);\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       if (deferedAgain.empty () == false)\r
-       {\r
-               FGuard guard (lock);\r
-\r
-               Update::DeferedChangeListIterConst iter = deferedAgain.begin ();\r
-               while (iter != deferedAgain.end ())\r
-               {\r
-                       table->defered.push_back (*iter);\r
-                       ++iter;\r
-               }\r
-       }\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::cancelUpdates (FUnknown* u)\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
-       if (!unknown)\r
-               return kResultFalse;\r
-\r
-       FGuard guard (lock);\r
-\r
-       Update::DeferedChange change (unknown, 0);\r
-       while (1)\r
-       {\r
-               auto iter = std::find (table->defered.begin (), table->defered.end (), change);\r
-               if (iter != table->defered.end ())\r
-                       table->defered.erase (iter);\r
-               else\r
-                       break;\r
-       }\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-size_t UpdateHandler::countDependencies (FUnknown* object)\r
-{\r
-       FGuard guard (lock);\r
-       uint32 res = 0;\r
-\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (object);\r
-       if (unknown)\r
-       {\r
-               Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-               Update::DependentMapIter iterList = map.find (unknown);\r
-               if (iterList != map.end ())\r
-                       return iterList->second.size ();\r
-       }\r
-       else\r
-       {\r
-               for (uint32 j = 0; j < Update::kHashSize; j++)\r
-               {\r
-                       Update::DependentMap& map = table->depMap[j];\r
-                       res += countEntries (map);\r
-               }\r
-       }\r
-       return res;\r
-}\r
-\r
-#if DEVELOPMENT\r
-//------------------------------------------------------------------------\r
-bool UpdateHandler::checkDeferred (FUnknown* object)\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (object);\r
-\r
-       FGuard guard (lock);\r
-\r
-       Update::DeferedChange tmp (unknown);\r
-       Update::DeferedChangeListIterConst it =\r
-           std::find (table->defered.begin (), table->defered.end (), tmp);\r
-       if (it != table->defered.end ())\r
-               return true;\r
-\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UpdateHandler::hasDependencies (FUnknown* u)\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
-       if (!unknown)\r
-               return false;\r
-\r
-       FGuard guard (lock);\r
-\r
-       Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-       Update::DependentMapIterConst iterList = map.find (unknown);\r
-       bool hasDependency = (iterList != map.end ());\r
-\r
-       return hasDependency;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void UpdateHandler::printForObject (FObject* obj) const\r
-{\r
-       IPtr<FUnknown> unknown = Update::getUnknownBase (obj);\r
-       if (!unknown)\r
-               return;\r
-\r
-       FUnknownPtr<IDependent> dep (obj);\r
-\r
-       bool header = false;\r
-\r
-       Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
-       Update::DependentMapIterConst iterList = map.begin ();\r
-       while (iterList != map.end ())\r
-       {\r
-               const Update::DependentList& dependentlist = (*iterList).second;\r
-               Update::DependentListIterConst iterDependentlist = dependentlist.begin ();\r
-               while (iterDependentlist != dependentlist.end ())\r
-               {\r
-#if CLASS_NAME_TRACKED\r
-                       if ((*iterList).first == unknown || (*iterDependentlist).dep == dep.getInterface ())\r
-                       {\r
-                               if (!header)\r
-                               {\r
-                                       FDebugPrint ("Dependencies for object %8" FORMAT_INT64A " %s\n", (uint64)obj,\r
-                                                    obj->isA ());\r
-                                       header = true;\r
-                               }\r
-                               FDebugPrint ("%s %8" FORMAT_INT64A "\n <- %s %8" FORMAT_INT64A "\n",\r
-                                            (*iterDependentlist).depClass, (uint64) (*iterDependentlist).dep,\r
-                                            (*iterDependentlist).objClass, (uint64) ((*iterList).first));\r
-                       }\r
-#else\r
-                       if ((*iterList).first == unknown || (*iterDependentlist) == dep.getInterface ())\r
-                       {\r
-                               if (!header)\r
-                               {\r
-                                       FDebugPrint ("Dependencies for object %8" FORMAT_INT64A " %s\n", (uint64)obj,\r
-                                                    obj->isA ());\r
-                                       header = true;\r
-                               }\r
-                               FDebugPrint ("%8" FORMAT_INT64A "\n <- %8" FORMAT_INT64A "\n",\r
-                                            (uint64) (*iterDependentlist), (uint64) ((*iterList).first));\r
-                       }\r
-#endif\r
-                       ++iterDependentlist;\r
-               }\r
-\r
-               ++iterList;\r
-       }\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h
deleted file mode 100644 (file)
index 4dd41c3..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/source/updatehandler.h\r
-// Created by  : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "base/thread/include/flock.h"\r
-#include "pluginterfaces/base/iupdatehandler.h"\r
-\r
-namespace Steinberg {\r
-\r
-/// @cond ignore\r
-namespace Update { struct Table; }\r
-/// @endcond\r
-\r
-//------------------------------------------------------------------------\r
-/** Handle Send and Cancel pending message for a given object*/\r
-//------------------------------------------------------------------------\r
-class IUpdateManager : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** cancel pending messages send by \param object or by any if object is 0 */\r
-       virtual tresult PLUGIN_API cancelUpdates (FUnknown* object) = 0;\r
-       /** send pending messages send by \param object or by any if object is 0 */\r
-       virtual tresult PLUGIN_API triggerDeferedUpdates (FUnknown* object = 0) = 0;\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUpdateManager, 0x030B780C, 0xD6E6418D, 0x8CE00BC2, 0x09C834D4)\r
-\r
-//------------------------------------------------------------------------------\r
-/**\r
-UpdateHandler implements IUpdateManager and IUpdateHandler to handle dependencies\r
-between objects to store and forward messages to dependent objects.\r
-\r
-This implementation is thread save, so objects can send message, add or remove\r
-dependents from different threads.\r
-Do do so it uses mutex, so be aware of locking.\r
-*/\r
-//------------------------------------------------------------------------------\r
-class UpdateHandler : public FObject, public IUpdateHandler, public IUpdateManager\r
-{\r
-public:\r
-//------------------------------------------------------------------------------\r
-       UpdateHandler ();\r
-       ~UpdateHandler ();\r
-\r
-       using FObject::addDependent;\r
-       using FObject::removeDependent;\r
-       using FObject::deferUpdate;\r
-\r
-       // IUpdateHandler\r
-       /** register \param dependent to get messages from \param object */\r
-       virtual tresult PLUGIN_API addDependent (FUnknown* object, IDependent* dependent) SMTG_OVERRIDE;\r
-       /** unregister \param dependent to get no messages from \param object */\r
-       virtual tresult PLUGIN_API removeDependent (FUnknown* object,\r
-                                                   IDependent* dependent) SMTG_OVERRIDE;\r
-       /** send \param message to all dependents of \param object immediately */\r
-       virtual tresult PLUGIN_API triggerUpdates (FUnknown* object, int32 message) SMTG_OVERRIDE;\r
-       /** send \param message to all dependents of \param object when idle */\r
-       virtual tresult PLUGIN_API deferUpdates (FUnknown* object, int32 message) SMTG_OVERRIDE;\r
-\r
-       // IUpdateManager\r
-       /** cancel pending messages send by \param object or by any if object is 0 */\r
-       virtual tresult PLUGIN_API cancelUpdates (FUnknown* object) SMTG_OVERRIDE;\r
-       /** send pending messages send by \param object or by any if object is 0 */\r
-       virtual tresult PLUGIN_API triggerDeferedUpdates (FUnknown* object = 0) SMTG_OVERRIDE;\r
-\r
-       /// @cond ignore\r
-       // obsolete functions kept for compatibility\r
-       void checkUpdates (FObject* object = nullptr) { triggerDeferedUpdates (object->unknownCast ()); }\r
-       void flushUpdates (FObject* object) { cancelUpdates (object->unknownCast ()); }\r
-       void deferUpdate (FObject* object, int32 message)\r
-       {\r
-               deferUpdates (object->unknownCast (), message);\r
-       }\r
-       void signalChange (FObject* object, int32 message, bool suppressUpdateDone = false)\r
-       {\r
-               doTriggerUpdates (object->unknownCast (), message, suppressUpdateDone);\r
-       }\r
-#if DEVELOPMENT\r
-       bool checkDeferred (FUnknown* object);\r
-       bool hasDependencies (FUnknown* object);\r
-       void printForObject (FObject* object) const;\r
-#endif\r
-       /// @endcond\r
-       size_t countDependencies (FUnknown* object = nullptr);\r
-\r
-       OBJ_METHODS (UpdateHandler, FObject)\r
-       FUNKNOWN_METHODS2 (IUpdateHandler, IUpdateManager, FObject)\r
-       SINGLETON (UpdateHandler)\r
-//------------------------------------------------------------------------------\r
-private:\r
-       tresult doTriggerUpdates (FUnknown* object, int32 message, bool suppressUpdateDone);\r
-\r
-       Steinberg::Base::Thread::FLock lock;\r
-       Update::Table* table = nullptr;\r
-       friend struct LockUpdateDependencies;\r
-       static bool lockUpdates;\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h
deleted file mode 100644 (file)
index 3a508dd..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/thread/include/flock.h\r
-// Created by  : Steinberg, 1995\r
-// Description : locks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------------\r
-/** @file base/thread/include/flock.h\r
-    Locks. */\r
-/** @defgroup baseLocks Locks */\r
-//----------------------------------------------------------------------------------\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "pluginterfaces/base/ftypes.h"\r
-\r
-#if SMTG_PTHREADS\r
-#include <pthread.h>\r
-\r
-#elif SMTG_OS_WINDOWS\r
-struct CRITSECT                                                        // CRITICAL_SECTION\r
-{\r
-       void* DebugInfo;                                        // PRTL_CRITICAL_SECTION_DEBUG DebugInfo;\r
-       Steinberg::int32 LockCount;                     // LONG LockCount;\r
-       Steinberg::int32 RecursionCount;        // LONG RecursionCount;\r
-       void* OwningThread;                                     // HANDLE OwningThread\r
-       void* LockSemaphore;                            // HANDLE LockSemaphore\r
-       Steinberg::int32 SpinCount;                     // ULONG_PTR SpinCount\r
-};\r
-#endif\r
-\r
-namespace Steinberg {\r
-namespace Base {\r
-namespace Thread {\r
-\r
-//------------------------------------------------------------------------\r
-/** Lock interface declaration.\r
-@ingroup baseLocks     */\r
-//------------------------------------------------------------------------\r
-struct ILock\r
-{\r
-//------------------------------------------------------------------------\r
-       virtual ~ILock () {}\r
-\r
-       /** Enables lock. */\r
-       virtual void lock () = 0;\r
-\r
-       /** Disables lock. */\r
-       virtual void unlock () = 0;\r
-\r
-       /** Tries to disable lock. */\r
-       virtual bool trylock () = 0;\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/**    FLock declaration.\r
-@ingroup baseLocks     */\r
-//------------------------------------------------------------------------\r
-class FLock : public ILock\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-\r
-       /** Lock constructor.\r
-        *  @param name lock name\r
-        */\r
-       FLock (const char8* name = "FLock");\r
-\r
-       /** Lock destructor. */\r
-       ~FLock ();\r
-\r
-       //-- ILock -----------------------------------------------------------\r
-       virtual void lock () SMTG_OVERRIDE;\r
-       virtual void unlock () SMTG_OVERRIDE;\r
-       virtual bool trylock () SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-#if SMTG_PTHREADS\r
-       pthread_mutex_t mutex; ///< Mutex object\r
-\r
-#elif SMTG_OS_WINDOWS\r
-       CRITSECT section; ///< Critical section object\r
-#endif\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/**    FLockObj declaration. Reference counted lock\r
-@ingroup baseLocks     */\r
-//------------------------------------------------------------------------\r
-class FLockObject : public FObject, public FLock\r
-{\r
-public:\r
-       OBJ_METHODS (FLockObject, FObject)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/**    FGuard - automatic object for locks.\r
-@ingroup baseLocks     */\r
-//------------------------------------------------------------------------\r
-class FGuard\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-\r
-       /** FGuard constructor.\r
-        *  @param _lock guard this lock\r
-        */\r
-       FGuard (ILock& _lock) : lock (_lock) { lock.lock (); }\r
-\r
-       /** FGuard destructor. */\r
-       ~FGuard () { lock.unlock (); }\r
-\r
-//------------------------------------------------------------------------\r
-private:\r
-       ILock& lock; ///< guarded lock\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/**    Conditional Guard - Locks only if valid lock is passed.\r
-@ingroup baseLocks     */\r
-//------------------------------------------------------------------------\r
-class FConditionalGuard\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-\r
-       /** FConditionGuard constructor.\r
-        *  @param _lock guard this lock\r
-        */\r
-       FConditionalGuard (FLock* _lock) : lock (_lock)\r
-       {\r
-               if (lock)\r
-                       lock->lock ();\r
-       }\r
-\r
-       /** FConditionGuard destructor. */\r
-       ~FConditionalGuard ()\r
-       {\r
-               if (lock)\r
-                       lock->unlock ();\r
-       }\r
-\r
-//------------------------------------------------------------------------\r
-private:\r
-       FLock* lock; ///< guarded lock\r
-};\r
-\r
-} // Thread\r
-} // Base\r
-} // Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp
deleted file mode 100644 (file)
index 0df5a73..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : SDK Base\r
-// Version     : 1.0\r
-//\r
-// Category    : Helpers\r
-// Filename    : base/thread/source/flock.cpp\r
-// Created by  : Steinberg, 1995\r
-// Description : Locks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#define DEBUG_LOCK 0\r
-\r
-#include "base/thread/include/flock.h"\r
-#include "base/source/fdebug.h"\r
-\r
-//------------------------------------------------------------------------\r
-#if SMTG_OS_WINDOWS\r
-//------------------------------------------------------------------------\r
-#ifndef WINVER\r
-#define WINVER 0x0500\r
-#endif\r
-#ifndef _WIN32_WINNT\r
-#define _WIN32_WINNT WINVER\r
-#endif\r
-\r
-#include <windows.h>\r
-#include <objbase.h>\r
-#define INIT_CS(cs) \\r
-       InitializeCriticalSection ((LPCRITICAL_SECTION)&cs);\r
-\r
-#endif\r
-\r
-namespace Steinberg {\r
-namespace Base {\r
-namespace Thread {\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//     FLock implementation\r
-//------------------------------------------------------------------------\r
-FLock::FLock (const char8* /*name*/)\r
-{\r
-#if SMTG_PTHREADS\r
-       pthread_mutexattr_t mutexAttr;\r
-       pthread_mutexattr_init (&mutexAttr);\r
-       pthread_mutexattr_settype (&mutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
-       if (pthread_mutex_init (&mutex, &mutexAttr) != 0)\r
-               {SMTG_WARNING("mutex_init failed")}\r
-       pthread_mutexattr_destroy (&mutexAttr);\r
-\r
-#elif SMTG_OS_WINDOWS\r
-       INIT_CS (section)\r
-#else\r
-#warning implement FLock!\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FLock::~FLock ()\r
-{\r
-#if SMTG_PTHREADS\r
-       pthread_mutex_destroy (&mutex);\r
-\r
-#elif SMTG_OS_WINDOWS\r
-       DeleteCriticalSection ((LPCRITICAL_SECTION)&section);\r
-\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FLock::lock ()\r
-{\r
-#if DEBUG_LOCK\r
-       FDebugPrint ("FLock::lock () %x\n", this);\r
-#endif\r
-\r
-#if SMTG_PTHREADS\r
-       pthread_mutex_lock (&mutex);\r
-\r
-#elif SMTG_OS_WINDOWS\r
-       EnterCriticalSection ((LPCRITICAL_SECTION)&section);\r
-\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FLock::unlock ()\r
-{\r
-#if DEBUG_LOCK\r
-       FDebugPrint ("FLock::unlock () %x\n", this);\r
-#endif\r
-\r
-#if SMTG_PTHREADS\r
-       pthread_mutex_unlock (&mutex);\r
-\r
-#elif SMTG_OS_WINDOWS\r
-       LeaveCriticalSection ((LPCRITICAL_SECTION)&section);\r
-\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FLock::trylock ()\r
-{\r
-#if SMTG_PTHREADS\r
-       return pthread_mutex_trylock (&mutex) == 0;\r
-\r
-#elif SMTG_OS_WINDOWS\r
-       return TryEnterCriticalSection ((LPCRITICAL_SECTION)&section) != 0 ? true : false;\r
-\r
-#else\r
-       return false;\r
-#endif\r
-}\r
-\r
-} // Thread\r
-} // Base\r
-} // Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt
deleted file mode 100644 (file)
index c653a2e..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-This license applies only to files referencing this license,\r
-for other files of the Software Development Kit the respective embedded license text\r
-is applicable. The license can be found at: www.steinberg.net/sdklicenses_vst3\r
-\r
-This Software Development Kit is licensed under the terms of the Steinberg VST3 License,\r
-or alternatively under the terms of the General Public License (GPL) Version 3.\r
-You may use the Software Development Kit according to either of these licenses as it is\r
-most appropriate for your project on a case-by-case basis (commercial or not).\r
-\r
-a) Proprietary Steinberg VST3 License\r
-The Software Development Kit may not be distributed in parts or its entirety\r
-without prior written agreement by Steinberg Media Technologies GmbH.\r
-The SDK must not be used to re-engineer or manipulate any technology used\r
-in any Steinberg or Third-party application or software module,\r
-unless permitted by law.\r
-Neither the name of the Steinberg Media Technologies GmbH nor the names of its\r
-contributors may be used to endorse or promote products derived from this\r
-software without specific prior written permission.\r
-Before publishing a software under the proprietary license, you need to obtain a copy\r
-of the License Agreement signed by Steinberg Media Technologies GmbH.\r
-The Steinberg VST SDK License Agreement can be found at:\r
-www.steinberg.net/en/company/developers.html\r
-\r
-THE SDK IS PROVIDED BY STEINBERG MEDIA TECHNOLOGIES GMBH "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-IN NO EVENT SHALL STEINBERG MEDIA TECHNOLOGIES GMBH BE LIABLE FOR ANY DIRECT,\r
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-b) General Public License (GPL) Version 3\r
-Details of these licenses can be found at: www.gnu.org/licenses/gpl-3.0.html\r
-//----------------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp
deleted file mode 100644 (file)
index c8cc596..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/conststringtable.cpp\r
-// Created by  : Steinberg, 09/2007\r
-// Description : constant unicode string table\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "conststringtable.h"\r
-#include <cstring>\r
-#include <map>\r
-\r
-namespace Steinberg {\r
-\r
-static std::map<const char8*, char16*>* stringMap;\r
-static std::map<const char8, char16>* charMap;\r
-\r
-static char16* generateUTF16 (const char8* str);\r
-\r
-//----------------------------------------------------------------------------\r
-ConstStringTable* ConstStringTable::instance ()\r
-{\r
-       static ConstStringTable stringTable;\r
-       return &stringTable;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-const char16* ConstStringTable::getString (const char8* str) const\r
-{\r
-       std::map<const char8*, char16*>::iterator iter = stringMap->find (str);\r
-       if (iter != stringMap->end ())\r
-               return iter->second;\r
-       char16* uStr = generateUTF16 (str);\r
-       stringMap->insert (std::make_pair (str, uStr));\r
-       return uStr;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-const char16 ConstStringTable::getString (const char8 str) const\r
-{\r
-       std::map<const char8, char16>::iterator iter = charMap->find (str);\r
-       if (iter != charMap->end ())\r
-               return iter->second;\r
-       char16 uStr = 0;\r
-#if BYTEORDER == kBigEndian\r
-       char8* puStr = (char8*)&uStr;\r
-       puStr[1] = str;\r
-#else\r
-       uStr = str;\r
-#endif\r
-       charMap->insert (std::make_pair (str, uStr));\r
-       return uStr;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-ConstStringTable::ConstStringTable ()\r
-{\r
-       stringMap = new std::map<const char8*, char16*>;\r
-       charMap = new std::map<const char8, char16>;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-ConstStringTable::~ConstStringTable ()\r
-{\r
-       // free out allocated strings\r
-       {\r
-               std::map<const char8*, char16*>::iterator iter = stringMap->begin ();\r
-               while (iter != stringMap->end ())\r
-               {\r
-                       delete[] iter->second;\r
-                       iter++;\r
-               }\r
-       } // delete iterator on map before deleting the map\r
-\r
-       delete stringMap;\r
-       delete charMap;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-char16* generateUTF16 (const char8* str)\r
-{\r
-       int32 len = (int32)strlen (str);\r
-       char16* result = new char16[len + 1];\r
-       for (int32 i = 0; i < len; i++)\r
-       {\r
-#if BYTEORDER == kBigEndian\r
-               char8* pChr = (char8*)&result[i];\r
-               pChr[0] = 0;\r
-               pChr[1] = str[i];\r
-#else\r
-               result[i] = str[i];\r
-#endif\r
-       }\r
-       result[len] = 0;\r
-       return result;\r
-}\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h
deleted file mode 100644 (file)
index 530c901..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/conststringtable.h\r
-// Created by  : Steinberg, 09/2007\r
-// Description : constant unicode string table\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ftypes.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/**    Constant unicode string table.\r
-Used for conversion from ASCII string literals to char16.\r
-*/\r
-//------------------------------------------------------------------------\r
-class ConstStringTable\r
-{\r
-public:\r
-       static ConstStringTable* instance ();\r
-\r
-       /** Returns a char16 string of a ASCII string literal*/\r
-       const char16* getString (const char8* str) const;\r
-       /** Returns a char16 character of a ASCII character */\r
-       const char16 getString (const char8 str) const;\r
-\r
-protected:\r
-       ConstStringTable ();\r
-       ~ConstStringTable ();\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp
deleted file mode 100644 (file)
index 4d9a377..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interface IID definitions\r
-// Filename    : pluginterfaces/base/coreiids.cpp\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//------------------------------------------------------------------------\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/base/iupdatehandler.h"\r
-#include "pluginterfaces/base/icloneable.h"\r
-#include "pluginterfaces/base/ibstream.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-\r
-DEF_CLASS_IID (FUnknown)\r
-\r
-DEF_CLASS_IID (ICloneable)\r
-\r
-DEF_CLASS_IID (IDependent)\r
-DEF_CLASS_IID (IUpdateHandler)\r
-\r
-DEF_CLASS_IID (IBStream)\r
-DEF_CLASS_IID (ISizeableStream)\r
-\r
-//------------------------------------------------------------------------\r
-} // Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h
deleted file mode 100644 (file)
index 1123a06..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/falignpop.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Restore alignment settings\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-//---------------------------------------------------------------------------------------------------\r
-#if SMTG_OS_MACOS\r
-       #if TARGET_API_MAC_CARBON\r
-               #if SMTG_PLATFORM_64\r
-                       #pragma pack(pop)\r
-               #else\r
-                       #pragma options align=reset\r
-               #endif\r
-       #endif\r
-#elif defined __BORLANDC__\r
-       #pragma -a-\r
-#elif SMTG_OS_WINDOWS\r
-       #pragma pack(pop)\r
-#endif\r
-//---------------------------------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h
deleted file mode 100644 (file)
index 6003c3d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/falignpush.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Set alignment settings\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------------------------\r
-#if SMTG_OS_MACOS\r
-       #if TARGET_API_MAC_CARBON\r
-               #if SMTG_PLATFORM_64\r
-                       #pragma pack(push, 16)\r
-               #else\r
-                       #pragma options align=mac68k\r
-               #endif\r
-       #endif\r
-#elif defined __BORLANDC__\r
-       #pragma -a8\r
-#elif SMTG_OS_WINDOWS\r
-       #pragma pack(push)\r
-       #if SMTG_PLATFORM_64\r
-               #pragma pack(16)\r
-       #else\r
-               #pragma pack(8)\r
-       #endif\r
-#endif\r
-//----------------------------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h
deleted file mode 100644 (file)
index 51f5c39..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/fplatform.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Detect platform and set define\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#define kLittleEndian  0\r
-#define kBigEndian             1\r
-\r
-#undef PLUGIN_API\r
-\r
-#if !defined (__INTEL_CXX11_MODE__)\r
-#define SMTG_INTEL_CXX11_MODE 0\r
-#else\r
-#define SMTG_INTEL_CXX11_MODE __INTEL_CXX11_MODE__\r
-#endif\r
-\r
-#if !defined (__INTEL_COMPILER)\r
-#define SMTG_INTEL_COMPILER 0\r
-#else\r
-#define SMTG_INTEL_COMPILER __INTEL_COMPILER\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-// WIN32 AND WIN64\r
-#if defined (_WIN32)\r
-       #define SMTG_OS_LINUX   0\r
-       #define SMTG_OS_MACOS   0\r
-       #define SMTG_OS_WINDOWS 1\r
-       #define SMTG_OS_IOS             0\r
-       #define SMTG_OS_OSX             0\r
-\r
-       #define BYTEORDER kLittleEndian\r
-\r
-       #define COM_COMPATIBLE  1\r
-       #define PLUGIN_API __stdcall\r
-       #define SMTG_PTHREADS   0\r
-\r
-       #ifndef _CRT_SECURE_NO_WARNINGS\r
-               #define _CRT_SECURE_NO_WARNINGS\r
-       #endif\r
-\r
-       #pragma warning (disable : 4244) // Conversion from 'type1' to 'type2', possible loss of data.\r
-       #pragma warning (disable : 4250) // Inheritance via dominance is allowed\r
-       #pragma warning (disable : 4996) // deprecated functions\r
-\r
-       #pragma warning (3 : 4189) // local variable is initialized but not referenced\r
-       #pragma warning (3 : 4238) // nonstandard extension used : class rvalue used as lvalue\r
-\r
-       #if defined (_WIN64)       // WIN64 only\r
-               #define SMTG_PLATFORM_64 1\r
-       #else\r
-               #define SMTG_PLATFORM_64 0\r
-       #endif\r
-\r
-       #ifndef WIN32\r
-               #define WIN32   1\r
-       #endif\r
-\r
-       #ifdef __cplusplus\r
-               #define SMTG_CPP11      __cplusplus >= 201103L || _MSC_VER > 1600 || SMTG_INTEL_CXX11_MODE\r
-               #define SMTG_CPP11_STDLIBSUPPORT SMTG_CPP11\r
-               #define SMTG_HAS_NOEXCEPT _MSC_VER >= 1900 || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER >= 1300)\r
-       #endif\r
-//-----------------------------------------------------------------------------\r
-// LINUX\r
-#elif __gnu_linux__\r
-       #define SMTG_OS_LINUX   1\r
-       #define SMTG_OS_MACOS   0\r
-       #define SMTG_OS_WINDOWS 0\r
-       #define SMTG_OS_IOS             0\r
-       #define SMTG_OS_OSX             0\r
-\r
-       #include <endian.h>\r
-       #if __BYTE_ORDER == __LITTLE_ENDIAN\r
-               #define BYTEORDER kLittleEndian\r
-       #else\r
-               #define BYTEORDER kBigEndian\r
-       #endif\r
-\r
-       #define COM_COMPATIBLE  0\r
-       #define PLUGIN_API\r
-       #define SMTG_PTHREADS   1\r
-\r
-       #if __LP64__\r
-               #define SMTG_PLATFORM_64 1\r
-       #else\r
-               #define SMTG_PLATFORM_64 0\r
-       #endif\r
-       #ifdef __cplusplus\r
-               #include <cstddef>\r
-               #define SMTG_CPP11 (__cplusplus >= 201103L)\r
-               #ifndef SMTG_CPP11\r
-                       #error unsupported compiler\r
-               #endif\r
-               #define SMTG_CPP11_STDLIBSUPPORT 1\r
-               #define SMTG_HAS_NOEXCEPT 1\r
-       #endif\r
-//-----------------------------------------------------------------------------\r
-// Mac and iOS\r
-#elif __APPLE__\r
-       #include <TargetConditionals.h>\r
-       #define SMTG_OS_LINUX   0\r
-       #define SMTG_OS_MACOS   1\r
-       #define SMTG_OS_WINDOWS 0\r
-       #define SMTG_OS_IOS             TARGET_OS_IPHONE\r
-       #define SMTG_OS_OSX             TARGET_OS_MAC && !TARGET_OS_IPHONE\r
-\r
-       #if !SMTG_OS_IOS\r
-               #ifndef __CF_USE_FRAMEWORK_INCLUDES__\r
-                       #define __CF_USE_FRAMEWORK_INCLUDES__\r
-               #endif\r
-               #ifndef TARGET_API_MAC_CARBON\r
-                       #define TARGET_API_MAC_CARBON 1\r
-               #endif\r
-       #endif\r
-       #if __LP64__\r
-               #define SMTG_PLATFORM_64 1\r
-       #else\r
-               #define SMTG_PLATFORM_64 0\r
-       #endif\r
-       #if defined (__BIG_ENDIAN__)\r
-               #define BYTEORDER kBigEndian\r
-       #else\r
-               #define BYTEORDER kLittleEndian\r
-       #endif\r
-\r
-       #define COM_COMPATIBLE  0\r
-       #define PLUGIN_API\r
-       #define SMTG_PTHREADS   1\r
-\r
-       #if !defined(__PLIST__) && !defined(SMTG_DISABLE_DEFAULT_DIAGNOSTICS)\r
-               #ifdef __clang__\r
-                       #pragma GCC diagnostic ignored "-Wswitch-enum"\r
-                       #pragma GCC diagnostic ignored "-Wparentheses"\r
-                       #pragma GCC diagnostic ignored "-Wuninitialized"\r
-                       #if __clang_major__ >= 3\r
-                               #pragma GCC diagnostic ignored "-Wtautological-compare"\r
-                               #pragma GCC diagnostic ignored "-Wunused-value"\r
-                               #if __clang_major__ >= 4 || __clang_minor__ >= 1\r
-                                       #pragma GCC diagnostic ignored "-Wswitch"\r
-                                       #pragma GCC diagnostic ignored "-Wcomment"\r
-                               #endif\r
-                               #if __clang_major__ >= 5\r
-                                       #pragma GCC diagnostic ignored "-Wunsequenced"\r
-                                       #if __clang_minor__ >= 1\r
-                                               #pragma GCC diagnostic ignored "-Wunused-const-variable"\r
-                                       #endif\r
-                               #endif\r
-                       #endif\r
-               #endif\r
-       #endif\r
-       #ifdef __cplusplus\r
-               #include <cstddef>\r
-               #define SMTG_CPP11 (__cplusplus >= 201103L || SMTG_INTEL_CXX11_MODE)\r
-               #if defined (_LIBCPP_VERSION) && SMTG_CPP11\r
-                       #define SMTG_CPP11_STDLIBSUPPORT 1\r
-                       #define SMTG_HAS_NOEXCEPT 1\r
-               #else\r
-                       #define SMTG_CPP11_STDLIBSUPPORT 0\r
-                       #define SMTG_HAS_NOEXCEPT 0\r
-               #endif\r
-       #endif\r
-#else\r
-       #pragma error unknown platform\r
-\r
-#endif\r
-\r
-#if !SMTG_RENAME_ASSERT\r
-#undef WINDOWS\r
-#undef MAC\r
-#undef PTHREADS\r
-#undef PLATFORM_64\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define WINDOWS                        SMTG_OS_WINDOWS\r
-#endif\r
-#if SMTG_OS_MACOS\r
-#define MAC                            SMTG_OS_MACOS\r
-#endif\r
-#define PLATFORM_64            SMTG_PLATFORM_64\r
-#define PTHREADS               SMTG_PTHREADS\r
-#endif\r
-//-----------------------------------------------------------------------------\r
-\r
-//-----------------------------------------------------------------------------\r
-#if SMTG_CPP11\r
-#define SMTG_OVERRIDE override\r
-#else\r
-#define SMTG_OVERRIDE\r
-#endif\r
-#if SMTG_HAS_NOEXCEPT\r
-#define SMTG_NOEXCEPT noexcept\r
-#else\r
-#define SMTG_NOEXCEPT\r
-#endif\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h
deleted file mode 100644 (file)
index 4be03a8..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/fstrdefs.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Definitions for handling strings (Unicode / ASCII / Platforms)\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ftypes.h"\r
-\r
-//----------------------------------------------------------------------------\r
-// string methods defines unicode / ASCII\r
-//----------------------------------------------------------------------------\r
-\r
-// 16 bit string operations\r
-#if SMTG_CPP11 // if c++11 unicode string literals\r
-       #define SMTG_CPP11_CAT_PRIVATE_DONT_USE(a,b)                    a ## b\r
-       #if SMTG_OS_WINDOWS\r
-               #define STR16(x) SMTG_CPP11_CAT_PRIVATE_DONT_USE(L,x)\r
-       #else\r
-               #define STR16(x) SMTG_CPP11_CAT_PRIVATE_DONT_USE(u,x)\r
-       #endif\r
-#else\r
-       #include "conststringtable.h"\r
-       #define STR16(x) Steinberg::ConstStringTable::instance ()->getString (x)\r
-#endif\r
-\r
-#ifdef UNICODE\r
-       #define STR(x) STR16(x)\r
-       #define tStrBufferSize(buffer) (sizeof(buffer)/sizeof(Steinberg::tchar))\r
-\r
-#else\r
-       #define STR(x) x\r
-       #define tStrBufferSize(buffer) (sizeof(buffer))\r
-#endif\r
-\r
-#define str8BufferSize(buffer) (sizeof(buffer)/sizeof(Steinberg::char8))\r
-#define str16BufferSize(buffer) (sizeof(buffer)/sizeof(Steinberg::char16))\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define FORMAT_INT64A "I64d"\r
-#define FORMAT_UINT64A "I64u"\r
-\r
-#elif SMTG_OS_MACOS || SMTG_OS_LINUX\r
-#define FORMAT_INT64A  "lld"\r
-#define FORMAT_UINT64A "llu"\r
-#define stricmp                strcasecmp\r
-#define strnicmp       strncasecmp\r
-#endif\r
-\r
-#ifdef UNICODE\r
-#define FORMAT_INT64W STR(FORMAT_INT64A)\r
-#define FORMAT_UINT64W STR(FORMAT_UINT64A)\r
-\r
-#define FORMAT_INT64 FORMAT_INT64W\r
-#define FORMAT_UINT64 FORMAT_UINT64W\r
-#else\r
-#define FORMAT_INT64 FORMAT_INT64A\r
-#define FORMAT_UINT64 FORMAT_UINT64A\r
-#endif\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-// newline\r
-//----------------------------------------------------------------------------\r
-#if SMTG_OS_WINDOWS\r
-#define ENDLINE_A   "\r\n"\r
-#define ENDLINE_W   STR ("\r\n")\r
-#elif SMTG_OS_MACOS\r
-#define ENDLINE_A   "\r"\r
-#define ENDLINE_W   STR ("\r")\r
-#elif SMTG_OS_LINUX\r
-#define ENDLINE_A   "\n"\r
-#define ENDLINE_W   STR ("\n")\r
-#endif\r
-\r
-#ifdef UNICODE\r
-#define ENDLINE ENDLINE_W\r
-#else\r
-#define ENDLINE ENDLINE_A\r
-#endif\r
-\r
-#if SMTG_OS_WINDOWS && !defined(__GNUC__) && defined(_MSC_VER) && (_MSC_VER < 1900)\r
-#define stricmp _stricmp\r
-#define strnicmp _strnicmp\r
-#define snprintf _snprintf\r
-#endif\r
-\r
-namespace Steinberg {\r
-\r
-//----------------------------------------------------------------------------\r
-static const tchar kEmptyString[] = { 0 };\r
-static const char8 kEmptyString8[] = { 0 };\r
-static const char16 kEmptyString16[] = { 0 };\r
-\r
-#ifdef UNICODE\r
-static const tchar kInfiniteSymbol[] = { 0x221E, 0 };\r
-#else\r
-static const tchar* const kInfiniteSymbol = STR ("oo");\r
-#endif\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline int32 _tstrlen (const T* wcs)\r
-{\r
-       const T* eos = wcs;\r
-\r
-       while (*eos++)\r
-               ;\r
-\r
-       return (int32) (eos - wcs - 1);\r
-}\r
-\r
-inline int32 tstrlen (const tchar* str) {return _tstrlen (str);}\r
-inline int32 strlen8 (const char8* str) {return _tstrlen (str);}\r
-inline int32 strlen16 (const char16* str) {return _tstrlen (str);}\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline int32 _tstrcmp (const T* src, const T* dst)\r
-{\r
-       while (*src == *dst && *dst)\r
-       {\r
-               src++;\r
-               dst++;\r
-       }\r
-\r
-       if (*src == 0 && *dst == 0)\r
-               return 0;\r
-       else if (*src == 0)\r
-               return -1;\r
-       else if (*dst == 0)\r
-               return 1;\r
-       else\r
-               return (int32) (*src - *dst);\r
-}\r
-\r
-inline int32 tstrcmp (const tchar* src, const tchar* dst) {return _tstrcmp (src, dst);}\r
-inline int32 strcmp8 (const char8* src, const char8* dst) {return _tstrcmp (src, dst);}\r
-inline int32 strcmp16 (const char16* src, const char16* dst) {return _tstrcmp (src, dst);}\r
-\r
-template <typename T>\r
-inline int32 strcmpT (const T* first, const T* last);\r
-\r
-template <>\r
-inline int32 strcmpT<char8> (const char8* first, const char8* last) { return _tstrcmp (first, last); }\r
-\r
-template <>\r
-inline int32 strcmpT<char16> (const char16* first, const char16* last) { return _tstrcmp (first, last); }\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline int32 _tstrncmp (const T* first, const T* last, uint32 count)\r
-{\r
-       if (count == 0)\r
-               return 0;\r
-\r
-       while (--count && *first && *first == *last)\r
-       {\r
-               first++;\r
-               last++;\r
-       }\r
-\r
-       if (*first == 0 && *last == 0)\r
-               return 0;\r
-       else if (*first == 0)\r
-               return -1;\r
-       else if (*last == 0)\r
-               return 1;\r
-       else\r
-               return (int32) (*first - *last);\r
-}\r
-\r
-inline int32 tstrncmp (const tchar* first, const tchar* last, uint32 count) {return _tstrncmp (first, last, count);}\r
-inline int32 strncmp8 (const char8* first, const char8* last, uint32 count) {return _tstrncmp (first, last, count);}\r
-inline int32 strncmp16 (const char16* first, const char16* last, uint32 count) {return _tstrncmp (first, last, count);}\r
-\r
-template <typename T>\r
-inline int32 strncmpT (const T* first, const T* last, uint32 count);\r
-\r
-template <>\r
-inline int32 strncmpT<char8> (const char8* first, const char8* last, uint32 count) { return _tstrncmp (first, last, count); }\r
-\r
-template <>\r
-inline int32 strncmpT<char16> (const char16* first, const char16* last, uint32 count) {return _tstrncmp (first, last, count); }\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline T* _tstrcpy (T* dst, const T* src)\r
-{\r
-       T* cp = dst;\r
-       while ((*cp++ = *src++) != 0) // copy string\r
-               ;\r
-       return dst;\r
-}\r
-inline tchar* tstrcpy (tchar* dst, const tchar* src) {return _tstrcpy (dst, src);}\r
-inline char8* strcpy8 (char8* dst, const char8* src) {return _tstrcpy (dst, src);}\r
-inline char16* strcpy16 (char16* dst, const char16* src) {return _tstrcpy (dst, src);}\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline T* _tstrncpy (T* dest, const T* source, uint32 count)\r
-{\r
-       T* start = dest;\r
-       while (count && (*dest++ = *source++) != 0) // copy string\r
-               count--;\r
-\r
-       if (count) // pad out with zeros\r
-       {\r
-               while (--count)\r
-                       *dest++ = 0;\r
-       }\r
-       return start;\r
-}\r
-\r
-inline tchar* tstrncpy (tchar* dest, const tchar* source, uint32 count) {return _tstrncpy (dest, source, count);}\r
-inline char8* strncpy8 (char8* dest, const char8* source, uint32 count) {return _tstrncpy (dest, source, count);}\r
-inline char16* strncpy16 (char16* dest, const char16* source, uint32 count) {return _tstrncpy (dest, source, count);}\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline T* _tstrcat (T* dst, const T* src)\r
-{\r
-       T* cp = dst;\r
-\r
-       while (*cp)\r
-               cp++; // find end of dst\r
-\r
-       while ((*cp++ = *src++) != 0) // Copy src to end of dst\r
-               ;\r
-\r
-       return dst;\r
-}\r
-\r
-inline tchar* tstrcat (tchar* dst, const tchar* src) {return _tstrcat (dst, src); }\r
-inline char8* strcat8 (char8* dst, const char8* src) {return _tstrcat (dst, src); }\r
-inline char16* strcat16 (char16* dst, const char16* src) {return _tstrcat (dst, src); }\r
-\r
-//----------------------------------------------------------------------------\r
-inline void str8ToStr16 (char16* dst, const char8* src, int32 n = -1)\r
-{\r
-       int32 i = 0;\r
-       for (;;)\r
-       {\r
-               if (i == n)\r
-               {\r
-                       dst[i] = 0;\r
-                       return;\r
-               }\r
-\r
-#if BYTEORDER == kBigEndian\r
-               char8* pChr = (char8*)&dst[i];\r
-               pChr[0] = 0;\r
-               pChr[1] = src[i];\r
-#else\r
-               dst[i] = static_cast<char16> (src[i]);\r
-#endif\r
-\r
-               if (src[i] == 0)\r
-                       break;\r
-\r
-               i++;\r
-       }\r
-\r
-       while (n > i)\r
-       {\r
-               dst[i] = 0;\r
-               i++;\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool FIDStringsEqual (FIDString id1, FIDString id2)\r
-{\r
-       return (id1 && id2) ? (strcmp8 (id1, id2) == 0) : false;\r
-}\r
-\r
-static const uint32 kPrintfBufferSize = 4096;\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h
deleted file mode 100644 (file)
index fca4c69..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/ftypes.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic data types\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "fplatform.h"\r
-\r
-//#define UNICODE_OFF  // disable / enable unicode\r
-\r
-#ifdef UNICODE_OFF\r
-       #ifdef UNICODE\r
-       #undef UNICODE\r
-       #endif\r
-#else\r
-       #define UNICODE 1\r
-#endif\r
-\r
-#ifdef UNICODE\r
-#define _UNICODE 1\r
-#endif\r
-\r
-namespace Steinberg\r
-{\r
-//-----------------------------------------------------------------\r
-// Integral Types\r
-       typedef char int8;\r
-       typedef unsigned char uint8;\r
-       typedef unsigned char uchar;\r
-\r
-       typedef short int16;\r
-       typedef unsigned short uint16;\r
-\r
-#if SMTG_OS_WINDOWS && !defined(__GNUC__)\r
-       typedef long int32;\r
-       typedef unsigned long uint32;\r
-#else\r
-       typedef int int32;\r
-       typedef unsigned int uint32;\r
-#endif\r
-\r
-       static const int32 kMaxLong = 0x7fffffff;\r
-       static const int32 kMinLong = (-0x7fffffff - 1);\r
-       static const int32 kMaxInt32 = kMaxLong;\r
-       static const int32 kMinInt32 = kMinLong;\r
-       static const uint32 kMaxInt32u = 0xffffffff;\r
-\r
-#if SMTG_OS_WINDOWS && !defined(__GNUC__)\r
-       typedef __int64 int64;\r
-       typedef unsigned __int64 uint64;\r
-       static const int64 kMaxInt64 = 9223372036854775807i64;\r
-       static const int64 kMinInt64 = (-9223372036854775807i64 - 1);\r
-#else\r
-       typedef long long int64;\r
-       typedef unsigned long long uint64;\r
-       static const int64 kMaxInt64 = 0x7fffffffffffffffLL;\r
-       static const int64 kMinInt64 = (-0x7fffffffffffffffLL-1);\r
-#endif\r
-       static const uint64 kMaxInt64u = uint64 (0xffffffff) | (uint64 (0xffffffff) << 32);\r
-\r
-//-----------------------------------------------------------------\r
-// other Semantic Types\r
-       typedef int64 TSize;   // byte (or other) sizes\r
-       typedef int32 tresult; // result code\r
-//-----------------------------------------------------------------\r
-       static const float kMaxFloat = 3.40282346638528860E38;\r
-       static const double kMaxDouble = 1.7976931348623158E308;\r
-\r
-#if SMTG_PLATFORM_64\r
-       typedef uint64 TPtrInt;\r
-#else\r
-       typedef uint32 TPtrInt;\r
-#endif\r
-\r
-//------------------------------------------------------------------\r
-// Boolean\r
-       typedef uint8 TBool;\r
-\r
-//------------------------------------------------------------------\r
-// Char / Strings\r
-       typedef char char8;\r
-#ifdef _NATIVE_WCHAR_T_DEFINED\r
-       typedef __wchar_t char16;\r
-#elif SMTG_CPP11\r
-       typedef char16_t char16;\r
-#else\r
-       typedef int16 char16;\r
-#endif\r
-\r
-#ifdef UNICODE\r
-       typedef char16 tchar;\r
-#else\r
-       typedef char8 tchar;\r
-#endif\r
-\r
-       typedef const char8* CStringA;\r
-       typedef const char16* CStringW;\r
-       typedef const tchar* CString;\r
-       inline bool strEmpty (const tchar* str) { return (!str || *str == 0); }\r
-       inline bool str8Empty (const char8* str) { return (!str || *str == 0); }\r
-       inline bool str16Empty (const char16* str) { return (!str || *str == 0); }\r
-\r
-       typedef const char8* FIDString; // identifier as string (used for attributes, messages)\r
-\r
-       const FIDString kPlatformStringWin = "WIN";\r
-       const FIDString kPlatformStringMac = "MAC";\r
-       const FIDString kPlatformStringIOS = "IOS";\r
-       const FIDString kPlatformStringLinux = "Linux";\r
-#if SMTG_OS_WINDOWS\r
-       const FIDString kPlatformString = kPlatformStringWin;\r
-#elif SMTG_OS_IOS\r
-       const FIDString kPlatformString = kPlatformStringIOS;\r
-#elif SMTG_OS_MACOS\r
-       const FIDString kPlatformString = kPlatformStringMac;\r
-#elif SMTG_OS_LINUX\r
-       const FIDString kPlatformString = kPlatformStringLinux;\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-/** Coordinates        */\r
-       typedef int32 UCoord;\r
-       static const UCoord kMaxCoord = ((UCoord)0x7FFFFFFF);\r
-       static const UCoord kMinCoord = ((UCoord)-0x7FFFFFFF);\r
-}      // namespace Steinberg\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-/** Byte-order Conversion Macros */\r
-//----------------------------------------------------------------------------\r
-#define SWAP_32(l) { \\r
-       unsigned char* p = (unsigned char*)& (l); \\r
-       unsigned char t; \\r
-       t = p[0]; p[0] = p[3]; p[3] = t; t = p[1]; p[1] = p[2]; p[2] = t; }\r
-\r
-#define SWAP_16(w) { \\r
-       unsigned char* p = (unsigned char*)& (w); \\r
-       unsigned char t; \\r
-       t = p[0]; p[0] = p[1]; p[1] = t; }\r
-\r
-#define SWAP_64(i) { \\r
-       unsigned char* p = (unsigned char*)& (i); \\r
-       unsigned char t; \\r
-       t = p[0]; p[0] = p[7]; p[7] = t; t = p[1]; p[1] = p[6]; p[6] = t; \\r
-       t = p[2]; p[2] = p[5]; p[5] = t; t = p[3]; p[3] = p[4]; p[4] = t;}\r
-\r
-namespace Steinberg\r
-{\r
-       static inline void FSwap (int8&) {}\r
-       static inline void FSwap (uint8&) {}\r
-       static inline void FSwap (int16& i16) { SWAP_16 (i16) }\r
-       static inline void FSwap (uint16& i16) { SWAP_16 (i16) }\r
-       static inline void FSwap (int32& i32) { SWAP_32 (i32) }\r
-       static inline void FSwap (uint32& i32) { SWAP_32 (i32) }\r
-       static inline void FSwap (int64& i64) { SWAP_64 (i64) }\r
-       static inline void FSwap (uint64& i64) { SWAP_64 (i64) }\r
-}\r
-\r
-// always inline macros (only when RELEASE is 1)\r
-//----------------------------------------------------------------------------\r
-#if RELEASE\r
-    #if SMTG_OS_MACOS || SMTG_OS_LINUX\r
-               #define SMTG_ALWAYS_INLINE      __inline__ __attribute__((__always_inline__))\r
-               #define SMTG_NEVER_INLINE __attribute__((noinline))\r
-       #elif SMTG_OS_WINDOWS\r
-               #define SMTG_ALWAYS_INLINE      __forceinline\r
-               #define SMTG_NEVER_INLINE __declspec(noinline)\r
-       #endif\r
-#endif\r
-\r
-#ifndef SMTG_ALWAYS_INLINE\r
-       #define SMTG_ALWAYS_INLINE      inline\r
-#endif\r
-#ifndef SMTG_NEVER_INLINE\r
-       #define SMTG_NEVER_INLINE\r
-#endif\r
-\r
-#ifndef SMTG_CPP11_STDLIBSUPPORT\r
-// Enable this for old compilers\r
-// #define nullptr NULL\r
-#endif\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp
deleted file mode 100644 (file)
index 63b7316..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/funknown.cpp\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "funknown.h"\r
-\r
-#include "fstrdefs.h"\r
-\r
-#include <stdio.h>\r
-\r
-#if SMTG_OS_WINDOWS\r
-#include <objbase.h>\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-#include <CoreFoundation/CoreFoundation.h>\r
-#include <libkern/OSAtomic.h>\r
-\r
-#if defined (__GNUC__) && (__GNUC__ >= 4) && !__LP64__\r
-// on 32 bit Mac OS X we can safely ignore the format warnings as sizeof(int) == sizeof(long)\r
-#pragma GCC diagnostic ignored "-Wformat"\r
-#endif\r
-\r
-#endif\r
-\r
-#if SMTG_OS_LINUX\r
-#include <ext/atomicity.h>\r
-#endif\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-#if COM_COMPATIBLE\r
-#if SMTG_OS_WINDOWS\r
-#define GuidStruct GUID\r
-#else\r
-struct GuidStruct\r
-{\r
-    uint32  Data1;\r
-    uint16 Data2;\r
-    uint16 Data3;\r
-    uint8  Data4[8];\r
-};\r
-#endif\r
-#endif\r
-\r
-static void toString8 (char8* string, const char* data, int32 i1, int32 i2);\r
-static void fromString8 (const char8* string, char* data, int32 i1, int32 i2);\r
-static uint32 makeLong (uint8 b1, uint8 b2, uint8 b3, uint8 b4);\r
-\r
-//------------------------------------------------------------------------\r
-//  FUnknownPrivate\r
-//------------------------------------------------------------------------\r
-namespace FUnknownPrivate {\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API atomicAdd (int32& var, int32 d)\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       return InterlockedExchangeAdd (&var, d) + d;\r
-#elif SMTG_OS_MACOS\r
-       return OSAtomicAdd32Barrier (d, (int32_t*)&var);\r
-#elif SMTG_OS_LINUX\r
-       __gnu_cxx::__atomic_add (&var, d);\r
-       return var;\r
-#else\r
-#warning implement me!\r
-       var += d;\r
-       return var;\r
-#endif\r
-}\r
-} // FUnknownPrivate\r
-\r
-//------------------------------------------------------------------------\r
-//     FUID implementation\r
-//------------------------------------------------------------------------\r
-\r
-FUID::FUID ()\r
-{\r
-       memset (data, 0, sizeof (TUID));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FUID::FUID (uint32 l1, uint32 l2, uint32 l3, uint32 l4)\r
-{\r
-       from4Int (l1, l2, l3, l4);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FUID::FUID (const FUID& f)\r
-{\r
-       memcpy (data, f.data, sizeof (TUID));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-FUID::FUID (FUID&& other) {\r
-       memcpy (data, other.data, sizeof (TUID));\r
-}\r
-\r
-FUID& FUID::operator= (FUID&& other)\r
-{\r
-       memcpy (data, other.data, sizeof (TUID));\r
-       return *this;\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::generate ()\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       GUID guid;\r
-       HRESULT hr = CoCreateGuid (&guid);\r
-       switch (hr)\r
-       {\r
-               case RPC_S_OK:\r
-                       memcpy (data, (char*)&guid, sizeof (TUID));\r
-                       return true;\r
-\r
-               case RPC_S_UUID_LOCAL_ONLY:\r
-               default:\r
-                       return false;\r
-       }\r
-\r
-#elif SMTG_OS_MACOS\r
-       CFUUIDRef uuid = CFUUIDCreate (kCFAllocatorDefault);\r
-       if (uuid)\r
-       {\r
-               CFUUIDBytes bytes = CFUUIDGetUUIDBytes (uuid);\r
-               memcpy (data, (char*)&bytes, sizeof (TUID));\r
-               CFRelease (uuid);\r
-               return true;\r
-       }\r
-       return false;\r
-\r
-#else\r
-#warning implement me!\r
-       return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::isValid () const\r
-{\r
-       TUID nulluid = {0};\r
-\r
-       return memcmp (data, nulluid, sizeof (TUID)) != 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FUID& FUID::operator = (const FUID& f)\r
-{\r
-       memcpy (data, f.data, sizeof (TUID));\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::from4Int (uint32 l1, uint32 l2, uint32 l3, uint32 l4)\r
-{\r
-#if COM_COMPATIBLE\r
-       data [0]  = (char)((l1 & 0x000000FF)      );\r
-       data [1]  = (char)((l1 & 0x0000FF00) >>  8);\r
-       data [2]  = (char)((l1 & 0x00FF0000) >> 16);\r
-       data [3]  = (char)((l1 & 0xFF000000) >> 24);\r
-       data [4]  = (char)((l2 & 0x00FF0000) >> 16);\r
-       data [5]  = (char)((l2 & 0xFF000000) >> 24);\r
-       data [6]  = (char)((l2 & 0x000000FF)      );\r
-       data [7]  = (char)((l2 & 0x0000FF00) >>  8);\r
-       data [8]  = (char)((l3 & 0xFF000000) >> 24);\r
-       data [9]  = (char)((l3 & 0x00FF0000) >> 16);\r
-       data [10] = (char)((l3 & 0x0000FF00) >>  8);\r
-       data [11] = (char)((l3 & 0x000000FF)      );\r
-       data [12] = (char)((l4 & 0xFF000000) >> 24);\r
-       data [13] = (char)((l4 & 0x00FF0000) >> 16);\r
-       data [14] = (char)((l4 & 0x0000FF00) >>  8);\r
-       data [15] = (char)((l4 & 0x000000FF)      );\r
-#else\r
-       data [0]  = (char)((l1 & 0xFF000000) >> 24);\r
-       data [1]  = (char)((l1 & 0x00FF0000) >> 16);\r
-       data [2]  = (char)((l1 & 0x0000FF00) >>  8);\r
-       data [3]  = (char)((l1 & 0x000000FF)      );\r
-       data [4]  = (char)((l2 & 0xFF000000) >> 24);\r
-       data [5]  = (char)((l2 & 0x00FF0000) >> 16);\r
-       data [6]  = (char)((l2 & 0x0000FF00) >>  8);\r
-       data [7]  = (char)((l2 & 0x000000FF)      );\r
-       data [8]  = (char)((l3 & 0xFF000000) >> 24);\r
-       data [9]  = (char)((l3 & 0x00FF0000) >> 16);\r
-       data [10] = (char)((l3 & 0x0000FF00) >>  8);\r
-       data [11] = (char)((l3 & 0x000000FF)      );\r
-       data [12] = (char)((l4 & 0xFF000000) >> 24);\r
-       data [13] = (char)((l4 & 0x00FF0000) >> 16);\r
-       data [14] = (char)((l4 & 0x0000FF00) >>  8);\r
-       data [15] = (char)((l4 & 0x000000FF)      );\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::to4Int (uint32& d1, uint32& d2, uint32& d3, uint32& d4) const\r
-{\r
-       d1 = getLong1 ();\r
-       d2 = getLong2 ();\r
-       d3 = getLong3 ();\r
-       d4 = getLong4 ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong1 () const\r
-{\r
-#if COM_COMPATIBLE\r
-       return makeLong (data[3],  data[2],  data [1],  data [0]);\r
-#else\r
-       return makeLong (data[0],  data[1],  data [2],  data [3]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong2 () const\r
-{\r
-#if COM_COMPATIBLE\r
-       return makeLong (data[5],  data[4],  data [7],  data [6]);\r
-#else\r
-       return makeLong (data[4],  data[5],  data [6],  data [7]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong3 () const\r
-{\r
-#if COM_COMPATIBLE\r
-       return makeLong (data[8],  data[9],  data [10], data [11]);\r
-#else\r
-       return makeLong (data[8],  data[9],  data [10], data [11]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong4 () const\r
-{\r
-#if COM_COMPATIBLE\r
-       return makeLong (data[12], data[13], data [14], data [15]);\r
-#else\r
-       return makeLong (data[12], data[13], data [14], data [15]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::toString (char8* string) const\r
-{\r
-       if (!string)\r
-               return;\r
-\r
-       #if COM_COMPATIBLE\r
-       GuidStruct* g = (GuidStruct*)data;\r
-\r
-       char8 s[17];\r
-       Steinberg::toString8 (s, data, 8, 16);\r
-\r
-       sprintf (string, "%08X%04X%04X%s", g->Data1, g->Data2, g->Data3, s);\r
-       #else\r
-       Steinberg::toString8 (string, data, 0, 16);\r
-       #endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::fromString (const char8* string)\r
-{\r
-       if (!string || !*string)\r
-               return false;\r
-       if (strlen (string) != 32)\r
-               return false;\r
-\r
-       #if COM_COMPATIBLE\r
-       GuidStruct g;\r
-       char s[33];\r
-\r
-       strcpy (s, string);\r
-       s[8] = 0;\r
-       sscanf (s, "%x", &g.Data1);\r
-       strcpy (s, string + 8);\r
-       s[4] = 0;\r
-       sscanf (s, "%hx", &g.Data2);\r
-       strcpy (s, string + 12);\r
-       s[4] = 0;\r
-       sscanf (s, "%hx", &g.Data3);\r
-\r
-       memcpy (data, &g, 8);\r
-       Steinberg::fromString8 (string + 16, data, 8, 16);\r
-       #else\r
-       Steinberg::fromString8 (string, data, 0, 16);\r
-       #endif\r
-\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::fromRegistryString (const char8* string)\r
-{\r
-       if (!string || !*string)\r
-               return false;\r
-       if (strlen (string) != 38)\r
-               return false;\r
-\r
-       // e.g. {c200e360-38c5-11ce-ae62-08002b2b79ef}\r
-\r
-       #if COM_COMPATIBLE\r
-       GuidStruct g;\r
-       char8 s[10];\r
-\r
-       strncpy (s, string + 1, 8);\r
-       s[8] = 0;\r
-       sscanf (s, "%x", &g.Data1);\r
-       strncpy (s, string + 10, 4);\r
-       s[4] = 0;\r
-       sscanf (s, "%hx", &g.Data2);\r
-       strncpy (s, string + 15, 4);\r
-       s[4] = 0;\r
-       sscanf (s, "%hx", &g.Data3);\r
-       memcpy (data, &g, 8);\r
-\r
-       Steinberg::fromString8 (string + 20, data, 8, 10);\r
-       Steinberg::fromString8 (string + 25, data, 10, 16);\r
-       #else\r
-       Steinberg::fromString8 (string + 1, data, 0, 4);\r
-       Steinberg::fromString8 (string + 10, data, 4, 6);\r
-       Steinberg::fromString8 (string + 15, data, 6, 8);\r
-       Steinberg::fromString8 (string + 20, data, 8, 10);\r
-       Steinberg::fromString8 (string + 25, data, 10, 16);\r
-       #endif\r
-\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::toRegistryString (char8* string) const\r
-{\r
-       // e.g. {c200e360-38c5-11ce-ae62-08002b2b79ef}\r
-\r
-       #if COM_COMPATIBLE\r
-       GuidStruct* g = (GuidStruct*)data;\r
-\r
-       char8 s1[5];\r
-       Steinberg::toString8 (s1, data, 8, 10);\r
-\r
-       char8 s2[13];\r
-       Steinberg::toString8 (s2, data, 10, 16);\r
-\r
-       sprintf (string, "{%08X-%04X-%04X-%s-%s}", g->Data1, g->Data2, g->Data3, s1, s2);\r
-       #else\r
-       char8 s1[9];\r
-       Steinberg::toString8 (s1, data, 0, 4);\r
-       char8 s2[5];\r
-       Steinberg::toString8 (s2, data, 4, 6);\r
-       char8 s3[5];\r
-       Steinberg::toString8 (s3, data, 6, 8);\r
-       char8 s4[5];\r
-       Steinberg::toString8 (s4, data, 8, 10);\r
-       char8 s5[13];\r
-       Steinberg::toString8 (s5, data, 10, 16);\r
-\r
-       sprintf (string, "{%s-%s-%s-%s-%s}", s1, s2, s3, s4, s5);\r
-       #endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::print (char8* string, int32 style) const\r
-{\r
-       if (!string) // no string: debug output\r
-       {\r
-               char8 str [128];\r
-               print (str, style);\r
-\r
-#if SMTG_OS_WINDOWS\r
-               OutputDebugStringA (str);\r
-               OutputDebugStringA ("\n");\r
-#else\r
-               fprintf (stdout, "%s\n", str);\r
-#endif\r
-               return;\r
-       }\r
-\r
-       uint32 l1, l2, l3, l4;\r
-       to4Int (l1, l2, l3, l4);\r
-\r
-       switch (style)\r
-       {\r
-               case kINLINE_UID:\r
-                       sprintf (string, "INLINE_UID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
-                       break;\r
-\r
-               case kDECLARE_UID:\r
-                       sprintf (string, "DECLARE_UID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
-                       break;\r
-\r
-               case kFUID:\r
-                       sprintf (string, "FUID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
-                       break;\r
-\r
-               case kCLASS_UID:\r
-               default:\r
-                       sprintf (string, "DECLARE_CLASS_IID (Interface, 0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
-                       break;\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-//  helpers\r
-//------------------------------------------------------------------------\r
-static uint32 makeLong (uint8 b1, uint8 b2, uint8 b3, uint8 b4)\r
-{\r
-       return (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-static void toString8 (char8* string, const char* data, int32 i1, int32 i2)\r
-{\r
-       *string = 0;\r
-       for (int32 i = i1; i < i2; i++)\r
-       {\r
-               char8 s[3];\r
-               sprintf (s, "%02X", (uint8)data[i]);\r
-               strcat (string, s);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-static void fromString8 (const char8* string, char* data, int32 i1, int32 i2)\r
-{\r
-       for (int32 i = i1; i < i2; i++)\r
-       {\r
-               char8 s[3];\r
-               s[0] = *string++;\r
-               s[1] = *string++;\r
-               s[2] = 0;\r
-\r
-               int32 d = 0;\r
-               sscanf (s, "%2x", &d);\r
-               data[i] = (char)d;\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h
deleted file mode 100644 (file)
index 21ff598..0000000
+++ /dev/null
@@ -1,466 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/funknown.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fplatform.h"\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include "pluginterfaces/base/smartpointer.h"\r
-#include <string.h>\r
-\r
-//------------------------------------------------------------------------\r
-/*! \defgroup pluginBase Basic Interfaces\r
-*/\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-//  Unique Identifier macros\r
-//------------------------------------------------------------------------\r
-\r
-#if COM_COMPATIBLE\r
-#define INLINE_UID(l1, l2, l3, l4) \\r
-{ \\r
-       (::Steinberg::int8)((l1 & 0x000000FF)      ), (::Steinberg::int8)((l1 & 0x0000FF00) >>  8), \\r
-       (::Steinberg::int8)((l1 & 0x00FF0000) >> 16), (::Steinberg::int8)((l1 & 0xFF000000) >> 24), \\r
-       (::Steinberg::int8)((l2 & 0x00FF0000) >> 16), (::Steinberg::int8)((l2 & 0xFF000000) >> 24), \\r
-       (::Steinberg::int8)((l2 & 0x000000FF)      ), (::Steinberg::int8)((l2 & 0x0000FF00) >>  8), \\r
-       (::Steinberg::int8)((l3 & 0xFF000000) >> 24), (::Steinberg::int8)((l3 & 0x00FF0000) >> 16), \\r
-       (::Steinberg::int8)((l3 & 0x0000FF00) >>  8), (::Steinberg::int8)((l3 & 0x000000FF)      ), \\r
-       (::Steinberg::int8)((l4 & 0xFF000000) >> 24), (::Steinberg::int8)((l4 & 0x00FF0000) >> 16), \\r
-       (::Steinberg::int8)((l4 & 0x0000FF00) >>  8), (::Steinberg::int8)((l4 & 0x000000FF)      )  \\r
-}\r
-#else\r
-#define INLINE_UID(l1, l2, l3, l4) \\r
-{ \\r
-       (::Steinberg::int8)((l1 & 0xFF000000) >> 24), (::Steinberg::int8)((l1 & 0x00FF0000) >> 16), \\r
-       (::Steinberg::int8)((l1 & 0x0000FF00) >>  8), (::Steinberg::int8)((l1 & 0x000000FF)      ), \\r
-       (::Steinberg::int8)((l2 & 0xFF000000) >> 24), (::Steinberg::int8)((l2 & 0x00FF0000) >> 16), \\r
-       (::Steinberg::int8)((l2 & 0x0000FF00) >>  8), (::Steinberg::int8)((l2 & 0x000000FF)      ), \\r
-       (::Steinberg::int8)((l3 & 0xFF000000) >> 24), (::Steinberg::int8)((l3 & 0x00FF0000) >> 16), \\r
-       (::Steinberg::int8)((l3 & 0x0000FF00) >>  8), (::Steinberg::int8)((l3 & 0x000000FF)      ), \\r
-       (::Steinberg::int8)((l4 & 0xFF000000) >> 24), (::Steinberg::int8)((l4 & 0x00FF0000) >> 16), \\r
-       (::Steinberg::int8)((l4 & 0x0000FF00) >>  8), (::Steinberg::int8)((l4 & 0x000000FF)      )  \\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-#define DECLARE_UID(name, l1, l2, l3, l4) \\r
-       ::Steinberg::TUID name = INLINE_UID (l1, l2, l3, l4);\r
-\r
-//------------------------------------------------------------------------\r
-#define EXTERN_UID(name) \\r
-       extern const ::Steinberg::TUID name;\r
-\r
-\r
-#ifdef INIT_CLASS_IID\r
-#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4) static const ::Steinberg::TUID ClassName##_iid = INLINE_UID (l1, l2, l3, l4); \\r
-const ::Steinberg::FUID ClassName::iid (ClassName##_iid);\r
-#else\r
-#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4) static const ::Steinberg::TUID ClassName##_iid = INLINE_UID (l1, l2, l3, l4);\r
-#endif\r
-#define DEF_CLASS_IID(ClassName) const ::Steinberg::FUID ClassName::iid (ClassName##_iid);\r
-\r
-#define INLINE_UID_OF(ClassName) ClassName##_iid\r
-\r
-#define INLINE_UID_FROM_FUID(x) INLINE_UID(x.getLong1 (), x.getLong2 (), x.getLong3 (), x.getLong4 ())\r
-\r
-//------------------------------------------------------------------------\r
-//  FUnknown implementation macros\r
-//------------------------------------------------------------------------\r
-\r
-#define DECLARE_FUNKNOWN_METHODS                                                                      \\r
-public:                                                                                                      \\r
-       virtual ::Steinberg::tresult PLUGIN_API queryInterface (const ::Steinberg::TUID _iid, void** obj) SMTG_OVERRIDE; \\r
-       virtual ::Steinberg::uint32 PLUGIN_API addRef () SMTG_OVERRIDE;                                                 \\r
-       virtual ::Steinberg::uint32 PLUGIN_API release () SMTG_OVERRIDE;                                                \\r
-protected :                                                                                           \\r
-       ::Steinberg::int32 __funknownRefCount;                                                            \\r
-public:\r
-\r
-//------------------------------------------------------------------------\r
-\r
-#define DELEGATE_REFCOUNT(ClassName)                                                                                           \\r
-public:                                                                                                                                                                \\r
-       virtual ::Steinberg::uint32 PLUGIN_API addRef () SMTG_OVERRIDE { return ClassName::addRef ();  }        \\r
-       virtual ::Steinberg::uint32 PLUGIN_API release () SMTG_OVERRIDE { return ClassName::release (); }\r
-\r
-//------------------------------------------------------------------------\r
-#define IMPLEMENT_REFCOUNT(ClassName)                                          \\r
-::Steinberg::uint32 PLUGIN_API ClassName::addRef ()                            \\r
-{                                                                              \\r
-       return ::Steinberg::FUnknownPrivate::atomicAdd (__funknownRefCount, 1);    \\r
-}                                                                              \\r
-::Steinberg::uint32 PLUGIN_API ClassName::release ()                           \\r
-{                                                                              \\r
-       if (::Steinberg::FUnknownPrivate::atomicAdd (__funknownRefCount, -1) == 0) \\r
-       {                                                                          \\r
-               delete this;                                                           \\r
-               return 0;                                                              \\r
-       }                                                                          \\r
-       return __funknownRefCount;                                                 \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define FUNKNOWN_CTOR  { __funknownRefCount = 1; }\r
-#define FUNKNOWN_DTOR\r
-\r
-//------------------------------------------------------------------------\r
-#define QUERY_INTERFACE(iid, obj, InterfaceIID, InterfaceName)  \\r
-if (::Steinberg::FUnknownPrivate::iidEqual (iid, InterfaceIID)) \\r
-{                                                               \\r
-       addRef ();                                                  \\r
-       *obj = static_cast< InterfaceName* >(this);                 \\r
-       return ::Steinberg::kResultOk;                              \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define IMPLEMENT_QUERYINTERFACE(ClassName, InterfaceName, ClassIID)                                \\r
-::Steinberg::tresult PLUGIN_API ClassName::queryInterface (const ::Steinberg::TUID _iid, void** obj) \\r
-{                                                                                                   \\r
-       QUERY_INTERFACE (_iid, obj, ::Steinberg::FUnknown::iid, InterfaceName)                           \\r
-       QUERY_INTERFACE (_iid, obj, ClassIID, InterfaceName)                                             \\r
-       *obj = nullptr;                                                                                       \\r
-       return ::Steinberg::kNoInterface;                                                               \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define IMPLEMENT_FUNKNOWN_METHODS(ClassName,InterfaceName,ClassIID) \\r
-       IMPLEMENT_REFCOUNT (ClassName)                                   \\r
-       IMPLEMENT_QUERYINTERFACE (ClassName, InterfaceName, ClassIID)\r
-\r
-//------------------------------------------------------------------------\r
-//  Result Codes\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-#if COM_COMPATIBLE\r
-#if SMTG_OS_WINDOWS\r
-enum\r
-{\r
-       kNoInterface            = static_cast<tresult>(0x80004002L),    // E_NOINTERFACE\r
-       kResultOk                       = static_cast<tresult>(0x00000000L),    // S_OK\r
-       kResultTrue                     = kResultOk,\r
-       kResultFalse            = static_cast<tresult>(0x00000001L),    // S_FALSE\r
-       kInvalidArgument        = static_cast<tresult>(0x80070057L),    // E_INVALIDARG\r
-       kNotImplemented         = static_cast<tresult>(0x80004001L),    // E_NOTIMPL\r
-       kInternalError          = static_cast<tresult>(0x80004005L),    // E_FAIL\r
-       kNotInitialized         = static_cast<tresult>(0x8000FFFFL),    // E_UNEXPECTED\r
-       kOutOfMemory            = static_cast<tresult>(0x8007000EL)             // E_OUTOFMEMORY\r
-};\r
-#else\r
-enum\r
-{\r
-       kNoInterface            = static_cast<tresult>(0x80000004L),    // E_NOINTERFACE\r
-       kResultOk                       = static_cast<tresult>(0x00000000L),    // S_OK\r
-       kResultTrue                     = kResultOk,\r
-       kResultFalse            = static_cast<tresult>(0x00000001L),    // S_FALSE\r
-       kInvalidArgument        = static_cast<tresult>(0x80000003L),    // E_INVALIDARG\r
-       kNotImplemented         = static_cast<tresult>(0x80000001L),    // E_NOTIMPL\r
-       kInternalError          = static_cast<tresult>(0x80000008L),    // E_FAIL\r
-       kNotInitialized         = static_cast<tresult>(0x8000FFFFL),    // E_UNEXPECTED\r
-       kOutOfMemory            = static_cast<tresult>(0x80000002L)             // E_OUTOFMEMORY\r
-};\r
-#endif\r
-#else\r
-enum\r
-{\r
-       kNoInterface = -1,\r
-       kResultOk,\r
-       kResultTrue = kResultOk,\r
-       kResultFalse,\r
-       kInvalidArgument,\r
-       kNotImplemented,\r
-       kInternalError,\r
-       kNotInitialized,\r
-       kOutOfMemory\r
-};\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-typedef int64 LARGE_INT; // obsolete\r
-\r
-//------------------------------------------------------------------------\r
-//     FUID class declaration\r
-//------------------------------------------------------------------------\r
-typedef int8 TUID[16]; ///< plain UID type\r
-\r
-//------------------------------------------------------------------------\r
-/* FUnknown private */\r
-namespace FUnknownPrivate {\r
-SMTG_ALWAYS_INLINE bool iidEqual (const void* iid1, const void* iid2)\r
-{\r
-       const uint64* p1 = reinterpret_cast<const uint64*> (iid1);\r
-       const uint64* p2 = reinterpret_cast<const uint64*> (iid2);\r
-       return p1[0] == p2[0] && p1[1] == p2[1];\r
-}\r
-\r
-int32 PLUGIN_API atomicAdd (int32& value, int32 amount);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Handling 16 Byte Globally Unique Identifiers.\r
-\ingroup pluginBase\r
-\r
-Each interface declares its identifier as static member inside the interface\r
-namespace (e.g. FUnknown::iid).\r
-*/\r
-//------------------------------------------------------------------------\r
-class FUID\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       FUID ();\r
-       FUID (uint32 l1, uint32 l2, uint32 l3, uint32 l4);\r
-       FUID (const FUID&);\r
-       virtual ~FUID () {}\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-       FUID (FUID&& other);\r
-       FUID& operator= (FUID&& other);\r
-#endif\r
-\r
-       /** Generates a new Unique Identifier (UID).\r
-           Will return true for success. If the return value is false, either no\r
-           UID is generated or the UID is not guaranteed to be unique worldwide. */\r
-       bool generate ();\r
-\r
-       /** Checks if the UID data is valid.\r
-               The default constructor initializes the memory with zeros. */\r
-       bool isValid () const;\r
-\r
-       FUID& operator = (const FUID& f);\r
-       bool operator == (const FUID& f) const { return ::Steinberg::FUnknownPrivate::iidEqual (data, f.data); }\r
-       bool operator < (const FUID& f) const { return memcmp (data, f.data, sizeof (TUID)) < 0; }\r
-       bool operator != (const FUID& f) const   { return !::Steinberg::FUnknownPrivate::iidEqual (data, f.data); }\r
-\r
-\r
-       uint32 getLong1 () const;\r
-       uint32 getLong2 () const;\r
-       uint32 getLong3 () const;\r
-       uint32 getLong4 () const;\r
-\r
-       void from4Int (uint32 d1, uint32 d2, uint32 d3, uint32 d4);\r
-       void to4Int (uint32& d1, uint32& d2, uint32& d3, uint32& d4) const;\r
-\r
-       typedef char8 String [64];\r
-\r
-       /** Converts UID to a string.\r
-               The string will be 32 characters long, representing the hexadecimal values\r
-               of each data byte (e.g. "9127BE30160E4BB69966670AA6087880").\r
-\r
-               Typical use-case is:\r
-               \code\r
-               char8[33] strUID = {0};\r
-               FUID uid;\r
-               if (uid.generate ())\r
-                       uid.toString (strUID);\r
-               \endcode\r
-               */\r
-       void toString (char8* string) const;\r
-\r
-       /** Sets the UID data from a string.\r
-               The string has to be 32 characters long, where each character-pair is\r
-               the ASCII-encoded hexadecimal value of the corresponding data byte. */\r
-       bool fromString (const char8* string);\r
-\r
-       /** Converts UID to a string in Microsoft® OLE format.\r
-       (e.g. "{c200e360-38c5-11ce-ae62-08002b2b79ef}") */\r
-       void toRegistryString (char8* string) const;\r
-\r
-       /** Sets the UID data from a string in Microsoft® OLE format. */\r
-       bool fromRegistryString (const char8* string);\r
-\r
-       enum UIDPrintStyle\r
-       {\r
-               kINLINE_UID,  ///< "INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
-               kDECLARE_UID, ///< "DECLARE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
-               kFUID,        ///< "FUID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
-               kCLASS_UID    ///< "DECLARE_CLASS_IID (Interface, 0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
-       };\r
-       /** Prints the UID to a string (or debug output if string is NULL).\r
-               \param string is the output string if not NULL.\r
-               \param style can be chosen from the FUID::UIDPrintStyle enumeration. */\r
-       void print (char8* string = 0, int32 style = kINLINE_UID) const;\r
-\r
-       template<size_t N>\r
-       inline explicit FUID (const int8 (&uid)[N])\r
-       {\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-               static_assert (N == sizeof (TUID), "only TUID allowed");\r
-#endif\r
-               memcpy (data, uid, sizeof (TUID));\r
-       }\r
-       inline void toTUID (TUID result) const { memcpy (result, data, sizeof (TUID)); }\r
-       inline operator const TUID& () const { return data; }\r
-       inline const TUID& toTUID () const { return data; }\r
-\r
-       static FUID fromTUID (const TUID uid)\r
-       {\r
-               FUID res;\r
-               if (uid)\r
-                       memcpy (res.data, uid, sizeof (TUID));\r
-               return res;\r
-       }\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       TUID data;\r
-};\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-template<typename T>\r
-inline bool operator== (const FUID& f1, T f2)\r
-{\r
-       static_assert (\r
-           std::is_same<typename std::remove_cv<T>::type, FUID>::value,\r
-           "Do not compare a FUID with a TUID directly. Either convert the TUID to a FUID and compare them or use FUnknownPrivate::iidEqual");\r
-       return f1.operator== (f2);\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-// FUnknown\r
-//------------------------------------------------------------------------\r
-/**    The basic interface of all interfaces.\r
-\ingroup pluginBase\r
-\r
-- The FUnknown::queryInterface method is used to retrieve pointers to other\r
-  interfaces of the object.\r
-- FUnknown::addRef and FUnknown::release manage the lifetime of the object.\r
-  If no more references exist, the object is destroyed in memory.\r
-\r
-Interfaces are identified by 16 byte Globally Unique Identifiers.\r
-The SDK provides a class called FUID for this purpose.\r
-\r
-\ref howtoClass */\r
-//------------------------------------------------------------------------\r
-class FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Query for a pointer to the specified interface.\r
-       Returns kResultOk on success or kNoInterface if the object does not implement the interface.\r
-       The object has to call addRef when returning an interface.\r
-       \param _iid : (in) 16 Byte interface identifier (-> FUID)\r
-       \param obj : (out) On return, *obj points to the requested interface */\r
-       virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;\r
-\r
-       /** Adds a reference and return the new reference count.\r
-       \par Remarks:\r
-               The initial reference count after creating an object is 1. */\r
-       virtual uint32 PLUGIN_API addRef () = 0;\r
-\r
-       /** Releases a reference and return the new reference count.\r
-       If the reference count reaches zero, the object will be destroyed in memory. */\r
-       virtual uint32 PLUGIN_API release () = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-DECLARE_CLASS_IID (FUnknown, 0x00000000, 0x00000000, 0xC0000000, 0x00000046)\r
-\r
-//------------------------------------------------------------------------\r
-// FUnknownPtr\r
-//------------------------------------------------------------------------\r
-/** FUnknownPtr - automatic interface conversion and smart pointer in one.\r
-    This template class can be used for interface conversion like this:\r
-                                       \code\r
-       IPtr<IPath> path = owned (FHostCreate (IPath, hostClasses));\r
-       FUnknownPtr<IPath2> path2 (path); // does a query interface for IPath2\r
-       if (path2)\r
-               ...\r
-                                       \endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-class FUnknownPtr : public IPtr<I>\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       inline FUnknownPtr (FUnknown* unknown); // query interface\r
-       inline FUnknownPtr (const FUnknownPtr& p) : IPtr<I> (p) {}\r
-       inline FUnknownPtr () {}\r
-\r
-       inline FUnknownPtr& operator=(const FUnknownPtr& p) {IPtr<I>::operator=(p); return *this;}\r
-       inline I* operator=(FUnknown* unknown);\r
-       inline I* getInterface () { return this->ptr; }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline FUnknownPtr<I>::FUnknownPtr (FUnknown* unknown)\r
-{\r
-       if (unknown && unknown->queryInterface (I::iid, (void**)&this->ptr) != kResultOk)\r
-               this->ptr = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline I* FUnknownPtr<I>::operator=(FUnknown* unknown)\r
-{\r
-       I* newPtr = 0;\r
-       if (unknown && unknown->queryInterface (I::iid, (void**)&newPtr) == kResultOk)\r
-       {\r
-               OPtr<I> rel (newPtr);\r
-               return IPtr<I>::operator=(newPtr);\r
-       }\r
-\r
-       return IPtr<I>::operator=(0);\r
-}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// FReleaser (obsolete)\r
-//------------------------------------------------------------------------\r
-/** Release an interface using automatic object (obsolete).\r
-This class is obsolete and is only kept for compatibility.\r
-The replacement for FReleaser is OPtr.\r
-\r
-Usage example with FReleaser:\r
-                                                                               \code\r
-       void someFunction ()\r
-       {\r
-               IPath* path = pathCreateMethod ();\r
-               FReleaser releaser (path);\r
-               .... do something with path...\r
-               .... path not used anymore, releaser will destroy it when leaving function scope\r
-       }\r
-                                                                               \endcode\r
-Usage example with OPtr:\r
-                                                                               \code\r
-       void someFunction ()\r
-       {\r
-               OPtr<IPath> path = pathCreateMethod ();\r
-               .... do something with path...\r
-               .... path not used anymore, OPtr will destroy it when leaving function scope\r
-       }\r
-                                                                               \endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-struct FReleaser\r
-{\r
-       FReleaser (FUnknown* u): u (u) {}\r
-       ~FReleaser () { if (u) u->release (); }\r
-\r
-       FUnknown* u;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h
deleted file mode 100644 (file)
index 94312ef..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/futils.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic utilities\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-\r
-namespace Steinberg {\r
-//----------------------------------------------------------------------------\r
-// min/max/etc. template functions\r
-template <class T>\r
-inline const T& Min (const T& a, const T& b)\r
-{\r
-       return b < a ? b : a;\r
-}\r
-\r
-template <class T>\r
-inline const T& Max (const T& a, const T& b)\r
-{\r
-       return a < b ? b : a;\r
-}\r
-\r
-template <class T>\r
-inline T Abs (const T& value)\r
-{\r
-       return (value >= (T)0) ? value : -value;\r
-}\r
-\r
-template <class T>\r
-inline T Sign (const T& value)\r
-{\r
-       return (value == (T)0) ? 0 : ((value >= (T)0) ? 1 : -1);\r
-}\r
-\r
-template <class T>\r
-inline T Bound (T minval, T maxval, T x)\r
-{\r
-       if (x < minval)\r
-               return minval;\r
-       else if (x > maxval)\r
-               return maxval;\r
-       return x;\r
-}\r
-\r
-template <class T>\r
-void Swap (T& t1, T& t2)\r
-{\r
-       T tmp = t1;\r
-       t1 = t2;\r
-       t2 = tmp;\r
-}\r
-\r
-template <class T>\r
-bool IsApproximateEqual (T t1, T t2, T epsilon)\r
-{\r
-       if (t1 == t2)\r
-               return true;\r
-       T diff = t1 - t2;\r
-       if (diff < 0.0)\r
-               diff = -diff;\r
-       if (diff < epsilon)\r
-               return true;\r
-       return false;\r
-}\r
-\r
-template <class T>\r
-inline T ToNormalized (const T& value, const int32 numSteps)\r
-{\r
-       return value / T (numSteps);\r
-}\r
-\r
-template <class T>\r
-inline int32 FromNormalized (const T& norm, const int32 numSteps)\r
-{\r
-       return Min<int32> (numSteps, int32 (norm * (numSteps + 1)));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h
deleted file mode 100644 (file)
index 6cfae7b..0000000
+++ /dev/null
@@ -1,297 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/fvariant.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fstrdefs.h"\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-class FUnknown;\r
-\r
-//------------------------------------------------------------------------\r
-//  FVariant struct declaration\r
-//------------------------------------------------------------------------\r
-/** A Value of variable type.\r
- \ingroup pluginBase\r
- */\r
-class FVariant\r
-{\r
-//------------------------------------------------------------------------\r
-public:\r
-       enum\r
-       {\r
-               kEmpty = 0,\r
-               kInteger = 1 << 0,\r
-               kFloat = 1 << 1,\r
-               kString8 = 1 << 2,\r
-               kObject = 1 << 3,\r
-               kOwner = 1 << 4,\r
-               kString16 = 1 << 5\r
-       };\r
-\r
-//------------------------------------------------------------------------\r
-       // ctors\r
-       inline FVariant () { memset (this, 0, sizeof (FVariant)); }\r
-       inline FVariant (const FVariant& variant);\r
-\r
-       inline FVariant (bool b) : type (kInteger), intValue (b) {}\r
-       inline FVariant (uint32 v) : type (kInteger), intValue (v) {}\r
-       inline FVariant (int64 v) : type (kInteger), intValue (v) {}\r
-       inline FVariant (double v) : type (kFloat), floatValue (v) {}\r
-       inline FVariant (const char8* str) : type (kString8), string8 (str) {}\r
-       inline FVariant (const char16* str) : type (kString16), string16 (str) {}\r
-       inline FVariant (FUnknown* obj, bool owner = false) : type (kObject), object (obj)\r
-       {\r
-               setOwner (owner);\r
-       }\r
-       inline ~FVariant () { empty (); }\r
-\r
-//------------------------------------------------------------------------\r
-       inline FVariant& operator= (const FVariant& variant);\r
-\r
-       inline void set (bool b)\r
-       {\r
-               setInt (b);\r
-       }\r
-\r
-       inline void set (uint32 v)\r
-       {\r
-               setInt (v);\r
-       }\r
-\r
-       inline void set (int64 v)\r
-       {\r
-               setInt (v);\r
-       }\r
-\r
-       inline void set (double v)\r
-       {\r
-               setFloat (v);\r
-       }\r
-\r
-       inline void set (const char8* c)\r
-       {\r
-               setString8 (c);\r
-       }\r
-\r
-       inline void set (const char16* c)\r
-       {\r
-               setString16 (c);\r
-       }\r
-\r
-       inline void setInt (int64 v)\r
-       {\r
-               empty ();\r
-               type = kInteger;\r
-               intValue = v;\r
-       }\r
-\r
-       inline void setFloat (double v)\r
-       {\r
-               empty ();\r
-               type = kFloat;\r
-               floatValue = v;\r
-       }\r
-       inline void setString8 (const char8* v)\r
-       {\r
-               empty ();\r
-               type = kString8;\r
-               string8 = v;\r
-       }\r
-       inline void setString16 (const char16* v)\r
-       {\r
-               empty ();\r
-               type = kString16;\r
-               string16 = v;\r
-       }\r
-\r
-       inline void setObject (FUnknown* obj)\r
-       {\r
-               empty ();\r
-               type = kObject;\r
-               object = obj;\r
-       }\r
-\r
-       template <typename T>\r
-       inline T get () const;\r
-\r
-       inline int64 getInt () const { return (type & kInteger) ? intValue : 0; }\r
-       inline double getFloat () const { return (type & kFloat) ? floatValue : 0.; }\r
-       inline double getNumber () const\r
-       {\r
-               return (type & kInteger) ? static_cast<double> (intValue) : (type & kFloat) ? floatValue :\r
-                                                                                                                                                                         0.;\r
-       }\r
-       inline const char8* getString8 () const { return (type & kString8) ? string8 : 0; }\r
-       inline const char16* getString16 () const { return (type & kString16) ? string16 : 0; }\r
-\r
-       inline FUnknown* getObject () const { return (type & kObject) ? object : 0; }\r
-\r
-       inline uint16 getType () const { return static_cast<uint16> (type & ~(kOwner)); }\r
-       inline bool isEmpty () const { return getType () == kEmpty; }\r
-       inline bool isOwner () const { return (type & kOwner) != 0; }\r
-       inline bool isString () const { return (type & (kString8 | kString16)) != 0; }\r
-       inline void setOwner (bool state)\r
-       {\r
-               if (state)\r
-                       type |= kOwner;\r
-               else\r
-                       type &= ~kOwner;\r
-       }\r
-\r
-       void empty ();\r
-//------------------------------------------------------------------------\r
-       uint16 type;\r
-       union\r
-       {\r
-               int64 intValue;\r
-               double floatValue;\r
-               const char8* string8;\r
-               const char16* string16;\r
-               FUnknown* object;\r
-       };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-inline bool operator== (const FVariant& v1, const FVariant& v2)\r
-{\r
-#if SMTG_PLATFORM_64\r
-       return v1.type == v2.type && v1.intValue == v2.intValue;\r
-#else\r
-       if (v1.type != v2.type)\r
-               return false;\r
-       if (v1.type & (FVariant::kString8 | FVariant::kString16 | FVariant::kObject))\r
-               return v1.string8 == v2.string8; // pointer type comparisons\r
-       return v1.intValue == v2.intValue; // intValue & double comparison\r
-\r
-#endif\r
-}\r
-\r
-template <>\r
-inline bool FVariant::get<bool> () const\r
-{\r
-       return getInt () != 0;\r
-}\r
-\r
-template <>\r
-inline uint32 FVariant::get<uint32> () const\r
-{\r
-       return static_cast<uint32> (getInt ());\r
-}\r
-\r
-template <>\r
-inline int32 FVariant::get<int32> () const\r
-{\r
-       return static_cast<int32> (getInt ());\r
-}\r
-\r
-template <>\r
-inline int64 FVariant::get<int64> () const\r
-{\r
-       return static_cast<int64> (getInt ());\r
-}\r
-\r
-template <>\r
-inline float FVariant::get<float> () const\r
-{\r
-       return static_cast<float> (getFloat ());\r
-}\r
-\r
-template <>\r
-inline double FVariant::get<double> () const\r
-{\r
-       return getFloat ();\r
-}\r
-\r
-template <>\r
-inline const char8* FVariant::get<const char8*> () const\r
-{\r
-       return getString8 ();\r
-}\r
-\r
-template <>\r
-inline const char16* FVariant::get<const char16*> () const\r
-{\r
-       return getString16 ();\r
-}\r
-\r
-template <>\r
-inline FUnknown* FVariant::get<FUnknown*> () const\r
-{\r
-       return getObject ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool operator!= (const FVariant& v1, const FVariant& v2) { return !(v1 == v2); }\r
-\r
-//------------------------------------------------------------------------\r
-inline FVariant::FVariant (const FVariant& variant) : type (kEmpty) { *this = variant; }\r
-\r
-//------------------------------------------------------------------------\r
-inline void FVariant::empty ()\r
-{\r
-       if (type & kOwner)\r
-       {\r
-               if ((type & kString8) && string8)\r
-                       delete[] string8;\r
-               else if ((type & kString16) && string16)\r
-                       delete[] string16;\r
-\r
-               else if ((type & kObject) && object)\r
-                       object->release ();\r
-       }\r
-       memset (this, 0, sizeof (FVariant));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline FVariant& FVariant::operator= (const FVariant& variant)\r
-{\r
-       empty ();\r
-\r
-       type = variant.type;\r
-\r
-       if ((type & kString8) && variant.string8)\r
-       {\r
-               string8 = new char8[strlen (variant.string8) + 1];\r
-               strcpy (const_cast<char8*> (string8), variant.string8);\r
-               type |= kOwner;\r
-       }\r
-       else if ((type & kString16) && variant.string16)\r
-       {\r
-               int32 len = strlen16 (variant.string16);\r
-               string16 = new char16[len + 1];\r
-               char16* tmp = const_cast<char16*> (string16);\r
-               memcpy (tmp, variant.string16, len * sizeof (char16));\r
-               tmp[len] = 0;\r
-               type |= kOwner;\r
-       }\r
-       else if ((type & kObject) && variant.object)\r
-       {\r
-               object = variant.object;\r
-               object->addRef ();\r
-               type |= kOwner;\r
-       }\r
-       else\r
-               intValue = variant.intValue; // copy memory\r
-\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h
deleted file mode 100644 (file)
index ec6e7a7..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/ibstream.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Interface for reading/writing streams\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Base class for streams.\r
-\ingroup pluginBase\r
-- read/write binary data from/to stream\r
-- get/set stream read-write position (read and write position is the same)\r
-*/\r
-//------------------------------------------------------------------------\r
-\r
-class IBStream: public FUnknown\r
-{\r
-public:\r
-       enum IStreamSeekMode\r
-       {\r
-               kIBSeekSet = 0, ///< set absolute seek position\r
-               kIBSeekCur,     ///< set seek position relative to current position\r
-               kIBSeekEnd      ///< set seek position relative to stream end\r
-       };\r
-\r
-//------------------------------------------------------------------------\r
-       /** Reads binary data from stream.\r
-       \param buffer : destination buffer\r
-       \param numBytes : amount of bytes to be read\r
-       \param numBytesRead : result - how many bytes have been read from stream (set to 0 if this is of no interest) */\r
-       virtual tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = 0) = 0;\r
-\r
-       /** Writes binary data to stream.\r
-       \param buffer : source buffer\r
-       \param numBytes : amount of bytes to write\r
-       \param numBytesWritten : result - how many bytes have been written to stream (set to 0 if this is of no interest) */\r
-       virtual tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = 0) = 0;\r
-\r
-       /** Sets stream read-write position.\r
-       \param pos : new stream position (dependent on mode)\r
-       \param mode : value of enum IStreamSeekMode\r
-       \param result : new seek position (set to 0 if this is of no interest) */\r
-       virtual tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = 0) = 0;\r
-\r
-       /** Gets current stream read-write position.\r
-       \param pos : is assigned the current position if function succeeds */\r
-       virtual tresult PLUGIN_API tell (int64* pos) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IBStream, 0xC3BF6EA2, 0x30994752, 0x9B6BF990, 0x1EE33E9B)\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream with a size.\r
-\ingroup pluginBase\r
-[extends IBStream] when stream type supports it (like file and memory stream) */\r
-//------------------------------------------------------------------------\r
-class ISizeableStream: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Return the stream size */\r
-       virtual tresult PLUGIN_API getStreamSize (int64& size) = 0;\r
-       /** Set the steam size. File streams can only be resized if they are write enabled. */\r
-       virtual tresult PLUGIN_API setStreamSize (int64 size) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (ISizeableStream, 0x04F9549E, 0xE02F4E6E, 0x87E86A87, 0x47F4E17F)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h
deleted file mode 100644 (file)
index 70409bc..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/icloneable.h\r
-// Created by  : Steinberg, 11/2007\r
-// Description : Interface for object copies\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/**  Interface allowing an object to be copied.\r
-[plug & host imp] \n\r
-[released: N4.12] \n\r
-*/\r
-//------------------------------------------------------------------------\r
-class ICloneable : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Create exact copy of the object */\r
-       virtual FUnknown* PLUGIN_API clone () = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (ICloneable, 0xD45406B9, 0x3A2D4443, 0x9DAD9BA9, 0x85A1454B)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h
deleted file mode 100644 (file)
index ba9c757..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/ipersistent.h\r
-// Created by  : Steinberg, 09/2004\r
-// Description : Plug-In Storage Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-class FVariant;\r
-class IAttributes;\r
-//------------------------------------------------------------------------\r
-/**  Persistent Object Interface.\r
-[plug imp] \n\r
-This interface is used to store/restore attributes of an object.\r
-An IPlugController can implement this interface to handle presets.\r
-The gui-xml for a preset control looks like this:\r
-\code\r
-       ....\r
-       <view name="PresetView" data="Preset"/>\r
-       ....\r
-<template name="PresetView">\r
-       <view name="preset control" size="0, 0, 100, 20"/>\r
-       <switch name="store preset" size="125,0,80,20" style="push|immediate" title="Store"  />\r
-       <switch name="remove preset" size="220,0,80,20" style="push|immediate" title="Delete"  />\r
-</template>\r
-\endcode\r
-The tag data="Preset" tells the host to create a preset controller that handles the\r
-3 values named "preset control",  "store preset", and "remove preset".\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPersistent: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** The class ID must be a 16 bytes unique id that is used to create the object.\r
-       This ID is also used to identify the preset list when used with presets. */\r
-       virtual tresult PLUGIN_API getClassID (char8* uid) = 0;\r
-       /** Store all members/data in the passed IAttributes. */\r
-       virtual tresult PLUGIN_API saveAttributes (IAttributes* ) = 0;\r
-       /** Restore all members/data from the passed IAttributes. */\r
-       virtual tresult PLUGIN_API loadAttributes (IAttributes* ) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPersistent, 0xBA1A4637, 0x3C9F46D0, 0xA65DBA0E, 0xB85DA829)\r
-\r
-\r
-typedef FIDString IAttrID;\r
-//------------------------------------------------------------------------\r
-/**  Object Data Archive Interface.\r
-[host imp] \n\r
-- store data/objects/binary/subattributes in the archive\r
-- read stored data from the archive\r
-\r
-All data stored to the archive are identified by a string (IAttrID), which must be unique on each\r
-IAttribute level.\r
-\r
-The basic set/get methods make use of the FVariant class defined in 'funknown.h'.\r
-For a more convenient usage of this interface, you should use the functions defined\r
-in namespace PAttributes (public.sdk/source/common/pattributes.h+cpp) !!\r
-\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IAttributes: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /*! \name Methods to write attributes\r
-       ******************************************************************************************************** */\r
-       //@{\r
-       /** Store any data in the archive. It is even possible to store sub-attributes by creating\r
-           a new IAttributes instance via the IHostClasses interface and pass it to the parent in the\r
-               FVariant. In this case the archive must take the ownership of the newly created object, which\r
-               is true for all objects that have been created only for storing. You tell the archive to take\r
-               ownership by adding the FVariant::kOwner flag to the FVariant::type member (data.type |= FVariant::kOwner).\r
-               When using the PAttributes functions, this is done through a function parameter.*/\r
-       virtual tresult PLUGIN_API set (IAttrID attrID, const FVariant& data) = 0;\r
-\r
-       /** Store a list of data in the archive. Please note that the type of data is not mixable! So\r
-           you can only store a list of integers or a list of doubles/strings/etc. You can also store a list\r
-               of subattributes or other objects that implement the IPersistent interface.*/\r
-       virtual tresult PLUGIN_API queue (IAttrID listID, const FVariant& data) = 0;\r
-\r
-       /** Store binary data in the archive. Parameter 'copyBytes' specifies if the passed data should be copied.\r
-           The archive cannot take the ownership of binary data. Either it just references a buffer in order\r
-               to write it to a file (copyBytes = false) or it copies the data to its own buffers (copyBytes = true).\r
-               When binary data should be stored in the default pool for example, you must always copy it!*/\r
-       virtual tresult PLUGIN_API setBinaryData (IAttrID attrID, void* data, uint32 bytes, bool copyBytes) = 0;\r
-       //@}\r
-\r
-       /*! \name Methods to read attributes\r
-       ******************************************************************************************************** */\r
-       //@{\r
-       /** Get data previously stored to the archive. */\r
-       virtual tresult PLUGIN_API get (IAttrID attrID, FVariant& data) = 0;\r
-\r
-       /** Get list of data previously stored to the archive. As long as there are queue members the method\r
-           will return kResultTrue. When the queue is empty, the methods returns kResultFalse. All lists except from\r
-               object lists can be reset which means that the items can be read once again. \see IAttributes::resetQueue */\r
-       virtual tresult PLUGIN_API unqueue (IAttrID listID, FVariant& data) = 0;\r
-\r
-       /** Get the amount of items in a queue. */\r
-       virtual int32 PLUGIN_API getQueueItemCount (IAttrID) = 0;\r
-\r
-       /** Reset a queue. If you need to restart reading a queue, you have to reset it. You can reset a queue at any time.*/\r
-       virtual tresult PLUGIN_API resetQueue (IAttrID attrID) = 0;\r
-\r
-       /** Reset all queues in the archive.*/\r
-       virtual tresult PLUGIN_API resetAllQueues () = 0;\r
-\r
-       /** Read binary data from the archive. The data is copied into the passed buffer. The size of that buffer\r
-           must fit the size of data stored in the archive which can be queried via IAttributes::getBinaryDataSize  */\r
-       virtual tresult PLUGIN_API getBinaryData (IAttrID attrID, void* data, uint32 bytes) = 0;\r
-       /** Get the size in bytes of binary data in the archive. */\r
-       virtual uint32 PLUGIN_API getBinaryDataSize (IAttrID attrID) = 0;\r
-       //@}\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAttributes, 0xFA1E32F9, 0xCA6D46F5, 0xA982F956, 0xB1191B58)\r
-\r
-//------------------------------------------------------------------------\r
-/**  Extended access to Attributes; supports Attribute retrieval via iteration.\r
-[host imp] \n\r
-[released] C7/N6 \n\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IAttributes2 : public IAttributes\r
-{\r
-public:\r
-       /** Returns the number of existing attributes. */\r
-       virtual int32 PLUGIN_API countAttributes () const = 0;\r
-       /** Returns the attribute's ID for the given index. */\r
-       virtual IAttrID PLUGIN_API getAttributeID (int32 index) const = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAttributes2, 0x1382126A, 0xFECA4871, 0x97D52A45, 0xB042AE99)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h
deleted file mode 100644 (file)
index 9223652..0000000
+++ /dev/null
@@ -1,436 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/ipluginbase.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic Plug-in Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "funknown.h"\r
-#include "fstrdefs.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/**  Basic interface to a Plug-in component.\r
-\ingroup pluginBase\r
-- [plug imp]\r
-- initialize/terminate the Plug-in component\r
-\r
-The host uses this interface to initialize and to terminate the Plug-in component.\r
-The context that is passed to the initialize method contains any interface to the\r
-host that the Plug-in will need to work. These interfaces can vary from category to category.\r
-A list of supported host context interfaces should be included in the documentation\r
-of a specific category. */\r
-//------------------------------------------------------------------------\r
-class IPluginBase: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** The host passes a number of interfaces as context to initialize the Plug-in class.\r
-               @note Extensive memory allocations etc. should be performed in this method rather than in the class' constructor!\r
-               If the method does NOT return kResultOk, the object is released immediately. In this case terminate is not called! */\r
-       virtual tresult PLUGIN_API initialize (FUnknown* context) = 0;\r
-\r
-       /** This function is called before the Plug-in is unloaded and can be used for\r
-           cleanups. You have to release all references to any host application interfaces. */\r
-       virtual tresult PLUGIN_API terminate () = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPluginBase, 0x22888DDB, 0x156E45AE, 0x8358B348, 0x08190625)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Information about the class factory of the Plug-in.\r
-\ingroup pluginBase\r
-*/\r
-//------------------------------------------------------------------------\r
-struct PFactoryInfo\r
-{\r
-//------------------------------------------------------------------------\r
-       enum FactoryFlags\r
-       {\r
-               kNoFlags                                        = 0,            ///< Nothing\r
-               kClassesDiscardable                     = 1 << 0,       ///< The number of exported classes can change each time the Module is loaded. If this flag is set, the host does not cache class information. This leads to a longer startup time because the host always has to load the Module to get the current class information.\r
-               kLicenseCheck                           = 1 << 1,       ///< Class IDs of components are interpreted as Syncrosoft-License (LICENCE_UID). Loaded in a Steinberg host, the module will not be loaded when the license is not valid\r
-               kComponentNonDiscardable        = 1 << 3,       ///< Component won't be unloaded until process exit\r
-               kUnicode                    = 1 << 4    ///< Components have entirely unicode encoded strings. (True for VST 3 Plug-ins so far)\r
-       };\r
-\r
-       enum\r
-       {\r
-               kURLSize = 256,\r
-               kEmailSize = 128,\r
-               kNameSize = 64\r
-       };\r
-\r
-//------------------------------------------------------------------------\r
-       char8 vendor[kNameSize];                ///< e.g. "Steinberg Media Technologies"\r
-       char8 url[kURLSize];                    ///< e.g. "http://www.steinberg.de"\r
-       char8 email[kEmailSize];                ///< e.g. "info@steinberg.de"\r
-       int32 flags;                            ///< (see above)\r
-//------------------------------------------------------------------------\r
-       PFactoryInfo (const char8* _vendor, const char8* _url, const char8* _email, int32 _flags)\r
-       {\r
-               strncpy8 (vendor, _vendor, kNameSize);\r
-               strncpy8 (url, _url, kURLSize);\r
-               strncpy8 (email, _email, kEmailSize);\r
-               flags = _flags;\r
-#ifdef UNICODE\r
-               flags |= kUnicode;\r
-#endif\r
-       }\r
-#if SMTG_CPP11\r
-       constexpr PFactoryInfo () : vendor (), url (), email (), flags () {}\r
-#else\r
-       PFactoryInfo () { memset (this, 0, sizeof (PFactoryInfo)); }\r
-#endif\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/**  Basic Information about a class provided by the Plug-in.\r
-\ingroup pluginBase\r
-*/\r
-//------------------------------------------------------------------------\r
-struct PClassInfo\r
-{\r
-//------------------------------------------------------------------------\r
-       enum ClassCardinality\r
-       {\r
-               kManyInstances = 0x7FFFFFFF\r
-       };\r
-\r
-       enum\r
-       {\r
-               kCategorySize = 32,\r
-               kNameSize = 64\r
-       };\r
-//------------------------------------------------------------------------\r
-       TUID cid;                       ///< Class ID 16 Byte class GUID\r
-       int32 cardinality;              ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)\r
-       char8 category[kCategorySize];  ///< class category, host uses this to categorize interfaces\r
-       char8 name[kNameSize];          ///< class name, visible to the user\r
-//------------------------------------------------------------------------\r
-\r
-       PClassInfo (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name)\r
-       {\r
-               memset (this, 0, sizeof (PClassInfo));\r
-               memcpy (cid, _cid, sizeof (TUID));\r
-               if (_category)\r
-                       strncpy8 (category, _category, kCategorySize);\r
-               if (_name)\r
-                       strncpy8 (name, _name, kNameSize);\r
-               cardinality = _cardinality;\r
-       }\r
-#if SMTG_CPP11\r
-       constexpr PClassInfo () : cid (), cardinality (), category (), name () {}\r
-#else\r
-       PClassInfo () { memset (this, 0, sizeof (PClassInfo)); }\r
-#endif\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//  IPluginFactory interface declaration\r
-//------------------------------------------------------------------------\r
-/**    Class factory that any Plug-in defines for creating class instances.\r
-\ingroup pluginBase\r
-- [plug imp]\r
-\r
-From the host's point of view a Plug-in module is a factory which can create\r
-a certain kind of object(s). The interface IPluginFactory provides methods\r
-to get information about the classes exported by the Plug-in and a\r
-mechanism to create instances of these classes (that usually define the IPluginBase interface).\r
-\r
-<b> An implementation is provided in public.sdk/source/common/pluginfactory.cpp </b>\r
-\see GetPluginFactory\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPluginFactory : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Fill a PFactoryInfo structure with information about the Plug-in vendor. */\r
-       virtual tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) = 0;\r
-\r
-       /** Returns the number of exported classes by this factory.\r
-       If you are using the CPluginFactory implementation provided by the SDK, it returns the number of classes you registered with CPluginFactory::registerClass. */\r
-       virtual int32 PLUGIN_API countClasses () = 0;\r
-\r
-       /** Fill a PClassInfo structure with information about the class at the specified index. */\r
-       virtual tresult PLUGIN_API getClassInfo (int32 index, PClassInfo* info) = 0;\r
-\r
-       /** Create a new class instance. */\r
-       virtual tresult PLUGIN_API createInstance (FIDString cid, FIDString _iid, void** obj) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPluginFactory, 0x7A4D811C, 0x52114A1F, 0xAED9D2EE, 0x0B43BF9F)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/**  Version 2 of Basic Information about a class provided by the Plug-in.\r
-\ingroup pluginBase\r
-*/\r
-//------------------------------------------------------------------------\r
-struct PClassInfo2\r
-{\r
-//------------------------------------------------------------------------\r
-       TUID cid;                                                                       ///< Class ID 16 Byte class GUID\r
-       int32 cardinality;                                                      ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)\r
-       char8 category[PClassInfo::kCategorySize];      ///< class category, host uses this to categorize interfaces\r
-       char8 name[PClassInfo::kNameSize];                      ///< class name, visible to the user\r
-\r
-       enum {\r
-               kVendorSize = 64,\r
-               kVersionSize = 64,\r
-               kSubCategoriesSize = 128\r
-       };\r
-\r
-       uint32 classFlags;                              ///< flags used for a specific category, must be defined where category is defined\r
-       char8 subCategories[kSubCategoriesSize];        ///< module specific subcategories, can be more than one, logically added by the \c OR operator\r
-       char8 vendor[kVendorSize];              ///< overwrite vendor information from factory info\r
-       char8 version[kVersionSize];    ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)\r
-       char8 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")\r
-\r
-//------------------------------------------------------------------------\r
-\r
-       PClassInfo2 (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name,\r
-               int32 _classFlags, const char8* _subCategories, const char8* _vendor, const char8* _version,\r
-               const char8* _sdkVersion)\r
-       {\r
-               memset (this, 0, sizeof (PClassInfo2));\r
-               memcpy (cid, _cid, sizeof (TUID));\r
-               cardinality = _cardinality;\r
-               if (_category)\r
-                       strncpy8 (category, _category, PClassInfo::kCategorySize);\r
-               if (_name)\r
-                       strncpy8 (name, _name, PClassInfo::kNameSize);\r
-               classFlags = static_cast<uint32> (_classFlags);\r
-               if (_subCategories)\r
-                       strncpy8 (subCategories, _subCategories, kSubCategoriesSize);\r
-               if (_vendor)\r
-                       strncpy8 (vendor, _vendor, kVendorSize);\r
-               if (_version)\r
-                       strncpy8 (version, _version, kVersionSize);\r
-               if (_sdkVersion)\r
-                       strncpy8 (sdkVersion, _sdkVersion, kVersionSize);\r
-       }\r
-#if SMTG_CPP11\r
-       constexpr PClassInfo2 ()\r
-       : cid ()\r
-       , cardinality ()\r
-       , category ()\r
-       , name ()\r
-       , classFlags ()\r
-       , subCategories ()\r
-       , vendor ()\r
-       , version ()\r
-       , sdkVersion ()\r
-       {\r
-       }\r
-#else\r
-       PClassInfo2 () { memset (this, 0, sizeof (PClassInfo2)); }\r
-#endif\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-//  IPluginFactory2 interface declaration\r
-//------------------------------------------------------------------------\r
-/**    Version 2 of class factory supporting PClassInfo2.\r
-\ingroup pluginBase\r
-\copydoc IPluginFactory\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPluginFactory2 : public IPluginFactory\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns the class info (version 2) for a given index. */\r
-       virtual tresult PLUGIN_API getClassInfo2 (int32 index, PClassInfo2* info) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IPluginFactory2, 0x0007B650, 0xF24B4C0B, 0xA464EDB9, 0xF00B2ABB)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Unicode Version of Basic Information about a class provided by the Plug-in */\r
-//------------------------------------------------------------------------\r
-struct PClassInfoW\r
-{\r
-//------------------------------------------------------------------------\r
-       TUID cid;                                                       ///< see \ref PClassInfo\r
-       int32 cardinality;                                      ///< see \ref PClassInfo\r
-       char8 category[PClassInfo::kCategorySize];      ///< see \ref PClassInfo\r
-       char16 name[PClassInfo::kNameSize];     ///< see \ref PClassInfo\r
-\r
-       enum {\r
-               kVendorSize = 64,\r
-               kVersionSize = 64,\r
-               kSubCategoriesSize = 128\r
-       };\r
-\r
-       uint32 classFlags;                                      ///< flags used for a specific category, must be defined where category is defined\r
-       char8 subCategories[kSubCategoriesSize];///< module specific subcategories, can be more than one, logically added by the \c OR operator\r
-       char16 vendor[kVendorSize];                     ///< overwrite vendor information from factory info\r
-       char16 version[kVersionSize];           ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)\r
-       char16 sdkVersion[kVersionSize];        ///< SDK version used to build this class (e.g. "VST 3.0")\r
-\r
-//------------------------------------------------------------------------\r
-       PClassInfoW (const TUID _cid, int32 _cardinality, const char8* _category, const char16* _name,\r
-               int32 _classFlags, const char8* _subCategories, const char16* _vendor, const char16* _version,\r
-               const char16* _sdkVersion)\r
-       {\r
-               memset (this, 0, sizeof (PClassInfoW));\r
-               memcpy (cid, _cid, sizeof (TUID));\r
-               cardinality = _cardinality;\r
-               if (_category)\r
-                       strncpy8 (category, _category, PClassInfo::kCategorySize);\r
-               if (_name)\r
-                       strncpy16 (name, _name, PClassInfo::kNameSize);\r
-               classFlags = static_cast<uint32> (_classFlags);\r
-               if (_subCategories)\r
-                       strncpy8 (subCategories, _subCategories, kSubCategoriesSize);\r
-               if (_vendor)\r
-                       strncpy16 (vendor, _vendor, kVendorSize);\r
-               if (_version)\r
-                       strncpy16 (version, _version, kVersionSize);\r
-               if (_sdkVersion)\r
-                       strncpy16 (sdkVersion, _sdkVersion, kVersionSize);\r
-       }\r
-#if SMTG_CPP11\r
-       constexpr PClassInfoW ()\r
-       : cid ()\r
-       , cardinality ()\r
-       , category ()\r
-       , name ()\r
-       , classFlags ()\r
-       , subCategories ()\r
-       , vendor ()\r
-       , version ()\r
-       , sdkVersion ()\r
-       {\r
-       }\r
-#else\r
-       PClassInfoW () { memset (this, 0, sizeof (PClassInfoW)); }\r
-#endif\r
-\r
-       void fromAscii (const PClassInfo2& ci2)\r
-       {\r
-               memcpy (cid, ci2.cid, sizeof (TUID));\r
-               cardinality = ci2.cardinality;\r
-               strncpy8 (category, ci2.category, PClassInfo::kCategorySize);\r
-               str8ToStr16 (name, ci2.name, PClassInfo::kNameSize);\r
-               classFlags = ci2.classFlags;\r
-               strncpy8 (subCategories, ci2.subCategories, kSubCategoriesSize);\r
-\r
-               str8ToStr16 (vendor, ci2.vendor, kVendorSize);\r
-               str8ToStr16 (version, ci2.version, kVersionSize);\r
-               str8ToStr16 (sdkVersion, ci2.sdkVersion, kVersionSize);\r
-       }\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//  IPluginFactory3 interface declaration\r
-//------------------------------------------------------------------------\r
-/**    Version 3 of class factory supporting PClassInfoW.\r
-\ingroup pluginBase\r
-\copydoc IPluginFactory\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPluginFactory3 : public IPluginFactory2\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns the unicode class info for a given index. */\r
-       virtual tresult PLUGIN_API getClassInfoUnicode (int32 index, PClassInfoW* info) = 0;\r
-\r
-       /** Receives information about host*/\r
-       virtual tresult PLUGIN_API setHostContext (FUnknown* context) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IPluginFactory3, 0x4555A2AB, 0xC1234E57, 0x9B122910, 0x36878931)\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
-\r
-\r
-//------------------------------------------------------------------------\r
-#define LICENCE_UID(l1, l2, l3, l4) \\r
-{ \\r
-       (int8)((l1 & 0xFF000000) >> 24), (int8)((l1 & 0x00FF0000) >> 16), \\r
-       (int8)((l1 & 0x0000FF00) >>  8), (int8)((l1 & 0x000000FF)      ), \\r
-       (int8)((l2 & 0xFF000000) >> 24), (int8)((l2 & 0x00FF0000) >> 16), \\r
-       (int8)((l2 & 0x0000FF00) >>  8), (int8)((l2 & 0x000000FF)      ), \\r
-       (int8)((l3 & 0xFF000000) >> 24), (int8)((l3 & 0x00FF0000) >> 16), \\r
-       (int8)((l3 & 0x0000FF00) >>  8), (int8)((l3 & 0x000000FF)      ), \\r
-       (int8)((l4 & 0xFF000000) >> 24), (int8)((l4 & 0x00FF0000) >> 16), \\r
-       (int8)((l4 & 0x0000FF00) >>  8), (int8)((l4 & 0x000000FF)      )  \\r
-}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// GetPluginFactory\r
-//------------------------------------------------------------------------\r
-/**  Plug-in entry point.\r
-\ingroup pluginBase\r
-Any Plug-in must define and export this function. \n\r
-A typical implementation of GetPluginFactory looks like this\r
-                                               \code\r
-       IPluginFactory* PLUGIN_API GetPluginFactory ()\r
-       {\r
-               if (!gPluginFactory)\r
-               {\r
-                       static PFactoryInfo factoryInfo =\r
-                       {\r
-                               "My Company Name",\r
-                               "http://www.mywebpage.com",\r
-                               "mailto:myemail@address.com",\r
-                               PFactoryInfo::kNoFlags\r
-                       };\r
-\r
-                       gPluginFactory = new CPluginFactory (factoryInfo);\r
-\r
-                       static PClassInfo componentClass =\r
-                       {\r
-                               INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000), // replace by a valid uid\r
-                               1,\r
-                               "Service",    // category\r
-                               "Name"\r
-                       };\r
-\r
-                       gPluginFactory->registerClass (&componentClass, MyComponentClass::newInstance);\r
-               }\r
-               else\r
-                       gPluginFactory->addRef ();\r
-\r
-               return gPluginFactory;\r
-       }\r
-                                       \endcode\r
-\see \ref loadPlugin\r
-*/\r
-//------------------------------------------------------------------------\r
-extern "C"\r
-{\r
-       Steinberg::IPluginFactory* PLUGIN_API GetPluginFactory ();\r
-       typedef Steinberg::IPluginFactory* (PLUGIN_API *GetFactoryProc) ();\r
-}\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h
deleted file mode 100644 (file)
index 0e1d66d..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/istringresult.h\r
-// Created by  : Steinberg, 01/2005\r
-// Description : Strings Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Interface to return an ascii string of variable size.\r
-    In order to manage memory allocation and deallocation properly,\r
-       this interface is used to transfer a string as result parameter of\r
-       a method requires a string of unknown size.\r
-[host imp] or [plug imp] \n\r
-[released: SX 4] */\r
-//------------------------------------------------------------------------\r
-class IStringResult : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       virtual void PLUGIN_API setText (const char8* text) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IStringResult, 0x550798BC, 0x872049DB, 0x84920A15, 0x3B50B7A8)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Interface to a string of variable size and encoding.\r
-[host imp] or [plug imp] \n\r
-[released: ] */\r
-//------------------------------------------------------------------------\r
-class IString : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Assign ASCII string */\r
-       virtual void PLUGIN_API setText8 (const char8* text) = 0;\r
-       /** Assign unicode string */\r
-       virtual void PLUGIN_API setText16 (const char16* text) = 0;\r
-\r
-       /** Return ASCII string. If the string is unicode so far, it will be converted.\r
-           So you need to be careful, because the conversion can result in data loss.\r
-               It is save though to call getText8 if isWideString() returns false */\r
-       virtual const char8* PLUGIN_API getText8 () = 0;\r
-       /** Return unicode string. If the string is ASCII so far, it will be converted. */\r
-       virtual const char16* PLUGIN_API getText16 () = 0;\r
-\r
-       /** !Do not use this method! Early implementations take the given pointer as\r
-            internal string and this will cause problems because 'free' will be used to delete the passed memory.\r
-                Later implementations will redirect 'take' to setText8 and setText16 */\r
-       virtual void PLUGIN_API take (void* s, bool isWide) = 0;\r
-\r
-       /** Returns true if the string is in unicode format, returns false if the string is ASCII */\r
-       virtual bool PLUGIN_API isWideString () const = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IString, 0xF99DB7A3, 0x0FC14821, 0x800B0CF9, 0x8E348EDF)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h
deleted file mode 100644 (file)
index 460413a..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : Steinberg Module Architecture SDK\r
-//\r
-// Category    : Basic Host Service Interfaces\r
-// Filename    : pluginterfaces/base/iupdatehandler.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Update handling\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-class IDependent;\r
-\r
-//------------------------------------------------------------------------\r
-/** Host implements dependency handling for plugins.\r
-[host imp] \n\r
-[get this interface from IHostClasses] \n\r
-[released N3.1] \n\r
-\r
-- Install/Remove change notifications\r
-- Trigger updates when an object has changed\r
-\r
-Can be used between host-objects and the Plug-In or\r
-inside the Plug-In to handle internal updates!\r
-\r
-\see IDependent\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IUpdateHandler: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Install update notification for given object. It is essential to\r
-           remove all dependencies again using 'removeDependent'! Dependencies\r
-               are not removed automatically when the 'object' is released!\r
-       \param object : interface to object that sends change notifications\r
-       \param dependent : interface through which the update is passed */\r
-       virtual tresult PLUGIN_API addDependent (FUnknown* object, IDependent* dependent) = 0;\r
-\r
-       /** Remove a previously installed dependency.*/\r
-       virtual tresult PLUGIN_API removeDependent (FUnknown* object, IDependent* dependent) = 0;\r
-\r
-       /** Inform all dependents, that object has changed.\r
-       \param object is the object that has changed\r
-       \param message is a value of enum IDependent::ChangeMessage, usually  IDependent::kChanged - can be\r
-                        a private message as well (only known to sender and dependent)*/\r
-       virtual tresult PLUGIN_API triggerUpdates (FUnknown* object, int32 message) = 0;\r
-\r
-       /** Same as triggerUpdates, but delivered in idle (usefull to collect updates).*/\r
-       virtual tresult PLUGIN_API deferUpdates (FUnknown* object, int32 message) = 0;\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUpdateHandler, 0xF5246D56, 0x86544d60, 0xB026AFB5, 0x7B697B37)\r
-\r
-//------------------------------------------------------------------------\r
-/**  A dependent will get notified about changes of a model.\r
-[plug imp]\r
-- notify changes of a model\r
-\r
-\see IUpdateHandler\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IDependent: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Inform the dependent, that the passed FUnknown has changed. */\r
-       virtual void PLUGIN_API update (FUnknown* changedUnknown, int32 message) = 0;\r
-\r
-       enum ChangeMessage\r
-       {\r
-               kWillChange,\r
-               kChanged,\r
-               kDestroyed,\r
-               kWillDestroy,\r
-\r
-               kStdChangeMessageLast = kWillDestroy\r
-       };\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IDependent, 0xF52B7AAE, 0xDE72416d, 0x8AF18ACE, 0x9DD7BD5E)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h
deleted file mode 100644 (file)
index 4dbc27a..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK Core Interfaces\r
-// Filename    : pluginterfaces/base/smartpointer.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fplatform.h"\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-#include <utility>\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-// IPtr\r
-//------------------------------------------------------------------------\r
-/**    IPtr - Smart pointer template class.\r
- \ingroup pluginBase\r
-\r
- - can be used as an I* pointer\r
- - handles refCount of the interface\r
- - Usage example:\r
- \code\r
-       IPtr<IPath> path (sharedPath);\r
-       if (path)\r
-               path->ascend ();\r
- \endcode\r
- */\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-class IPtr\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       inline IPtr (I* ptr, bool addRef = true);\r
-       inline IPtr (const IPtr&);\r
-\r
-       template <class T>\r
-       inline IPtr (const IPtr<T>& other) : ptr (other.get ())\r
-       {\r
-               if (ptr)\r
-                       ptr->addRef ();\r
-       }\r
-\r
-       inline IPtr ();\r
-       inline ~IPtr ();\r
-\r
-       inline I* operator= (I* ptr);\r
-\r
-       inline IPtr& operator= (const IPtr& other);\r
-\r
-       template <class T>\r
-       inline IPtr& operator= (const IPtr<T>& other)\r
-       {\r
-               operator= (other.get ());\r
-               return *this;\r
-       }\r
-\r
-       inline operator I* () const { return ptr; } // act as I*\r
-       inline I* operator-> () const { return ptr; } // act as I*\r
-\r
-       inline I* get () const { return ptr; }\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-       inline IPtr (IPtr<I>&& movePtr) SMTG_NOEXCEPT : ptr (movePtr.take ()) { }\r
-\r
-       template <typename T>\r
-       inline IPtr (IPtr<T>&& movePtr) SMTG_NOEXCEPT : ptr (movePtr.take ()) {  }\r
-\r
-       inline IPtr& operator= (IPtr<I>&& movePtr) SMTG_NOEXCEPT\r
-       {\r
-               if (ptr)\r
-                       ptr->release ();\r
-\r
-               ptr = movePtr.take ();\r
-               return *this;\r
-       }\r
-\r
-       inline void reset (I* obj = nullptr)\r
-       {\r
-               if (ptr)\r
-                       ptr->release();\r
-               ptr = obj;\r
-       }\r
-\r
-       I* take () SMTG_NOEXCEPT\r
-       {\r
-               I* out = ptr;\r
-               ptr = nullptr;\r
-               return out;\r
-       }\r
-\r
-#endif\r
-//------------------------------------------------------------------------\r
-protected:\r
-       I* ptr;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::IPtr (I* _ptr, bool addRef) : ptr (_ptr)\r
-{\r
-       if (ptr && addRef)\r
-               ptr->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::IPtr (const IPtr<I>& other) : ptr (other.ptr)\r
-{\r
-       if (ptr)\r
-               ptr->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::IPtr () : ptr (0)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::~IPtr ()\r
-{\r
-       if (ptr)\r
-               ptr->release ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline I* IPtr<I>::operator= (I* _ptr)\r
-{\r
-       if (_ptr != ptr)\r
-       {\r
-               if (ptr)\r
-                       ptr->release ();\r
-               ptr = _ptr;\r
-               if (ptr)\r
-                       ptr->addRef ();\r
-       }\r
-       return ptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>& IPtr<I>::operator= (const IPtr<I>& _ptr)\r
-{\r
-       operator= (_ptr.ptr);\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** OPtr - "owning" smart pointer used for newly created FObjects.\r
- \ingroup pluginBase\r
-\r
- FUnknown implementations are supposed to have a refCount of 1 right after creation.\r
- So using an IPtr on newly created objects would lead to a leak.\r
- Instead the OPtr can be used in this case. \n\r
- Example:\r
- \code\r
- OPtr<IPath> path = FHostCreate (IPath, hostClasses);\r
- // no release is needed...\r
- \endcode\r
- The assignment operator takes ownership of a new object and releases the old.\r
- So its safe to write:\r
- \code\r
- OPtr<IPath> path = FHostCreate (IPath, hostClasses);\r
- path = FHostCreate (IPath, hostClasses);\r
- path = 0;\r
- \endcode\r
- This is the difference to using an IPtr with addRef=false.\r
- \code\r
- // DONT DO THIS:\r
- IPtr<IPath> path (FHostCreate (IPath, hostClasses), false);\r
- path = FHostCreate (IPath, hostClasses);\r
- path = 0;\r
- \endcode\r
- This will lead to a leak!\r
- */\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-class OPtr : public IPtr<I>\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       inline OPtr (I* p) : IPtr<I> (p, false) {}\r
-       inline OPtr (const IPtr<I>& p) : IPtr<I> (p) {}\r
-       inline OPtr (const OPtr<I>& p) : IPtr<I> (p) {}\r
-       inline OPtr () {}\r
-       inline I* operator= (I* _ptr)\r
-       {\r
-               if (_ptr != this->ptr)\r
-               {\r
-                       if (this->ptr)\r
-                               this->ptr->release ();\r
-                       this->ptr = _ptr;\r
-               }\r
-               return this->ptr;\r
-       }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Assigning newly created object to an IPtr.\r
- Example:\r
- \code\r
- IPtr<IPath> path = owned (FHostCreate (IPath, hostClasses));\r
- \endcode\r
- which is a slightly shorter form of writing:\r
- \code\r
- IPtr<IPath> path = OPtr<IPath> (FHostCreate (IPath, hostClasses));\r
- \endcode\r
- */\r
-template <class I>\r
-IPtr<I> owned (I* p)\r
-{\r
-       return IPtr<I> (p, false);\r
-}\r
-\r
-/** Assigning shared object to an IPtr.\r
- Example:\r
- \code\r
- IPtr<IPath> path = shared (iface.getXY ());\r
- \endcode\r
- */\r
-template <class I>\r
-IPtr<I> shared (I* p)\r
-{\r
-       return IPtr<I> (p, true);\r
-}\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-//------------------------------------------------------------------------\r
-// Ownership functionality\r
-//------------------------------------------------------------------------\r
-namespace SKI {\r
-namespace Detail {\r
-struct Adopt;\r
-} // Detail\r
-\r
-/** Strong typedef for shared reference counted objects.\r
-  *    Use SKI::adopt to unwrap the provided object.\r
-  * @tparam T Referenced counted type.\r
-  */\r
-template <typename T>\r
-class Shared\r
-{\r
-       friend struct Detail::Adopt;\r
-       T* obj = nullptr;\r
-};\r
-\r
-/** Strong typedef for transferring the ownership of reference counted objects.\r
-  *    Use SKI::adopt to unwrap the provided object.\r
-  * After calling adopt the reference in this object is null.\r
-  * @tparam T Referenced counted type.\r
-  */\r
-template <typename T>\r
-class Owned\r
-{\r
-       friend struct Detail::Adopt;\r
-       T* obj = nullptr;\r
-};\r
-\r
-/** Strong typedef for using reference counted objects.\r
-  *    Use SKI::adopt to unwrap the provided object.\r
-  * After calling adopt the reference in this object is null.\r
-  * @tparam T Referenced counted type.\r
-  */\r
-template <typename T>\r
-class Used\r
-{\r
-       friend struct Detail::Adopt;\r
-       T* obj = nullptr;\r
-};\r
-\r
-namespace Detail {\r
-\r
-struct Adopt\r
-{\r
-       template <typename T>\r
-       static IPtr<T> adopt (Shared<T>& ref)\r
-       {\r
-               using Steinberg::shared;\r
-               return shared (ref.obj);\r
-       }\r
-\r
-       template <typename T>\r
-       static IPtr<T> adopt (Owned<T>& ref)\r
-       {\r
-               using Steinberg::owned;\r
-               IPtr<T> out = owned (ref.obj);\r
-               ref.obj = nullptr;\r
-               return out;\r
-       }\r
-\r
-       template <typename T>\r
-       static T* adopt (Used<T>& ref)\r
-       {\r
-               return ref.obj;\r
-       }\r
-\r
-       template <template <typename> class OwnerType, typename T>\r
-       static OwnerType<T> toOwnerType (T* obj)\r
-       {\r
-               OwnerType<T> out;\r
-               out.obj = obj;\r
-               return out;\r
-       }\r
-};\r
-\r
-} // Detail\r
-\r
-/** Common function to adopt referenced counted object.\r
-  *    @tparam T                       Referenced counted type.\r
-  * @param ref                 The reference to be adopted in a smart pointer.\r
-  */\r
-template <typename T>\r
-IPtr<T> adopt (Shared<T>& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-template <typename T>\r
-IPtr<T> adopt (Shared<T>&& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-/** Common function to adopt referenced counted object.\r
-  *    @tparam T                       Referenced counted type.\r
-  * @param ref                 The reference to be adopted in a smart pointer.\r
-  */\r
-template <typename T>\r
-IPtr<T> adopt (Owned<T>& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-template <typename T>\r
-IPtr<T> adopt (Owned<T>&& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-/** Common function to adopt referenced counted object.\r
-  *    @tparam T                       Referenced counted type.\r
-  * @param ref                 The reference to be adopted in a smart pointer.\r
-  */\r
-template <typename T>\r
-T* adopt (Used<T>& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-template <typename T>\r
-T* adopt (Used<T>&& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-/** Common function to wrap owned instances. */\r
-template <typename T>\r
-Owned<T> toOwned (T* obj) { return Detail::Adopt::toOwnerType<Owned> (obj); }\r
-\r
-/** Common function to wrap shared instances. */\r
-template <typename T>\r
-Shared<T> toShared (T* obj) { return Detail::Adopt::toOwnerType<Shared> (obj); }\r
-\r
-/** Common function to wrap used instances. */\r
-template <typename T>\r
-Used<T> toUsed (T* obj) { return Detail::Adopt::toOwnerType<Used> (obj); }\r
-\r
-//------------------------------------------------------------------------\r
-} // SKI\r
-#endif\r
-} // Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp
deleted file mode 100644 (file)
index 1d9092b..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : Helpers\r
-// Filename    : pluginterfaces/base/ustring.cpp\r
-// Created by  : Steinberg, 12/2005\r
-// Description : UTF-16 String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "ustring.h"\r
-\r
-#if SMTG_OS_WINDOWS\r
-#include <stdio.h>\r
-#pragma warning (disable : 4996)\r
-\r
-#elif SMTG_OS_MACOS\r
-#include <CoreFoundation/CoreFoundation.h>\r
-\r
-#elif SMTG_OS_LINUX\r
-#include <cstring>\r
-#include <string>\r
-#include <codecvt>\r
-#include <sstream>\r
-#include <locale>\r
-\r
-#include <wctype.h>\r
-#include <wchar.h>\r
-\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-#if SMTG_OS_LINUX\r
-\r
-//------------------------------------------------------------------------\r
-namespace {\r
-\r
-using Converter = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>;\r
-\r
-//------------------------------------------------------------------------\r
-Converter& converter ()\r
-{\r
-       static Converter instance;\r
-       return instance;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // anonymous\r
-\r
-//------------------------------------------------------------------------\r
-#endif // SMTG_OS_LINUX\r
-\r
-//------------------------------------------------------------------------\r
-/** Copy strings of different character width. */\r
-//------------------------------------------------------------------------\r
-template <class TDstChar, class TSrcChar>\r
-void StringCopy (TDstChar* dst, int32 dstSize, const TSrcChar* src, int32 srcSize = -1)\r
-{\r
-       int32 count = dstSize;\r
-       if (srcSize >= 0 && srcSize < dstSize)\r
-               count = srcSize;\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               dst[i] = (TDstChar)src[i];\r
-               if (src[i] == 0)\r
-                       break;\r
-       }\r
-       dst[dstSize - 1] = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Find length of null-terminated string. */\r
-//------------------------------------------------------------------------\r
-template <class TSrcChar>\r
-int32 StringLength (const TSrcChar* src, int32 srcSize = -1)\r
-{\r
-       if (srcSize == 0)\r
-               return 0;\r
-       int32 length = 0;\r
-       while (src[length])\r
-       {\r
-               length++;\r
-               if (srcSize > 0 && length >= srcSize)\r
-                       break;\r
-       }\r
-       return length;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// UString\r
-//------------------------------------------------------------------------\r
-int32 UString::getLength () const\r
-{\r
-       return StringLength<char16> (thisBuffer, thisSize);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UString& UString::assign (const char16* src, int32 srcSize)\r
-{\r
-       StringCopy<char16, char16> (thisBuffer, thisSize, src, srcSize);\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UString& UString::append (const char16* src, int32 srcSize)\r
-{\r
-       int32 length = getLength ();\r
-       StringCopy<char16, char16> (thisBuffer + length, thisSize - length, src, srcSize);\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const UString& UString::copyTo (char16* dst, int32 dstSize) const\r
-{\r
-       StringCopy<char16, char16> (dst, dstSize, thisBuffer, thisSize);\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UString& UString::fromAscii (const char* src, int32 srcSize)\r
-{\r
-       StringCopy<char16, char> (thisBuffer, thisSize, src, srcSize);\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const UString& UString::toAscii (char* dst, int32 dstSize) const\r
-{\r
-       StringCopy<char, char16> (dst, dstSize, thisBuffer, thisSize);\r
-       return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::scanFloat (double& value) const\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       return swscanf ((const wchar_t*)thisBuffer, L"%lf", &value) != -1;\r
-\r
-#elif TARGET_API_MAC_CARBON\r
-       CFStringRef cfStr = CFStringCreateWithBytes (0, (const UInt8 *)thisBuffer, getLength () * 2, kCFStringEncodingUTF16, false);\r
-       if (cfStr)\r
-       {\r
-               value = CFStringGetDoubleValue (cfStr);\r
-               CFRelease (cfStr);\r
-               return true;\r
-       }\r
-       return false;\r
-\r
-#elif SMTG_OS_LINUX\r
-       auto str = converter ().to_bytes (thisBuffer);\r
-       return sscanf (str.data (), "%lf", &value) == 1;\r
-\r
-#else\r
-#warning Implement me\r
-       // implement me!\r
-       return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::printFloat (double value, int32 precision)\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       return swprintf ((wchar_t*)thisBuffer, L"%.*lf", precision, value) != -1;\r
-#elif SMTG_OS_MACOS\r
-       bool result = false;\r
-       CFStringRef cfStr = CFStringCreateWithFormat (0, 0, CFSTR("%.*lf"), precision, value);\r
-       if (cfStr)\r
-       {\r
-               memset (thisBuffer, 0, thisSize);\r
-               CFRange range = {0, CFStringGetLength (cfStr)};\r
-               CFStringGetBytes (cfStr, range, kCFStringEncodingUTF16, 0, false, (UInt8*)thisBuffer, thisSize, 0);\r
-               CFRelease (cfStr);\r
-               return true;\r
-       }\r
-       return result;\r
-#elif SMTG_OS_LINUX\r
-       auto utf8Buffer = reinterpret_cast<char*> (thisBuffer);\r
-       auto len = snprintf (utf8Buffer, thisSize, "%.*lf", precision, value);\r
-       if (len > 0)\r
-       {\r
-               auto utf16Buffer = reinterpret_cast<char16*> (thisBuffer);\r
-               utf16Buffer[len] = 0;\r
-               while (--len >= 0)\r
-               {\r
-                       utf16Buffer[len] = utf8Buffer[len];\r
-               }\r
-               return true;\r
-       }\r
-       return false;\r
-#else\r
-#warning Implement me\r
-       // implement me!\r
-       return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::scanInt (int64& value) const\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       return swscanf ((const wchar_t*)thisBuffer, L"%I64d", &value) != -1;\r
-\r
-#elif SMTG_OS_MACOS\r
-       CFStringRef cfStr = CFStringCreateWithBytes (0, (const UInt8 *)thisBuffer, getLength () * 2, kCFStringEncodingUTF16, false);\r
-       if (cfStr)\r
-       {\r
-               value = CFStringGetIntValue (cfStr);\r
-               CFRelease (cfStr);\r
-               return true;\r
-       }\r
-       return false;\r
-\r
-#elif SMTG_OS_LINUX\r
-       auto str = converter ().to_bytes (thisBuffer);\r
-       return sscanf (str.data (), "%lld", &value) == 1;\r
-\r
-#else\r
-#warning Implement me\r
-       // implement me!\r
-       return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::printInt (int64 value)\r
-{\r
-#if SMTG_OS_WINDOWS\r
-       return swprintf ((wchar_t*)thisBuffer, L"%I64d", value) != -1;\r
-\r
-#elif SMTG_OS_MACOS\r
-       CFStringRef cfStr = CFStringCreateWithFormat (0, 0, CFSTR("%lld"), value);\r
-       if (cfStr)\r
-       {\r
-               memset (thisBuffer, 0, thisSize);\r
-               CFRange range = {0, CFStringGetLength (cfStr)};\r
-               CFStringGetBytes (cfStr, range, kCFStringEncodingUTF16, 0, false, (UInt8*)thisBuffer, thisSize, 0);\r
-               CFRelease (cfStr);\r
-               return true;\r
-       }\r
-       return false;\r
-#elif SMTG_OS_LINUX\r
-       auto utf8Buffer = reinterpret_cast<char*> (thisBuffer);\r
-       auto len = snprintf (utf8Buffer, thisSize, "%lld", value);\r
-       if (len > 0)\r
-       {\r
-               auto utf16Buffer = reinterpret_cast<char16*> (thisBuffer);\r
-               utf16Buffer[len] = 0;\r
-               while (--len >= 0)\r
-               {\r
-                       utf16Buffer[len] = utf8Buffer[len];\r
-               }\r
-               return true;\r
-       }\r
-       return false;\r
-\r
-#else\r
-#warning Implement me\r
-       // implement me!\r
-       return false;\r
-#endif\r
-}\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h
deleted file mode 100644 (file)
index 277661f..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : Helpers\r
-// Filename    : pluginterfaces/base/ustring.h\r
-// Created by  : Steinberg, 12/2005\r
-// Description : UTF-16 String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ftypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** UTF-16 string class without buffer management. */\r
-//------------------------------------------------------------------------\r
-class UString\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       UString (char16* buffer, int32 size)\r
-       : thisBuffer (buffer),\r
-         thisSize (size)\r
-       {}\r
-\r
-       int32 getSize () const                  { return thisSize; }    ///< returns buffer size\r
-       operator const char16* () const { return thisBuffer; }  ///< cast to char16*\r
-\r
-       /** Returns length of string (in code units). */\r
-       int32 getLength () const;\r
-\r
-       /** Copy from UTF-16 buffer. */\r
-       UString& assign (const char16* src, int32 srcSize = -1);\r
-\r
-       /** Append UTF-16 buffer. */\r
-       UString& append (const char16* src, int32 srcSize = -1);\r
-\r
-       /** Copy to UTF-16 buffer. */\r
-       const UString& copyTo (char16* dst, int32 dstSize) const;\r
-\r
-       /** Copy from ASCII string. */\r
-       UString& fromAscii (const char* src, int32 srcSize = -1);\r
-       UString& assign (const char* src, int32 srcSize = -1) { return fromAscii (src, srcSize); }\r
-\r
-       /** Copy to ASCII string. */\r
-       const UString& toAscii (char* dst, int32 dstSize) const;\r
-\r
-       /** Scan integer from string. */\r
-       bool scanInt (int64& value) const;\r
-\r
-       /** Print integer to string. */\r
-       bool printInt (int64 value);\r
-\r
-       /** Scan float from string. */\r
-       bool scanFloat (double& value) const;\r
-\r
-       /** Print float to string. */\r
-       bool printFloat (double value, int32 precision = 4);\r
-//------------------------------------------------------------------------\r
-protected:\r
-       char16* thisBuffer;\r
-       int32 thisSize;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** UTF-16 string with fixed buffer size. */\r
-//------------------------------------------------------------------------\r
-template<int32 maxSize>\r
-class UStringBuffer: public UString\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       UStringBuffer ()\r
-       : UString (data, maxSize)\r
-       { data[0] = 0; }\r
-\r
-       /** Construct from UTF-16 string. */\r
-       UStringBuffer (const char16* src, int32 srcSize = -1)\r
-       : UString (data, maxSize)\r
-       { data[0] = 0; if (src) assign (src, srcSize); }\r
-\r
-       /** Construct from ASCII string. */\r
-       UStringBuffer (const char* src, int32 srcSize = -1)\r
-       : UString (data, maxSize)\r
-       { data[0] = 0; if (src) fromAscii (src, srcSize); }\r
-//------------------------------------------------------------------------\r
-protected:\r
-       char16 data[maxSize];\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-typedef UStringBuffer<128> UString128; ///< 128 character UTF-16 string\r
-typedef UStringBuffer<256> UString256; ///< 256 character UTF-16 string\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#define USTRING(asciiString)   Steinberg::UString256 (asciiString)\r
-#define USTRINGSIZE(var)               (sizeof (var) / sizeof (Steinberg::char16))\r
-\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h
deleted file mode 100644 (file)
index 8ad70ca..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK GUI Interfaces\r
-// Filename    : pluginterfaces/gui/iplugview.h\r
-// Created by  : Steinberg, 12/2007\r
-// Description : Plug-in User Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-class IPlugFrame;\r
-\r
-//------------------------------------------------------------------------\r
-/*! \defgroup pluginGUI Graphical User Interface\r
-*/\r
-\r
-//------------------------------------------------------------------------\r
-/**  Graphical rectangle structure. Used with IPlugView.\r
-\ingroup pluginGUI\r
-*/\r
-//------------------------------------------------------------------------\r
-struct ViewRect\r
-{\r
-       ViewRect (int32 l = 0, int32 t = 0, int32 r = 0, int32 b = 0)\r
-       : left (l), top (t), right (r), bottom (b)\r
-       {\r
-       }\r
-\r
-       int32 left;\r
-       int32 top;\r
-       int32 right;\r
-       int32 bottom;\r
-\r
-       //--- ---------------------------------------------------------------------\r
-       int32 getWidth () const { return right - left; }\r
-       int32 getHeight () const { return bottom - top; }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/**  \defgroup platformUIType Platform UI Types\r
-\ingroup pluginGUI\r
-List of Platform UI types for IPlugView. This list is used to match the GUI-System between\r
-the host and a Plug-in in case that an OS provides multiple GUI-APIs.\r
-*/\r
-/*@{*/\r
-/** The parent parameter in IPlugView::attached() is a HWND handle.\r
- *     You should attach a child window to it. */\r
-const FIDString kPlatformTypeHWND = "HWND"; ///< HWND handle. (Microsoft Windows)\r
-\r
-/** The parent parameter in IPlugView::attached() is a WindowRef.\r
- *     You should attach a HIViewRef to the content view of the window. */\r
-const FIDString kPlatformTypeHIView = "HIView"; ///< HIViewRef. (Mac OS X)\r
-\r
-/** The parent parameter in IPlugView::attached() is a NSView pointer.\r
- * You should attach a NSView to it. */\r
-const FIDString kPlatformTypeNSView = "NSView"; ///< NSView pointer. (Mac OS X)\r
-\r
-/** The parent parameter in IPlugView::attached() is a UIView pointer.\r
- * You should attach an UIView to it. */\r
-const FIDString kPlatformTypeUIView = "UIView"; ///< UIView pointer. (iOS)\r
-\r
-/** The parent parameter in IPlugView::attached() is a X11 Window supporting XEmbed.\r
- * You should attach a Window to it that supports the XEmbed extension. */\r
-const FIDString kPlatformTypeX11EmbedWindowID = "X11EmbedWindowID"; ///< X11 Window ID. (X11)\r
-\r
-/*@}*/\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/**  Plug-in definition of a view.\r
-\ingroup pluginGUI vstIPlug vst300\r
-- [plug imp]\r
-- [released: 3.0.0]\r
-\r
-\par Sizing of a view\r
-Usually the size of a Plug-in view is fixed. But both the host and the Plug-in can cause\r
-a view to be resized:\r
-\n\r
-- <b> Host </b> : If IPlugView::canResize () returns kResultTrue the host will setup the window\r
-  so that the user can resize it. While the user resizes the window\r
-  IPlugView::checkSizeConstraint () is called, allowing the Plug-in to change the size to a valid\r
-  rect. The host then resizes the window to this rect and has to call IPlugView::onSize ().\r
-\n\r
-\n\r
-- <b> Plug-in </b> : The Plug-in can call IPlugFrame::resizeView () and cause the host to resize the\r
-  window.\r
-  Afterwards in the same callstack the host has to call IPlugView::onSize () if a resize is needed (size was changed).\r
-  Note that if the host calls IPlugView::getSize () before calling IPlugView::onSize () (if needed),\r
-  it will get the current (old) size not the wanted one!!\r
-  Here the calling sequence:\r
-    * plug-in->host: IPlugFrame::resizeView (newSize)\r
-       * host->plug-in (optional): IPlugView::getSize () returns the currentSize (not the newSize)!\r
-       * host->plug-in: if newSize is different from the current size: IPlugView::onSize (newSize)\r
-    * host->plug-in (optional): IPlugView::getSize () returns the newSize\r
-\n\r
-<b>Please only resize the platform representation of the view when IPlugView::onSize () is\r
-called.</b>\r
-\r
-\par Keyboard handling\r
-The Plug-in view receives keyboard events from the host. A view implementation must not handle\r
-keyboard events by the means of platform callbacks, but let the host pass them to the view. The host\r
-depends on a proper return value when IPlugView::onKeyDown is called, otherwise the Plug-in view may\r
-cause a malfunction of the host's key command handling!\r
-\r
-\see IPlugFrame, \ref platformUIType\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPlugView : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Is Platform UI Type supported\r
-           \param type : IDString of \ref platformUIType */\r
-       virtual tresult PLUGIN_API isPlatformTypeSupported (FIDString type) = 0;\r
-\r
-       /** The parent window of the view has been created, the (platform) representation of the view\r
-               should now be created as well.\r
-           Note that the parent is owned by the caller and you are not allowed to alter it in any way\r
-               other than adding your own views.\r
-           Note that in this call the Plug-in could call a IPlugFrame::resizeView ()!\r
-           \param parent : platform handle of the parent window or view\r
-           \param type : \ref platformUIType which should be created */\r
-       virtual tresult PLUGIN_API attached (void* parent, FIDString type) = 0;\r
-\r
-       /** The parent window of the view is about to be destroyed.\r
-           You have to remove all your own views from the parent window or view. */\r
-       virtual tresult PLUGIN_API removed () = 0;\r
-\r
-       /** Handling of mouse wheel. */\r
-       virtual tresult PLUGIN_API onWheel (float distance) = 0;\r
-\r
-       /** Handling of keyboard events : Key Down.\r
-           \param key : unicode code of key\r
-           \param keyCode : virtual keycode for non ascii keys - see \ref VirtualKeyCodes in keycodes.h\r
-           \param modifiers : any combination of modifiers - see \ref KeyModifier in keycodes.h\r
-           \return kResultTrue if the key is handled, otherwise kResultFalse. \n\r
-                   <b> Please note that kResultTrue must only be returned if the key has really been\r
-          handled. </b> Otherwise key command handling of the host might be blocked! */\r
-       virtual tresult PLUGIN_API onKeyDown (char16 key, int16 keyCode, int16 modifiers) = 0;\r
-\r
-       /** Handling of keyboard events : Key Up.\r
-           \param key : unicode code of key\r
-           \param keyCode : virtual keycode for non ascii keys - see \ref VirtualKeyCodes in keycodes.h\r
-           \param modifiers : any combination of KeyModifier - see \ref KeyModifier in keycodes.h\r
-           \return kResultTrue if the key is handled, otherwise return kResultFalse. */\r
-       virtual tresult PLUGIN_API onKeyUp (char16 key, int16 keyCode, int16 modifiers) = 0;\r
-\r
-       /** Returns the size of the platform representation of the view. */\r
-       virtual tresult PLUGIN_API getSize (ViewRect* size) = 0;\r
-\r
-       /** Resizes the platform representation of the view to the given rect. Note that if the Plug-in\r
-        *      requests a resize (IPlugFrame::resizeView ()) onSize has to be called afterward. */\r
-       virtual tresult PLUGIN_API onSize (ViewRect* newSize) = 0;\r
-\r
-       /** Focus changed message. */\r
-       virtual tresult PLUGIN_API onFocus (TBool state) = 0;\r
-\r
-       /** Sets IPlugFrame object to allow the Plug-in to inform the host about resizing. */\r
-       virtual tresult PLUGIN_API setFrame (IPlugFrame* frame) = 0;\r
-\r
-       /** Is view sizable by user. */\r
-       virtual tresult PLUGIN_API canResize () = 0;\r
-\r
-       /** On live resize this is called to check if the view can be resized to the given rect, if not\r
-        *      adjust the rect to the allowed size. */\r
-       virtual tresult PLUGIN_API checkSizeConstraint (ViewRect* rect) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPlugView, 0x5BC32507, 0xD06049EA, 0xA6151B52, 0x2B755B29)\r
-\r
-//------------------------------------------------------------------------\r
-/** Callback interface passed to IPlugView.\r
-\ingroup pluginGUI vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-Enables a Plug-in to resize the view and cause the host to resize the window.\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPlugFrame : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Called to inform the host about the resize of a given view.\r
-        *      Afterwards the host has to call IPlugView::onSize (). */\r
-       virtual tresult PLUGIN_API resizeView (IPlugView* view, ViewRect* newSize) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPlugFrame, 0x367FAF01, 0xAFA94693, 0x8D4DA2A0, 0xED0882A3)\r
-\r
-#if SMTG_OS_LINUX\r
-//------------------------------------------------------------------------\r
-namespace Linux {\r
-\r
-using TimerInterval = uint64;\r
-using FileDescriptor = int;\r
-\r
-//------------------------------------------------------------------------\r
-/** Linux event handler interface\r
-\ingroup pluginGUI vst368\r
-- [plug imp]\r
-- [released: 3.6.8]\r
-\see IRunLoop\r
-*/\r
-class IEventHandler : public FUnknown\r
-{\r
-public:\r
-       virtual void PLUGIN_API onFDIsSet (FileDescriptor fd) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IEventHandler, 0x561E65C9, 0x13A0496F, 0x813A2C35, 0x654D7983)\r
-\r
-//------------------------------------------------------------------------\r
-/** Linux timer handler interface\r
-\ingroup pluginGUI vst368\r
-- [plug imp]\r
-- [released: 3.6.8]\r
-\see IRunLoop\r
-*/\r
-class ITimerHandler : public FUnknown\r
-{\r
-public:\r
-       virtual void PLUGIN_API onTimer () = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (ITimerHandler, 0x10BDD94F, 0x41424774, 0x821FAD8F, 0xECA72CA9)\r
-\r
-//------------------------------------------------------------------------\r
-/** Linux host run loop interface\r
-\ingroup pluginGUI vst368\r
-- [host imp]\r
-- [extends IPlugFrame]\r
-- [released: 3.6.8]\r
-\r
-On Linux the host has to provide this interface to the plug-in as there's no global event run loop\r
-defined as on other platforms.\r
-\r
-A plug-in can register an event handler for a file descriptor. The host has to call the event\r
-handler when the file descriptor is marked readable.\r
-\r
-A plug-in also can register a timer which will be called repeatedly until it is unregistered.\r
-*/\r
-class IRunLoop : public FUnknown\r
-{\r
-public:\r
-       virtual tresult PLUGIN_API registerEventHandler (IEventHandler* handler, FileDescriptor fd) = 0;\r
-       virtual tresult PLUGIN_API unregisterEventHandler (IEventHandler* handler) = 0;\r
-\r
-       virtual tresult PLUGIN_API registerTimer (ITimerHandler* handler,\r
-                                                                                         TimerInterval milliseconds) = 0;\r
-       virtual tresult PLUGIN_API unregisterTimer (ITimerHandler* handler) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IRunLoop, 0x18C35366, 0x97764F1A, 0x9C5B8385, 0x7A871389)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Linux\r
-\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h
deleted file mode 100644 (file)
index 7298306..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : SDK GUI Interfaces\r
-// Filename    : pluginterfaces/gui/iplugviewcontentscalesupport.h\r
-// Created by  : Steinberg, 06/2016\r
-// Description : Plug-in User Interface Scaling\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Plug-in view content scale support\r
-\ingroup pluginGUI vstIPlug vst366\r
-- [plug impl]\r
-- [extends IPlugView]\r
-- [optional]\r
-\r
-This interface communicates the content scale factor from the host to the plug-in view on\r
-systems where plug-ins cannot get this information directly like Microsoft Windows.\r
-\r
-The host calls setContentScaleFactor directly after the plug view was attached and when the scale\r
-factor changes (system change or window moved to another screen with different scaling settings).\r
-The host could call setContentScaleFactor in a different context, for example: scaling the\r
-plug-in editor for better readability.\r
-When a plug-in handles this (by returning kResultTrue), it needs to scale the width and height of\r
-its view by the scale factor and inform the host via a IPlugFrame::resizeView(), the host will then\r
-call IPlugView::onSize()\r
- */\r
-class IPlugViewContentScaleSupport : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       typedef float ScaleFactor;\r
-\r
-       virtual tresult PLUGIN_API setContentScaleFactor (ScaleFactor factor) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPlugViewContentScaleSupport, 0x65ED9690, 0x8AC44525, 0x8AADEF7A, 0x72EA703F)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h
deleted file mode 100644 (file)
index 212dca8..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstattributes.h\r
-// Created by  : Steinberg, 05/2006\r
-// Description : VST Attribute Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Attribute list used in IMessage and IStreamAttributes.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-An attribute list associates values with a key (id: some predefined keys could be found in \ref presetAttributes). */\r
-//------------------------------------------------------------------------\r
-class IAttributeList: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       typedef const char* AttrID;\r
-\r
-       /** Sets integer value. */\r
-       virtual tresult PLUGIN_API setInt (AttrID id, int64 value) = 0;\r
-\r
-       /** Gets integer value. */\r
-       virtual tresult PLUGIN_API getInt (AttrID id, int64& value) = 0;\r
-\r
-       /** Sets float value. */\r
-       virtual tresult PLUGIN_API setFloat (AttrID id, double value) = 0;\r
-\r
-       /** Gets float value. */\r
-       virtual tresult PLUGIN_API getFloat (AttrID id, double& value) = 0;\r
-\r
-       /** Sets string value (UTF16). */\r
-       virtual tresult PLUGIN_API setString (AttrID id, const TChar* string) = 0;\r
-\r
-       /** Gets string value (UTF16). Note that Size is in Byte, not the string Length! (Do not forget to multiply the length by sizeof (TChar)!) */\r
-       virtual tresult PLUGIN_API getString (AttrID id, TChar* string, uint32 size) = 0;\r
-\r
-       /** Sets binary data. */\r
-       virtual tresult PLUGIN_API setBinary (AttrID id, const void* data, uint32 size) = 0;\r
-\r
-       /** Gets binary data. */\r
-       virtual tresult PLUGIN_API getBinary (AttrID id, const void*& data, uint32& size) = 0;\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAttributeList, 0x1E5F0AEB, 0xCC7F4533, 0xA2544011, 0x38AD5EE4)\r
-\r
-//------------------------------------------------------------------------\r
-/**  Meta attributes of a stream.\r
-\ingroup vstIHost  vst360\r
-- [host imp]\r
-- [extends IBStream]\r
-- [released: 3.6.0]\r
-\r
-\code\r
-...\r
-#include "pluginterfaces/base/ustring.h"\r
-#include "pluginterfaces/vst/vstpresetkeys.h"\r
-...\r
-\r
-tresult PLUGIN_API MyPlugin::setState (IBStream* state)\r
-{\r
-       FUnknownPtr<IStreamAttributes> stream (state);\r
-       if (stream)\r
-       {\r
-               IAttributeList* list = stream->getAttributes ();\r
-               if (list)\r
-               {\r
-                       // get the current type (project/Default..) of this state\r
-                       String128 string;\r
-                       if (list->getString (PresetAttributes::kStateType, string, 128 * sizeof (TChar)) == kResultTrue)\r
-                       {\r
-                               UString128 tmp (string);\r
-                               char ascii[128];\r
-                               tmp.toAscii (ascii, 128);\r
-                               if (!strncmp (ascii, StateType::kProject, strlen (StateType::kProject)))\r
-                               {\r
-                                       // we are in project loading context...\r
-                               }\r
-                       }\r
-\r
-                       // get the full file path of this state\r
-                       TChar fullPath[1024];\r
-                       if (list->getString (PresetAttributes::kFilePathStringType, fullPath, 1024 * sizeof (TChar)) == kResultTrue)\r
-                       {\r
-                               // here we have the full path ...\r
-                       }\r
-               }\r
-       }\r
-\r
-       //...read the state here.....\r
-       return kResultTrue;\r
-}\r
-\endcode\r
-Interface to access preset meta information from stream, used for example in setState in order to inform the plug-in about\r
-the current context in which this preset loading occurs (Project context or Preset load (see \ref StateType))\r
-or used to get the full file path of the loaded preset (if available). */\r
-//------------------------------------------------------------------------\r
-class IStreamAttributes: public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** Gets filename (without file extension) of the stream. */\r
-       virtual tresult PLUGIN_API getFileName (String128 name) = 0;\r
-\r
-       /** Gets meta information list. */\r
-       virtual IAttributeList* PLUGIN_API getAttributes () = 0;\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IStreamAttributes, 0xD6CE2FFC, 0xEFAF4B8C, 0x9E74F1BB, 0x12DA44B4)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h
deleted file mode 100644 (file)
index 650b3e7..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstaudioprocessor.h\r
-// Created by  : Steinberg, 10/2005\r
-// Description : VST Audio Processing Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ivstcomponent.h"\r
-#include "vstspeaker.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Class Category Name for Audio Processor Component */\r
-//------------------------------------------------------------------------\r
-#ifndef kVstAudioEffectClass\r
-#define kVstAudioEffectClass "Audio Module Class"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-class IEventList;\r
-class IParameterChanges;\r
-struct ProcessContext;\r
-\r
-//------------------------------------------------------------------------\r
-/** Component Types used as subCategories in PClassInfo2 */\r
-//------------------------------------------------------------------------\r
-namespace PlugType\r
-{\r
-/**\r
-\defgroup plugType Plug-in Type used for subCategories */\r
-/*@{*/\r
-//------------------------------------------------------------------------\r
-const CString kFxAnalyzer                      = "Fx|Analyzer";        ///< Scope, FFT-Display, Loudness Processing...\r
-const CString kFxDelay                         = "Fx|Delay";           ///< Delay, Multi-tap Delay, Ping-Pong Delay...\r
-const CString kFxDistortion                    = "Fx|Distortion";      ///< Amp Simulator, Sub-Harmonic, SoftClipper...\r
-const CString kFxDynamics                      = "Fx|Dynamics";        ///< Compressor, Expander, Gate, Limiter, Maximizer, Tape Simulator, EnvelopeShaper...\r
-const CString kFxEQ                                    = "Fx|EQ";                      ///< Equalization, Graphical EQ...\r
-const CString kFxFilter                                = "Fx|Filter";          ///< WahWah, ToneBooster, Specific Filter,...\r
-const CString kFx                                      = "Fx";                         ///< others type (not categorized)\r
-const CString kFxInstrument                    = "Fx|Instrument";      ///< Fx which could be loaded as Instrument too\r
-const CString kFxInstrumentExternal    = "Fx|Instrument|External";     ///< Fx which could be loaded as Instrument too and is external (wrapped Hardware)\r
-const CString kFxSpatial                       = "Fx|Spatial";         ///< MonoToStereo, StereoEnhancer,...\r
-const CString kFxGenerator                     = "Fx|Generator";       ///< Tone Generator, Noise Generator...\r
-const CString kFxMastering                     = "Fx|Mastering";       ///< Dither, Noise Shaping,...\r
-const CString kFxModulation                    = "Fx|Modulation";      ///< Phaser, Flanger, Chorus, Tremolo, Vibrato, AutoPan, Rotary, Cloner...\r
-const CString kFxPitchShift                    = "Fx|Pitch Shift";     ///< Pitch Processing, Pitch Correction, Vocal Tuning...\r
-const CString kFxRestoration           = "Fx|Restoration";     ///< Denoiser, Declicker,...\r
-const CString kFxReverb                                = "Fx|Reverb";          ///< Reverberation, Room Simulation, Convolution Reverb...\r
-const CString kFxSurround                      = "Fx|Surround";        ///< dedicated to surround processing: LFE Splitter, Bass Manager...\r
-const CString kFxTools                         = "Fx|Tools";           ///< Volume, Mixer, Tuner...\r
-const CString kFxNetwork                       = "Fx|Network";         ///< using Network\r
-\r
-const CString kInstrument                      = "Instrument";                 ///< Effect used as instrument (sound generator), not as insert\r
-const CString kInstrumentDrum          = "Instrument|Drum";    ///< Instrument for Drum sounds\r
-const CString kInstrumentSampler       = "Instrument|Sampler"; ///< Instrument based on Samples\r
-const CString kInstrumentSynth         = "Instrument|Synth";   ///< Instrument based on Synthesis\r
-const CString kInstrumentSynthSampler = "Instrument|Synth|Sampler";    ///< Instrument based on Synthesis and Samples\r
-const CString kInstrumentExternal      = "Instrument|External";///< External Instrument (wrapped Hardware)\r
-\r
-const CString kSpatial                         = "Spatial";            ///< used for SurroundPanner\r
-const CString kSpatialFx                       = "Spatial|Fx";         ///< used for SurroundPanner and as insert effect\r
-const CString kOnlyRealTime                    = "OnlyRT";                     ///< indicates that it supports only realtime process call, no processing faster than realtime\r
-const CString kOnlyOfflineProcess      = "OnlyOfflineProcess"; ///< used for Plug-in offline processing  (will not work as normal insert Plug-in)\r
-const CString kNoOfflineProcess                = "NoOfflineProcess";   ///< will be NOT used for Plug-in offline processing (will work as normal insert Plug-in)\r
-const CString kUpDownMix                       = "Up-Downmix";         ///< used for Mixconverter/Up-Mixer/Down-Mixer\r
-const CString kAnalyzer                            = "Analyzer";           ///< Meter, Scope, FFT-Display, not selectable as insert plugin\r
-const CString kAmbisonic                       = "Ambisonic";          ///< used for Ambisonic channel (FX or Panner/Mixconverter/Up-Mixer/Down-Mixer when combined with other category)\r
-\r
-const CString kMono                                    = "Mono";                       ///< used for Mono only Plug-in [optional]\r
-const CString kStereo                          = "Stereo";                     ///< used for Stereo only Plug-in [optional]\r
-const CString kSurround                                = "Surround";           ///< used for Surround only Plug-in [optional]\r
-\r
-//------------------------------------------------------------------------\r
-/*@}*/\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Component Flags used as classFlags in PClassInfo2 */\r
-//------------------------------------------------------------------------\r
-enum ComponentFlags\r
-{\r
-//------------------------------------------------------------------------\r
-       kDistributable                  = 1 << 0,       ///< Component can be run on remote computer\r
-       kSimpleModeSupported    = 1 << 1        ///< Component supports simple IO mode (or works in simple mode anyway) see \ref vst3IoMode\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Symbolic sample size.\r
-\see ProcessSetup, ProcessData */\r
-//------------------------------------------------------------------------\r
-enum SymbolicSampleSizes\r
-{\r
-       kSample32,              ///< 32-bit precision\r
-       kSample64               ///< 64-bit precision\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Processing mode informs the Plug-in about the context and at which frequency the process call is called.\r
-VST3 defines 3 modes:\r
-- kRealtime: each process call is called at a realtime frequency (defined by [numSamples of ProcessData] / samplerate).\r
-             The Plug-in should always try to process as fast as possible in order to let enough time slice to other Plug-ins.\r
-- kPrefetch: each process call could be called at a variable frequency (jitter, slower / faster than realtime),\r
-             the Plug-in should process at the same quality level than realtime, Plug-in must not slow down to realtime\r
-                        (e.g. disk streaming)!\r
-                        The host should avoid to process in kPrefetch mode such sampler based Plug-in.\r
-- kOffline:  each process call could be faster than realtime or slower, higher quality than realtime could be used.\r
-             Plug-ins using disk streaming should be sure that they have enough time in the process call for streaming,\r
-                        if needed by slowing down to realtime or slower.\r
-.\r
-Note about Process Modes switching:\r
-       -Switching between kRealtime and kPrefetch process modes are done in realtime thread without need of calling\r
-        IAudioProcessor::setupProcessing, the Plug-in should check in process call the member processMode of ProcessData\r
-        in order to know in which mode it is processed.\r
-       -Switching between kRealtime (or kPrefetch) and kOffline requires that the host calls IAudioProcessor::setupProcessing\r
-        in order to inform the Plug-in about this mode change.\r
-.\r
-\see ProcessSetup, ProcessData */\r
-//------------------------------------------------------------------------\r
-enum ProcessModes\r
-{\r
-       kRealtime,              ///< realtime processing\r
-       kPrefetch,              ///< prefetch processing\r
-       kOffline                ///< offline processing\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** kNoTail\r
- *\r
- * to be returned by getTailSamples when no tail is wanted\r
- \see IAudioProcessor::getTailSamples */\r
-//------------------------------------------------------------------------\r
-static const uint32 kNoTail = 0;\r
-//------------------------------------------------------------------------\r
-/** kInfiniteTail\r
- *\r
- * to be returned by getTailSamples when infinite tail is wanted\r
- \see IAudioProcessor::getTailSamples */\r
-//------------------------------------------------------------------------\r
-static const uint32 kInfiniteTail = kMaxInt32u;\r
-\r
-//------------------------------------------------------------------------\r
-/** Audio processing setup.\r
-\see IAudioProcessor::setupProcessing */\r
-//------------------------------------------------------------------------\r
-struct ProcessSetup\r
-{\r
-//------------------------------------------------------------------------\r
-       int32 processMode;                      ///< \ref ProcessModes\r
-       int32 symbolicSampleSize;       ///< \ref SymbolicSampleSizes\r
-       int32 maxSamplesPerBlock;       ///< maximum number of samples per audio block\r
-       SampleRate sampleRate;          ///< sample rate\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Processing buffers of an audio bus.\r
-This structure contains the processing buffer for each channel of an audio bus.\r
-- The number of channels (numChannels) must always match the current bus arrangement.\r
-  It could be set to value '0' when the host wants to flush the parameters (when the Plug-in is not processed).\r
-- The size of the channel buffer array must always match the number of channels. So the host\r
-  must always supply an array for the channel buffers, regardless if the\r
-  bus is active or not. However, if an audio bus is currently inactive, the actual sample\r
-  buffer addresses are safe to be null.\r
-- The silence flag is set when every sample of the according buffer has the value '0'. It is\r
-  intended to be used as help for optimizations allowing a Plug-in to reduce processing activities.\r
-  But even if this flag is set for a channel, the channel buffers must still point to valid memory!\r
-  This flag is optional. A host is free to support it or not.\r
-.\r
-\see ProcessData */\r
-//------------------------------------------------------------------------\r
-struct AudioBusBuffers\r
-{\r
-       AudioBusBuffers () : numChannels (0), silenceFlags (0), channelBuffers64 (0) {}\r
-\r
-//------------------------------------------------------------------------\r
-       int32 numChannels;              ///< number of audio channels in bus\r
-       uint64 silenceFlags;    ///< Bitset of silence state per channel\r
-       union\r
-       {\r
-               Sample32** channelBuffers32;    ///< sample buffers to process with 32-bit precision\r
-               Sample64** channelBuffers64;    ///< sample buffers to process with 64-bit precision\r
-       };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Any data needed in audio processing.\r
-       The host prepares AudioBusBuffers for each input/output bus,\r
-       regardless of the bus activation state. Bus buffer indices always match\r
-       with bus indices used in IComponent::getBusInfo of media type kAudio.\r
-\see AudioBusBuffers, IParameterChanges, IEventList, ProcessContext */\r
-//------------------------------------------------------------------------\r
-struct ProcessData\r
-{\r
-       ProcessData ()\r
-       : processMode (0), symbolicSampleSize (kSample32), numSamples (0), numInputs (0)\r
-       , numOutputs (0), inputs (0), outputs (0), inputParameterChanges (0), outputParameterChanges (0)\r
-       , inputEvents (0), outputEvents (0), processContext (0) {}\r
-\r
-//------------------------------------------------------------------------\r
-       int32 processMode;                      ///< processing mode - value of \ref ProcessModes\r
-       int32 symbolicSampleSize;   ///< sample size - value of \ref SymbolicSampleSizes\r
-       int32 numSamples;                       ///< number of samples to process\r
-       int32 numInputs;                        ///< number of audio input buses\r
-       int32 numOutputs;                       ///< number of audio output buses\r
-       AudioBusBuffers* inputs;        ///< buffers of input buses\r
-       AudioBusBuffers* outputs;       ///< buffers of output buses\r
-\r
-       IParameterChanges* inputParameterChanges;       ///< incoming parameter changes for this block\r
-       IParameterChanges* outputParameterChanges;      ///< outgoing parameter changes for this block (optional)\r
-       IEventList* inputEvents;                                ///< incoming events for this block (optional)\r
-       IEventList* outputEvents;                               ///< outgoing events for this block (optional)\r
-       ProcessContext* processContext;                 ///< processing context (optional, but most welcome)\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Audio Processing Interface.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.0.0]\r
-- [mandatory]\r
-\r
-This interface must always be supported by audio processing Plug-ins. */\r
-//------------------------------------------------------------------------\r
-class IAudioProcessor: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Try to set (from host) a predefined arrangement for inputs and outputs.\r
-           The host should always deliver the same number of input and output buses than the Plug-in needs\r
-               (see \ref IComponent::getBusCount).\r
-               The Plug-in returns kResultFalse if wanted arrangements are not supported.\r
-               If the Plug-in accepts these arrangements, it should modify its buses to match the new arrangements\r
-               (asked by the host with IComponent::getInfo () or IAudioProcessor::getBusArrangement ()) and then return kResultTrue.\r
-               If the Plug-in does not accept these arrangements, but can adapt its current arrangements (according to the wanted ones),\r
-               it should modify its buses arrangements and return kResultFalse. */\r
-       virtual tresult PLUGIN_API setBusArrangements (SpeakerArrangement* inputs, int32 numIns,\r
-                                                                                                  SpeakerArrangement* outputs, int32 numOuts) = 0;\r
-\r
-       /** Gets the bus arrangement for a given direction (input/output) and index.\r
-               Note: IComponent::getInfo () and IAudioProcessor::getBusArrangement () should be always return the same\r
-               information about the buses arrangements. */\r
-       virtual tresult PLUGIN_API getBusArrangement (BusDirection dir, int32 index, SpeakerArrangement& arr) = 0;\r
-\r
-       /** Asks if a given sample size is supported see \ref SymbolicSampleSizes. */\r
-       virtual tresult PLUGIN_API canProcessSampleSize (int32 symbolicSampleSize) = 0;\r
-\r
-       /** Gets the current Latency in samples.\r
-               The returned value defines the group delay or the latency of the Plug-in. For example, if the Plug-in internally needs\r
-               to look in advance (like compressors) 512 samples then this Plug-in should report 512 as latency.\r
-               If during the use of the Plug-in this latency change, the Plug-in has to inform the host by\r
-               using IComponentHandler::restartComponent (kLatencyChanged), this could lead to audio playback interruption\r
-               because the host has to recompute its internal mixer delay compensation.\r
-               Note that for player live recording this latency should be zero or small. */\r
-       virtual uint32 PLUGIN_API getLatencySamples () = 0;\r
-\r
-       /** Called in disable state (not active) before processing will begin. */\r
-       virtual tresult PLUGIN_API setupProcessing (ProcessSetup& setup) = 0;\r
-\r
-       /** Informs the Plug-in about the processing state. This will be called before any process calls start with true and after with false.\r
-               Note that setProcessing (false) may be called after setProcessing (true) without any process calls.\r
-               In this call the Plug-in should do only light operation (no memory allocation or big setup reconfiguration),\r
-               this could be used to reset some buffers (like Delay line or Reverb). */\r
-       virtual tresult PLUGIN_API setProcessing (TBool state) = 0;\r
-\r
-       /** The Process call, where all information (parameter changes, event, audio buffer) are passed. */\r
-       virtual tresult PLUGIN_API process (ProcessData& data) = 0;\r
-\r
-       /** Gets tail size in samples. For example, if the Plug-in is a Reverb Plug-in and it knows that\r
-               the maximum length of the Reverb is 2sec, then it has to return in getTailSamples()\r
-               (in VST2 it was getGetTailSize ()): 2*sampleRate.\r
-               This information could be used by host for offline processing, process optimization and\r
-               downmix (avoiding signal cut (clicks)).\r
-               It should return:\r
-                - kNoTail when no tail\r
-                - x * sampleRate when x Sec tail.\r
-                - kInfiniteTail when infinite tail. */\r
-       virtual uint32 PLUGIN_API getTailSamples () = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAudioProcessor, 0x42043F99, 0xB7DA453C, 0xA569E79D, 0x9AAEC33D)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended IAudioProcessor interface for a component.\r
-\ingroup vstIPlug vst310\r
-- [plug imp]\r
-- [extends IAudioProcessor]\r
-- [released: 3.1.0]\r
-\r
-Inform the Plug-in about how long from the moment of generation/acquiring (from file or from Input)\r
-it will take for its input to arrive, and how long it will take for its output to be presented (to output or to Speaker).\r
-\r
-Note for Input Presentation Latency: when reading from file, the first Plug-in will have an input presentation latency set to zero.\r
-When monitoring audio input from a Audio Device, then this initial input latency will be the input latency of the Audio Device itself.\r
-\r
-Note for Output Presentation Latency: when writing to a file, the last Plug-in will have an output presentation latency set to zero.\r
-When the output of this Plug-in is connected to a Audio Device then this initial output latency will be the output\r
-latency of the Audio Device itself.\r
-\r
-A value of zero means either no latency or an unknown latency.\r
-\r
-Each Plug-in adding a latency (returning a none zero value for IAudioProcessor::getLatencySamples) will modify the input\r
-presentation latency of the next Plug-ins in the mixer routing graph and will modify the output presentation latency\r
-of the previous Plug-ins.\r
-\r
-\n\r
-\image html "iaudiopresentationlatency_usage.png"\r
-\n\r
-\see IAudioProcessor\r
-\see IComponent*/\r
-//------------------------------------------------------------------------\r
-class IAudioPresentationLatency: public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** Informs the Plug-in about the Audio Presentation Latency in samples for a given direction (kInput/kOutput) and bus index. */\r
-       virtual tresult PLUGIN_API setAudioPresentationLatencySamples (BusDirection dir, int32 busIndex, uint32 latencyInSamples) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAudioPresentationLatency, 0x309ECE78, 0xEB7D4fae, 0x8B2225D9, 0x09FD08B6)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h
deleted file mode 100644 (file)
index 7b2c548..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstautomationstate.h\r
-// Created by  : Steinberg, 02/2015\r
-// Description : VST Automation State Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended IComponent interface for a component.\r
-\ingroup vstIPlug vst365\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.6.5]\r
-- [optional]\r
-\r
-Hosts could inform the Plug-in about its current automation state (Read/Write/Nothing).\r
-*/\r
-//------------------------------------------------------------------------\r
-class IAutomationState : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       enum AutomationStates\r
-       {\r
-               kNoAutomation = 0,              ///< Not Read and not Write\r
-               kReadState = 1 << 0,    ///< Read state\r
-               kWriteState = 1 << 1,   ///< Write state\r
-\r
-               kReadWriteState = kReadState | kWriteState, ///< Read and Write enable\r
-       };\r
-\r
-       /** Sets the current Automation state. */\r
-       virtual tresult PLUGIN_API setAutomationState (int32 state) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAutomationState, 0xB4E8287F, 0x1BB346AA, 0x83A46667, 0x68937BAB)\r
-\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h
deleted file mode 100644 (file)
index da4d265..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstchannelcontextinfo.h\r
-// Created by  : Steinberg, 02/2014\r
-// Description : VST Channel Context Info Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-#include "pluginterfaces/vst/ivstattributes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-/** For Channel Context Info Interface */\r
-namespace ChannelContext {\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-/** Channel Context Interface.\r
-\ingroup vstIHost vst365\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.6.5]\r
-- [optional]\r
-\r
-Allows the host to inform the Plug-in about the context in which the Plug-in is instantiated,\r
-mainly channel based info (color, name, index,...). Index could be defined inside a namespace\r
-(for example index start from 1 to N for Type Input/Output Channel (Index namespace) and index\r
-start from 1 to M for Type Audio Channel).\n\r
-As soon as the Plug-in provides this IInfoListener interface, the host will call setChannelContextInfos\r
-for each change occurring to this channel (new name, new color, new indexation,...)\r
-\r
-\section IChannelContextExample Example\r
-\code\r
-tresult PLUGIN_API MyPlugin::setChannelContextInfos (IAttributeList* list)\r
-{\r
-       if (list)\r
-       {\r
-               // optional we can ask for the Channel Name Length\r
-               int64 length;\r
-               if (list->getInt (ChannelContext::kChannelNameLengthKey, length) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get the Channel Name where we, as Plug-in, are instantiated\r
-               String128 name;\r
-               if (list->getString (ChannelContext::kChannelNameKey, name, sizeof (name)) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get the Channel UID\r
-               if (list->getString (ChannelContext::kChannelUIDKey, name, sizeof (name)) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get Channel Index\r
-               int64 index;\r
-               if (list->getInt (ChannelContext::kChannelIndexKey, index) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get the Channel Color\r
-               int64 color;\r
-               if (list->getInt (ChannelContext::kChannelColorKey, color) == kResultTrue)\r
-               {\r
-                       uint32 channelColor = (uint32)color;\r
-                       String str;\r
-                       str.printf ("%x%x%x%x", ChannelContext::GetAlpha (channelColor),\r
-                       ChannelContext::GetRed (channelColor),\r
-                       ChannelContext::GetGreen (channelColor),\r
-                       ChannelContext::GetBlue (channelColor));\r
-                       String128 string128;\r
-                       Steinberg::UString (string128, 128).fromAscii (str);\r
-                       ...\r
-               }\r
-\r
-               // get Channel Index Namespace Order of the current used index namespace\r
-               if (list->getInt (ChannelContext::kChannelIndexNamespaceOrderKey, index) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get the channel Index Namespace Length\r
-               if (list->getInt (ChannelContext::kChannelIndexNamespaceLengthKey, length) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get the channel Index Namespace\r
-               String128 namespaceName;\r
-               if (list->getString (ChannelContext::kChannelIndexNamespaceKey, namespaceName, sizeof (namespaceName)) == kResultTrue)\r
-               {\r
-                       ...\r
-               }\r
-\r
-               // get Plug-in Channel Location\r
-               int64 location;\r
-               if (list->getInt (ChannelContext::kChannelPluginLocationKey, location) == kResultTrue)\r
-               {\r
-                       String128 string128;\r
-                       switch (location)\r
-                       {\r
-                               case ChannelContext::kPreVolumeFader:\r
-                                       Steinberg::UString (string128, 128).fromAscii ("PreVolFader");\r
-                               break;\r
-                               case ChannelContext::kPostVolumeFader:\r
-                                       Steinberg::UString (string128, 128).fromAscii ("PostVolFader");\r
-                               break;\r
-                               case ChannelContext::kUsedAsPanner:\r
-                                       Steinberg::UString (string128, 128).fromAscii ("UsedAsPanner");\r
-                               break;\r
-                               default: Steinberg::UString (string128, 128).fromAscii ("unknown!");\r
-                               break;\r
-                       }\r
-               }\r
-\r
-               // do not forget to call addRef () if you want to keep this list\r
-       }\r
-}\r
-\endcode */\r
-//------------------------------------------------------------------------\r
-class IInfoListener: public FUnknown\r
-{\r
-public:\r
-       /** Receive the channel context infos from host. */\r
-       virtual tresult PLUGIN_API setChannelContextInfos (IAttributeList* list) = 0;\r
-\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInfoListener, 0x0F194781, 0x8D984ADA, 0xBBA0C1EF, 0xC011D8D0)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Values used for kChannelPluginLocationKey */\r
-//------------------------------------------------------------------------\r
-enum ChannelPluginLocation\r
-{\r
-       kPreVolumeFader = 0,\r
-       kPostVolumeFader,\r
-       kUsedAsPanner\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-// Colors\r
-typedef uint32 ColorSpec;      ///< ARGB (Alpha-Red-Green-Blue)\r
-typedef uint8 ColorComponent;\r
-\r
-inline ColorComponent GetBlue (ColorSpec cs)   {return (ColorComponent)(cs & 0x000000FF); }\r
-inline ColorComponent GetGreen (ColorSpec cs)  {return (ColorComponent)((cs >> 8) & 0x000000FF); }\r
-inline ColorComponent GetRed (ColorSpec cs)            {return (ColorComponent)((cs >> 16) & 0x000000FF); }\r
-inline ColorComponent GetAlpha (ColorSpec cs)  {return (ColorComponent)((cs >> 24) & 0x000000FF); }\r
-\r
-//------------------------------------------------------------------------\r
-/** Keys used as AttrID (Attribute ID) in the return IAttributeList of\r
- * IInfoListener::setChannelContextInfos  */\r
-//------------------------------------------------------------------------\r
-/** string (TChar) [optional]: unique id string used to identify a channel */\r
-const CString kChannelUIDKey = "channel uid";\r
-\r
-/** integer (int64) [optional]: number of characters in kChannelUIDKey */\r
-const CString kChannelUIDLengthKey = "channel uid length";\r
-\r
-/** string (TChar) [optional]: name of the channel like displayed in the mixer */\r
-const CString kChannelNameKey = "channel name";\r
-\r
-/** integer (int64) [optional]: number of characters in kChannelNameKey */\r
-const CString kChannelNameLengthKey = "channel name length";\r
-\r
-/** color (ColorSpec) [optional]: used color for the channel in mixer or track */\r
-const CString kChannelColorKey = "channel color";\r
-\r
-/** integer (int64) [optional]: index of the channel in a channel index namespace, start with 1 not * 0! */\r
-const CString kChannelIndexKey = "channel index";\r
-\r
-/** integer (int64) [optional]: define the order of the current used index namespace, start with 1 not 0!\r
-       For example:\r
-       index namespace is "Input"   -> order 1,\r
-       index namespace is "Channel" -> order 2,\r
-       index namespace is "Output"  -> order 3 */\r
-const CString kChannelIndexNamespaceOrderKey = "channel index namespace order";\r
-\r
-/** string (TChar) [optional]: name of the channel index namespace for example "Input", "Output", "Channel", ... */\r
-const CString kChannelIndexNamespaceKey = "channel index namespace";\r
-\r
-/** integer (int64) [optional]: number of characters in kChannelIndexNamespaceKey */\r
-const CString kChannelIndexNamespaceLengthKey =        "channel index namespace length";\r
-\r
-/** PNG image representation as binary [optional] */\r
-const CString kChannelImageKey = "channel image";\r
-\r
-/** integer (int64) [optional]: routing position of the Plug-in in the channel (see ChannelPluginLocation) */\r
-const CString kChannelPluginLocationKey = "channel plugin location";\r
-//------------------------------------------------------------------------\r
-\r
-} // namespace ChannelContext\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h
deleted file mode 100644 (file)
index 4f7e733..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstcomponent.h\r
-// Created by  : Steinberg, 04/2005\r
-// Description : Basic VST Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ipluginbase.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-/** All VST specific interfaces are located in Vst namespace */\r
-//------------------------------------------------------------------------\r
-namespace Vst {\r
-const int32 kDefaultFactoryFlags = PFactoryInfo::kUnicode; ///< Standard value for PFactoryInfo::flags\r
-\r
-#define BEGIN_FACTORY_DEF(vendor,url,email) using namespace Steinberg; \\r
-       EXPORT_FACTORY IPluginFactory* PLUGIN_API GetPluginFactory () { \\r
-       if (!gPluginFactory) \\r
-       {       static PFactoryInfo factoryInfo (vendor,url,email,Vst::kDefaultFactoryFlags); \\r
-               gPluginFactory = new CPluginFactory (factoryInfo);\r
-\r
-//------------------------------------------------------------------------\r
-/** \defgroup vstBus VST Buses\r
-Bus Description\r
-\r
-A bus can be understood as a "collection of data channels" belonging together.\r
-It describes a data input or a data output of the Plug-in.\r
-A VST component can define any desired number of buses, but this number must \b never change.\r
-Dynamic usage of buses is handled in the host by activating and deactivating buses.\r
-The component has to define the maximum number of supported buses and it has to\r
-define which of them are active by default. A host that can handle multiple buses,\r
-allows the user to activate buses that were initially inactive.\r
-\r
-See also: IComponent::getBusInfo, IComponent::activateBus\r
-\r
-@{*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Bus media types */\r
-//------------------------------------------------------------------------\r
-enum MediaTypes\r
-{\r
-//------------------------------------------------------------------------\r
-       kAudio = 0,             ///< audio\r
-       kEvent,                 ///< events\r
-       kNumMediaTypes\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Bus directions */\r
-//------------------------------------------------------------------------\r
-enum BusDirections\r
-{\r
-//------------------------------------------------------------------------\r
-       kInput = 0,             ///< input bus\r
-       kOutput                 ///< output bus\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Bus types */\r
-//------------------------------------------------------------------------\r
-enum BusTypes\r
-{\r
-//------------------------------------------------------------------------\r
-       kMain = 0,              ///< main bus\r
-       kAux                    ///< auxiliary bus (sidechain)\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** BusInfo:\r
-This is the structure used with getBusInfo, informing the host about what is a specific given bus.\r
-See also: IComponent::getBusInfo\r
-*/\r
-//------------------------------------------------------------------------\r
-struct BusInfo\r
-{\r
-//------------------------------------------------------------------------\r
-       MediaType mediaType;    ///< Media type - has to be a value of \ref MediaTypes\r
-       BusDirection direction; ///< input or output \ref BusDirections\r
-       int32 channelCount;             ///< number of channels (if used then need to be recheck after \ref\r
-                                                       /// IAudioProcessor::setBusArrangements is called).\r
-                                                       /// For a bus of type MediaTypes::kEvent the channelCount corresponds\r
-                                                       /// to the number of supported MIDI channels by this bus\r
-       String128 name;                 ///< name of the bus\r
-       BusType busType;                ///< main or aux - has to be a value of \ref BusTypes\r
-       uint32 flags;                   ///< flags - a combination of \ref BusFlags\r
-       enum BusFlags\r
-       {\r
-               kDefaultActive = 1 << 0 ///< bus active per default\r
-       };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** I/O modes */\r
-//------------------------------------------------------------------------\r
-enum IoModes\r
-{\r
-       kSimple = 0,            ///< 1:1 Input / Output. Only used for Instruments. See \ref vst3IoMode\r
-       kAdvanced,                      ///< n:m Input / Output. Only used for Instruments.\r
-       kOfflineProcessing      ///< Plug-in used in an offline processing context\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Routing Information:\r
-    When the Plug-in supports multiple I/O buses, a host may want to know how the\r
-    buses are related. The relation of an event-input-channel to an audio-output-bus\r
-       in particular is of interest to the host (in order to relate MIDI-tracks to audio-channels)\r
-    \n See also: IComponent::getRoutingInfo, \ref vst3Routing */\r
-//------------------------------------------------------------------------\r
-struct RoutingInfo\r
-{\r
-       MediaType mediaType;    ///< media type see \ref MediaTypes\r
-       int32 busIndex;                 ///< bus index\r
-       int32 channel;                  ///< channel (-1 for all channels)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// IComponent Interface\r
-//------------------------------------------------------------------------\r
-/** Component Base Interface\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [released: 3.0.0]\r
-- [mandatory]\r
-\r
-This is the basic interface for a VST component and must always be supported.\r
-It contains the common parts of any kind of processing class. The parts that\r
-are specific to a media type are defined in a separate interface. An implementation\r
-component must provide both the specific interface and IComponent.\r
-*/\r
-class IComponent: public IPluginBase\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Called before initializing the component to get information about the controller class. */\r
-       virtual tresult PLUGIN_API getControllerClassId (TUID classId) = 0;\r
-\r
-       /** Called before 'initialize' to set the component usage (optional). See \ref IoModes */\r
-       virtual tresult PLUGIN_API setIoMode (IoMode mode) = 0;\r
-\r
-       /** Called after the Plug-in is initialized. See \ref MediaTypes, BusDirections */\r
-       virtual int32 PLUGIN_API getBusCount (MediaType type, BusDirection dir) = 0;\r
-\r
-       /** Called after the Plug-in is initialized. See \ref MediaTypes, BusDirections */\r
-       virtual tresult PLUGIN_API getBusInfo (MediaType type, BusDirection dir, int32 index, BusInfo& bus /*out*/) = 0;\r
-\r
-       /** Retrieves routing information (to be implemented when more than one regular input or output bus exists).\r
-           The inInfo always refers to an input bus while the returned outInfo must refer to an output bus! */\r
-       virtual tresult PLUGIN_API getRoutingInfo (RoutingInfo& inInfo, RoutingInfo& outInfo /*out*/) = 0;\r
-\r
-       /** Called upon (de-)activating a bus in the host application. The Plug-in should only processed an activated bus,\r
-           the host could provide less see \ref AudioBusBuffers in the process call (see \ref IAudioProcessor::process) if last buses are not activated */\r
-       virtual tresult PLUGIN_API activateBus (MediaType type, BusDirection dir, int32 index, TBool state) = 0;\r
-\r
-       /** Activates / deactivates the component. */\r
-       virtual tresult PLUGIN_API setActive (TBool state) = 0;\r
-\r
-       /** Sets complete state of component. */\r
-       virtual tresult PLUGIN_API setState (IBStream* state) = 0;\r
-\r
-       /** Retrieves complete state of component. */\r
-       virtual tresult PLUGIN_API getState (IBStream* state) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponent, 0xE831FF31, 0xF2D54301, 0x928EBBEE, 0x25697802)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h
deleted file mode 100644 (file)
index d6f0f18..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstcontextmenu.h\r
-// Created by  : Steinberg, 10/2010\r
-// Description : VST Context Menu Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-class IPlugView;\r
-\r
-namespace Vst {\r
-class IContextMenu;\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Host callback interface IComponentHandler3 for an edit controller.\r
-\ingroup vstIHost vst350\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.5.0]\r
-\r
-A Plug-in can ask the host to create a context menu for a given exported Parameter ID or a generic context menu.\n\r
-\r
-The host may pre-fill this context menu with specific items regarding the parameter ID like "Show automation for parameter",\r
-"MIDI learn" etc...\n\r
-\r
-The Plug-in can use the context menu in two ways :\r
-- add its own items to the menu via the IContextMenu interface and call IContextMenu::popup(..) to pop-up it. See the \ref IContextMenuExample.\r
-- extract the host menu items and add them to its own created context menu\r
-\r
-\b Note: You can and should use this even if you don't add your own items to the menu as this is considered to be a big user value.\r
-\r
-\sa IContextMenu\r
-\sa IContextMenuTarget\r
-\r
-\section IContextMenuExample Example\r
-Adding Plug-in specific items to the context menu\r
-\code\r
-class PluginContextMenuTarget : public IContextMenuTarget, public FObject\r
-{\r
-public:\r
-       PluginContextMenuTarget () {}\r
-\r
-       virtual tresult PLUGIN_API executeMenuItem (int32 tag)\r
-       {\r
-               // this will be called if the user has executed one of the menu items of the Plug-in.\r
-               // It won't be called for items of the host.\r
-               switch (tag)\r
-               {\r
-                       case 1: break;\r
-                       case 2: break;\r
-               }\r
-               return kResultTrue;\r
-       }\r
-\r
-       OBJ_METHODS(PluginContextMenuTarget, FObject)\r
-       DEFINE_INTERFACES\r
-               DEF_INTERFACE (IContextMenuTarget)\r
-       END_DEFINE_INTERFACES (FObject)\r
-       REFCOUNT_METHODS(FObject)\r
-};\r
-\r
-// The following is the code to create the context menu\r
-void popupContextMenu (IComponentHandler* componentHandler, IPlugView* view, const ParamID* paramID, UCoord x, UCoord y)\r
-{\r
-       if (componentHandler == 0 || view == 0)\r
-               return;\r
-       FUnknownPtr<IComponentHandler3> handler (componentHandler);\r
-       if (handler == 0)\r
-               return;\r
-       IContextMenu* menu = handler->createContextMenu (view, paramID);\r
-       if (menu)\r
-       {\r
-               // here you can add your entries (optional)\r
-               PluginContextMenuTarget* target = new PluginContextMenuTarget ();\r
-\r
-               IContextMenu::Item item = {0};\r
-               UString128 ("My Item 1").copyTo (item.name, 128);\r
-               item.tag = 1;\r
-               menu->addItem (item, target);\r
-\r
-               UString128 ("My Item 2").copyTo (item.name, 128);\r
-               item.tag = 2;\r
-               menu->addItem (item, target);\r
-               target->release ();\r
-               //--end of adding new entries\r
-\r
-               // here the the context menu will be pop-up (and it waits a user interaction)\r
-               menu->popup (x, y);\r
-               menu->release ();\r
-       }\r
-}\r
-\endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-class IComponentHandler3 : public FUnknown\r
-{\r
-public:\r
-       /** Creates a host context menu for a Plug-in:\r
-               - If paramID is zero, the host may create a generic context menu.\r
-               - The IPlugView object must be valid.\r
-               - The return IContextMenu object needs to be released afterwards by the Plug-in.\r
-       */\r
-       virtual IContextMenu* PLUGIN_API createContextMenu (IPlugView* plugView, const ParamID* paramID) = 0;\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandler3, 0x69F11617, 0xD26B400D, 0xA4B6B964, 0x7B6EBBAB)\r
-\r
-//------------------------------------------------------------------------\r
-/** Context Menu Item Target Interface.\r
-\ingroup vstIHost vstIPlug vst350\r
-- [host imp]\r
-- [plug imp]\r
-- [released: 3.5.0]\r
-\r
-A receiver of a menu item should implement this interface, which will be called after the user has selected\r
-this menu item.\r
-\r
-See IComponentHandler3 for more.\r
-*/\r
-//------------------------------------------------------------------------\r
-class IContextMenuTarget : public FUnknown\r
-{\r
-public:\r
-       /** Called when an menu item was executed. */\r
-       virtual tresult PLUGIN_API executeMenuItem (int32 tag) = 0;\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IContextMenuTarget, 0x3CDF2E75, 0x85D34144, 0xBF86D36B, 0xD7C4894D)\r
-\r
-//------------------------------------------------------------------------\r
-/** Context Menu Interface.\r
-\ingroup vstIHost vst350\r
-- [host imp]\r
-- [create with IComponentHandler3::createContextMenu(..)]\r
-- [released: 3.5.0]\r
-\r
-A context menu is composed of Item (entry). A Item is defined by a name, a tag, a flag\r
-and a associated target (called when this item will be selected/executed).\r
-With IContextMenu the Plug-in can retrieve a Item, add a Item, remove a Item and pop-up the menu.\r
-\r
-See IComponentHandler3 for more.\r
-*/\r
-//------------------------------------------------------------------------\r
-class IContextMenu : public FUnknown\r
-{\r
-public:\r
-       /** Item is a entry element of the context menu. */\r
-       struct Item\r
-       {\r
-               String128 name;                                                                 ///< Name of the item\r
-               int32 tag;                                                                              ///< Identifier tag of the item\r
-               int32 flags;                                                                    ///< Flags of the item\r
-\r
-               enum Flags {\r
-                       kIsSeparator    = 1 << 0,                                       ///< Item is a separator\r
-                       kIsDisabled             = 1 << 1,                                       ///< Item is disabled\r
-                       kIsChecked              = 1 << 2,                                       ///< Item is checked\r
-                       kIsGroupStart   = 1 << 3 | kIsDisabled,         ///< Item is a group start (like sub folder)\r
-                       kIsGroupEnd             = 1 << 4 | kIsSeparator,        ///< Item is a group end\r
-               };\r
-       };\r
-\r
-       /** Gets the number of menu items. */\r
-       virtual int32 PLUGIN_API getItemCount () = 0;\r
-\r
-       /** Gets a menu item and its target (target could be not assigned). */\r
-       virtual tresult PLUGIN_API getItem (int32 index, Item& item /*out*/, IContextMenuTarget** target /*out*/) = 0;\r
-\r
-       /** Adds a menu item and its target. */\r
-       virtual tresult PLUGIN_API addItem (const Item& item, IContextMenuTarget* target) = 0;\r
-\r
-       /** Removes a menu item. */\r
-       virtual tresult PLUGIN_API removeItem (const Item& item, IContextMenuTarget* target) = 0;\r
-\r
-       /** Pop-ups the menu. Coordinates are relative to the top-left position of the Plug-ins view. */\r
-       virtual tresult PLUGIN_API popup (UCoord x, UCoord y) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IContextMenu, 0x2E93C863, 0x0C9C4588, 0x97DBECF5, 0xAD17817D)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h
deleted file mode 100644 (file)
index 9c0da70..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivsteditcontroller.h\r
-// Created by  : Steinberg, 09/2005\r
-// Description : VST Edit Controller Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ipluginbase.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Class Category Name for Controller Component */\r
-//------------------------------------------------------------------------\r
-#ifndef kVstComponentControllerClass\r
-#define kVstComponentControllerClass "Component Controller Class"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-class IPlugView;\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Controller Parameter Info. */\r
-//------------------------------------------------------------------------\r
-struct ParameterInfo\r
-{\r
-//------------------------------------------------------------------------\r
-       ParamID id;                             ///< unique identifier of this parameter (named tag too)\r
-       String128 title;                ///< parameter title (e.g. "Volume")\r
-       String128 shortTitle;   ///< parameter shortTitle (e.g. "Vol")\r
-       String128 units;                ///< parameter unit (e.g. "dB")\r
-       int32 stepCount;                ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise\r
-                                                       ///< (corresponding to max - min, for example: 127 for a min = 0 and a max = 127) - see \ref vst3parameterIntro)\r
-       ParamValue defaultNormalizedValue;      ///< default normalized value [0,1] (in case of discrete value: defaultNormalizedValue = defDiscreteValue / stepCount)\r
-       UnitID unitId;                  ///< id of unit this parameter belongs to (see \ref vst3UnitsIntro)\r
-\r
-       int32 flags;                    ///< ParameterFlags (see below)\r
-       enum ParameterFlags\r
-       {\r
-               kCanAutomate     = 1 << 0,      ///< parameter can be automated\r
-               kIsReadOnly              = 1 << 1,      ///< parameter cannot be changed from outside (implies that kCanAutomate is false)\r
-               kIsWrapAround    = 1 << 2,      ///< attempts to set the parameter value out of the limits will result in a wrap around [SDK 3.0.2]\r
-               kIsList                  = 1 << 3,      ///< parameter should be displayed as list in generic editor or automation editing [SDK 3.1.0]\r
-\r
-               kIsProgramChange = 1 << 15,     ///< parameter is a program change (unitId gives info about associated unit\r
-                                                                       ///< - see \ref vst3UnitPrograms)\r
-               kIsBypass                = 1 << 16      ///< special bypass parameter (only one allowed): Plug-in can handle bypass\r
-                                                                       ///< (highly recommended to export a bypass parameter for effect Plug-in)\r
-       };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** View Types used for IEditController::createView */\r
-//------------------------------------------------------------------------\r
-namespace ViewType {\r
-const CString kEditor = "editor";\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Flags used for IComponentHandler::restartComponent */\r
-//------------------------------------------------------------------------\r
-enum RestartFlags\r
-{\r
-       kReloadComponent                        = 1 << 0,       ///< The Component should be reloaded             [SDK 3.0.0]\r
-       kIoChanged                                      = 1 << 1,       ///< Input and/or Output Bus configuration has changed        [SDK 3.0.0]\r
-       kParamValuesChanged                     = 1 << 2,       ///< Multiple parameter values have changed\r
-                                                                                       ///< (as result of a program change for example)  [SDK 3.0.0]\r
-       kLatencyChanged                         = 1 << 3,       ///< Latency has changed (IAudioProcessor.getLatencySamples)  [SDK 3.0.0]\r
-       kParamTitlesChanged                     = 1 << 4,       ///< Parameter titles or default values or flags have changed [SDK 3.0.0]\r
-       kMidiCCAssignmentChanged        = 1 << 5,       ///< MIDI Controller Assignments have changed     [SDK 3.0.1]\r
-       kNoteExpressionChanged          = 1 << 6,       ///< Note Expression has changed (info, count...) [SDK 3.5.0]\r
-       kIoTitlesChanged                        = 1 << 7,       ///< Input and/or Output bus titles have changed  [SDK 3.5.0]\r
-       kPrefetchableSupportChanged = 1 << 8,   ///< Prefetch support has changed (\see IPrefetchableSupport) [SDK 3.6.1]\r
-       kRoutingInfoChanged                     = 1 << 9        ///< RoutingInfo has changed (\see IComponent)    [SDK 3.6.6]\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Host callback interface for an edit controller.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-Allow transfer of parameter editing to component (processor) via host and support automation.\r
-Cause the host to react on configuration changes (restartComponent)\r
-\r
-\see IEditController */\r
-//------------------------------------------------------------------------\r
-class IComponentHandler: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** To be called before calling a performEdit (e.g. on mouse-click-down event). */\r
-       virtual tresult PLUGIN_API beginEdit (ParamID id) = 0;\r
-\r
-       /** Called between beginEdit and endEdit to inform the handler that a given parameter has a new value. */\r
-       virtual tresult PLUGIN_API performEdit (ParamID id, ParamValue valueNormalized) = 0;\r
-\r
-       /** To be called after calling a performEdit (e.g. on mouse-click-up event). */\r
-       virtual tresult PLUGIN_API endEdit (ParamID id) = 0;\r
-\r
-       /** Instructs host to restart the component. This should be called in the UI-Thread context!\r
-       \param flags is a combination of RestartFlags */\r
-       virtual tresult PLUGIN_API restartComponent (int32 flags) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandler, 0x93A0BEA3, 0x0BD045DB, 0x8E890B0C, 0xC1E46AC6)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Host callback interface IComponentHandler2 for an edit controller\r
-\ingroup vstIHost vst310\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.1.0]\r
-\r
-One part handles:\r
-- Setting dirty state of Plug-in\r
-- requesting the host to open the editor\r
-\r
-The other part handles parameter group editing from Plug-in UI. It wraps a set of \ref IComponentHandler::beginEdit /\r
-\ref IComponentHandler::performEdit / \ref IComponentHandler::endEdit functions (see \ref IComponentHandler)\r
-which should use the same timestamp in the host when writing automation.\r
-This allows for better synchronizing multiple parameter changes at once.\r
-\r
-\section IComponentHandler2Example Examples of different use cases\r
-\code\r
-       //--------------------------------------\r
-       // in case of multiple switch buttons (with associated ParamID 1 and 3)\r
-       // on mouse down :\r
-       hostHandler2->startGroupEdit ();\r
-       hostHandler->beginEdit (1);\r
-       hostHandler->beginEdit (3);\r
-       hostHandler->performEdit (1, 1.0);\r
-       hostHandler->performEdit (3, 0.0); // the opposite of paramID 1 for example\r
-       ....\r
-       // on mouse up :\r
-       hostHandler->endEdit (1);\r
-       hostHandler->endEdit (3);\r
-       hostHandler2->finishGroupEdit ();\r
-       ....\r
-       ....\r
-       //--------------------------------------\r
-       // in case of multiple faders (with associated ParamID 1 and 3)\r
-       // on mouse down :\r
-       hostHandler2->startGroupEdit ();\r
-       hostHandler->beginEdit (1);\r
-       hostHandler->beginEdit (3);\r
-       hostHandler2->finishGroupEdit ();\r
-       ....\r
-       // on mouse move :\r
-       hostHandler2->startGroupEdit ();\r
-       hostHandler->performEdit (1, x); // x the wanted value\r
-       hostHandler->performEdit (3, x);\r
-       hostHandler2->finishGroupEdit ();\r
-       ....\r
-       // on mouse up :\r
-       hostHandler2->startGroupEdit ();\r
-       hostHandler->endEdit (1);\r
-       hostHandler->endEdit (3);\r
-       hostHandler2->finishGroupEdit ();\r
-\endcode\r
-\see IComponentHandler\r
-\see IEditController*/\r
-//------------------------------------------------------------------------\r
-class IComponentHandler2: public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** Tells host that the Plug-in is dirty (something besides parameters has changed since last save),\r
-       if true the host should apply a save before quitting. */\r
-       virtual tresult PLUGIN_API setDirty (TBool state) = 0;\r
-\r
-       /** Tells host that it should open the Plug-in editor the next time it's possible.\r
-       You should use this instead of showing an alert and blocking the program flow (especially on loading projects). */\r
-       virtual tresult PLUGIN_API requestOpenEditor (FIDString name = ViewType::kEditor) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       /** Starts the group editing (call before a \ref IComponentHandler::beginEdit),\r
-       the host will keep the current timestamp at this call and will use it for all \ref IComponentHandler::beginEdit\r
-       / \ref IComponentHandler::performEdit / \ref IComponentHandler::endEdit calls until a \ref finishGroupEdit (). */\r
-       virtual tresult PLUGIN_API startGroupEdit () = 0;\r
-\r
-       /** Finishes the group editing started by a \ref startGroupEdit (call after a \ref IComponentHandler::endEdit). */\r
-       virtual tresult PLUGIN_API finishGroupEdit () = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandler2, 0xF040B4B3, 0xA36045EC, 0xABCDC045, 0xB4D5A2CC)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Host callback interface IComponentHandlerBusActivation for an edit controller.\r
-\ingroup vstIHost vst368\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.6.8]\r
-\r
-Allows the Plug-in to request the host to activate or deactivate a specific bus,\r
-if the host accepts it will call later on IComponent::activateBus (see \ref IComponent::activateBus).\r
-Useful especially for Instrument with more than 1 outputs, where the user could request\r
-from the Plug-in UI a given output bus activation.\r
-\r
-\see \ref IComponentHandler */\r
-//------------------------------------------------------------------------\r
-class IComponentHandlerBusActivation : public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** request the host to activate or deactivate a specific bus. */\r
-       virtual tresult PLUGIN_API requestBusActivation (MediaType type, BusDirection dir, int32 index,\r
-                                                        TBool state) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandlerBusActivation, 0x067D02C1, 0x5B4E274D, 0xA92D90FD, 0x6EAF7240)\r
-\r
-//------------------------------------------------------------------------\r
-/** Edit controller component interface.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [released: 3.0.0]\r
-\r
-The Controller part of an effect or instrument with parameter handling (export, definition, conversion...).\r
-\see IComponent::getControllerClassId, IMidiMapping */\r
-//------------------------------------------------------------------------\r
-class IEditController: public IPluginBase\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Receives the component state. */\r
-       virtual tresult PLUGIN_API setComponentState (IBStream* state) = 0;\r
-\r
-       /** Sets the controller state. */\r
-       virtual tresult PLUGIN_API setState (IBStream* state) = 0;\r
-\r
-       /** Gets the controller state. */\r
-       virtual tresult PLUGIN_API getState (IBStream* state) = 0;\r
-\r
-       // parameters -------------------------\r
-       /** Returns the number of parameters exported. */\r
-       virtual int32 PLUGIN_API getParameterCount () = 0;\r
-       /** Gets for a given index the parameter information. */\r
-       virtual tresult PLUGIN_API getParameterInfo (int32 paramIndex, ParameterInfo& info /*out*/) = 0;\r
-\r
-       /** Gets for a given paramID and normalized value its associated string representation. */\r
-       virtual tresult PLUGIN_API getParamStringByValue (ParamID id, ParamValue valueNormalized /*in*/, String128 string /*out*/) = 0;\r
-       /** Gets for a given paramID and string its normalized value. */\r
-       virtual tresult PLUGIN_API getParamValueByString (ParamID id, TChar* string /*in*/, ParamValue& valueNormalized /*out*/) = 0;\r
-\r
-       /** Returns for a given paramID and a normalized value its plain representation\r
-               (for example 90 for 90db - see \ref vst3AutomationIntro). */\r
-       virtual ParamValue PLUGIN_API normalizedParamToPlain (ParamID id, ParamValue valueNormalized) = 0;\r
-       /** Returns for a given paramID and a plain value its normalized value. (see \ref vst3AutomationIntro) */\r
-       virtual ParamValue PLUGIN_API plainParamToNormalized (ParamID id, ParamValue plainValue) = 0;\r
-\r
-       /** Returns the normalized value of the parameter associated to the paramID. */\r
-       virtual ParamValue PLUGIN_API getParamNormalized (ParamID id) = 0;\r
-       /** Sets the normalized value to the parameter associated to the paramID. The controller must never\r
-           pass this value-change back to the host via the IComponentHandler. It should update the according\r
-               GUI element(s) only!*/\r
-       virtual tresult PLUGIN_API setParamNormalized (ParamID id, ParamValue value) = 0;\r
-\r
-       // handler ----------------------------\r
-       /** Gets from host a handler. */\r
-       virtual tresult PLUGIN_API setComponentHandler (IComponentHandler* handler) = 0;\r
-\r
-       // view -------------------------------\r
-       /** Creates the editor view of the Plug-in, currently only "editor" is supported, see \ref ViewType.\r
-               The life time of the editor view will never exceed the life time of this controller instance. */\r
-       virtual IPlugView* PLUGIN_API createView (FIDString name) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEditController, 0xDCD7BBE3, 0x7742448D, 0xA874AACC, 0x979C759E)\r
-\r
-//------------------------------------------------------------------------\r
-/** Knob Mode */\r
-//------------------------------------------------------------------------\r
-enum KnobModes\r
-{\r
-       kCircularMode = 0,              ///< Circular with jump to clicked position\r
-       kRelativCircularMode,   ///< Circular without jump to clicked position\r
-       kLinearMode                             ///< Linear: depending on vertical movement\r
-};\r
-\r
-typedef int32 KnobMode;                ///< Knob Mode\r
-\r
-//------------------------------------------------------------------------\r
-/** Edit controller component interface extension.\r
-\ingroup vstIPlug vst310\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.1.0]\r
-\r
-Extension to inform the Plug-in about the host Knob Mode,\r
-and to open the Plug-in about box or help documentation.\r
-\r
-\see IEditController*/\r
-//------------------------------------------------------------------------\r
-class IEditController2: public FUnknown\r
-{\r
-public:\r
-       /** Host could set the Knob Mode for the Plug-in. Return kResultFalse means not supported mode. \see KnobModes. */\r
-       virtual tresult PLUGIN_API setKnobMode (KnobMode mode) = 0;\r
-\r
-       /** Host could ask to open the Plug-in help (could be: opening a PDF document or link to a web page).\r
-           The host could call it with onlyCheck set to true for testing support of open Help.\r
-               Return kResultFalse means not supported function. */\r
-       virtual tresult PLUGIN_API openHelp (TBool onlyCheck) = 0;\r
-\r
-       /** Host could ask to open the Plug-in about box.\r
-           The host could call it with onlyCheck set to true for testing support of open AboutBox.\r
-               Return kResultFalse means not supported function. */\r
-       virtual tresult PLUGIN_API openAboutBox (TBool onlyCheck) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEditController2, 0x7F4EFE59, 0xF3204967, 0xAC27A3AE, 0xAFB63038)\r
-\r
-//------------------------------------------------------------------------\r
-/** MIDI Mapping Interface.\r
-\ingroup vstIPlug vst301\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.0.1]\r
-\r
-MIDI controllers are not transmitted directly to a VST component. MIDI as hardware protocol has\r
-restrictions that can be avoided in software. Controller data in particular come along with unclear\r
-and often ignored semantics. On top of this they can interfere with regular parameter automation and\r
-the host is unaware of what happens in the Plug-in when passing MIDI controllers directly.\r
-\r
-So any functionality that is to be controlled by MIDI controllers must be exported as regular parameter.\r
-The host will transform incoming MIDI controller data using this interface and transmit them as normal\r
-parameter change. This allows the host to automate them in the same way as other parameters.\r
-CtrlNumber could be typical MIDI controller value extended to some others values like pitch bend or\r
-after touch (see \ref ControllerNumbers).\r
-If the mapping has changed, the Plug-in should call IComponentHandler::restartComponent (kMidiCCAssignmentChanged)\r
-to inform the host about this change. */\r
-//------------------------------------------------------------------------\r
-class IMidiMapping: public FUnknown\r
-{\r
-public:\r
-\r
-       /** Gets an (preferred) associated ParamID for a given Input Event Bus index, channel and MIDI Controller.\r
-       *       @param[in] busIndex - index of Input Event Bus\r
-       *       @param[in] channel - channel of the bus\r
-       *   @param[in] midiControllerNumber - see \ref ControllerNumbers for expected values (could be bigger than 127)\r
-       *       @param[in] id - return the associated ParamID to the given midiControllerNumber\r
-       */\r
-       virtual tresult PLUGIN_API getMidiControllerAssignment (int32 busIndex, int16 channel,\r
-                                                                                                                       CtrlNumber midiControllerNumber, ParamID& id/*out*/) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IMidiMapping, 0xDF0FF9F7, 0x49B74669, 0xB63AB732, 0x7ADBF5E5)\r
-\r
-//------------------------------------------------------------------------\r
-/** Parameter Editing from Host.\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-If this interface is implemented by the edit controller and when performing edits from outside\r
-the Plug-in (host / remote) of a not automatable and not read only flagged parameter (kind of helper parameter),\r
-the host will start with a beginEditFromHost before calling setParamNormalized and end with an endEditFromHost.\r
-Here the sequencing, the host will call:\r
-- beginEditFromHost ()\r
-- setParamNormalized ()\r
-- setParamNormalized ()\r
-- ...\r
-- endEditFromHost ()\r
-\see IEditController */\r
-//------------------------------------------------------------------------\r
-class IEditControllerHostEditing : public FUnknown\r
-{\r
-public:\r
-       /** Called before a setParamNormalized sequence, a endEditFromHost will be call at the end of the editing action. */\r
-       virtual tresult PLUGIN_API beginEditFromHost (ParamID paramID) = 0;\r
-\r
-       /** Called after a beginEditFromHost and a sequence of setParamNormalized. */\r
-       virtual tresult PLUGIN_API endEditFromHost (ParamID paramID) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEditControllerHostEditing, 0xC1271208, 0x70594098, 0xB9DD34B3, 0x6BB0195E)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h
deleted file mode 100644 (file)
index ff4efc9..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstevents.h\r
-// Created by  : Steinberg, 11/2005\r
-// Description : VST Events (MIDI) Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstprocesscontext.h"\r
-#include "pluginterfaces/vst/ivstnoteexpression.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Note-on event specific data. Used in \ref Event (union)*/\r
-struct NoteOnEvent\r
-{\r
-       int16 channel;                  ///< channel index in event bus\r
-       int16 pitch;                    ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
-       float tuning;                   ///< 1.f = +1 cent, -1.f = -1 cent\r
-       float velocity;                 ///< range [0.0, 1.0]\r
-       int32 length;           ///< in sample frames (optional, Note Off has to follow in any case!)\r
-       int32 noteId;                   ///< note identifier (if not available then -1)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Note-off event specific data. Used in \ref Event (union)*/\r
-struct NoteOffEvent\r
-{\r
-       int16 channel;                  ///< channel index in event bus\r
-       int16 pitch;                    ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
-       float velocity;                 ///< range [0.0, 1.0]\r
-       int32 noteId;                   ///< associated noteOn identifier (if not available then -1)\r
-       float tuning;                   ///< 1.f = +1 cent, -1.f = -1 cent\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Data event specific data. Used in \ref Event (union)*/\r
-struct DataEvent\r
-{\r
-       uint32 size;                    ///< size in bytes of the data block bytes\r
-       uint32 type;                    ///< type of this data block (see \ref DataTypes)\r
-       const uint8* bytes;             ///< pointer to the data block\r
-\r
-       /** Value for DataEvent::type */\r
-       enum DataTypes\r
-       {\r
-               kMidiSysEx = 0          ///< for MIDI system exclusive message\r
-       };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** PolyPressure event specific data. Used in \ref Event (union)*/\r
-struct PolyPressureEvent\r
-{\r
-       int16 channel;                  ///< channel index in event bus\r
-       int16 pitch;                    ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
-       float pressure;                 ///< range [0.0, 1.0]\r
-       int32 noteId;                   ///< event should be applied to the noteId (if not -1)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Chord event specific data. Used in \ref Event (union)*/\r
-struct ChordEvent\r
-{\r
-       int16 root;                             ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
-       int16 bassNote;                 ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
-       int16 mask;                             ///< root is bit 0\r
-       uint16 textLen;                 ///< the number of characters (TChar) between the beginning of text and the terminating\r
-                                                       ///< null character (without including the terminating null character itself)\r
-       const TChar* text;              ///< UTF-16, null terminated Hosts Chord Name\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Scale event specific data. Used in \ref Event (union)*/\r
-struct ScaleEvent\r
-{\r
-       int16 root;                             ///< range [0, 127] = root Note/Transpose Factor\r
-       int16 mask;                             ///< Bit 0 =  C,  Bit 1 = C#, ... (0x5ab5 = Major Scale)\r
-       uint16 textLen;                 ///< the number of characters (TChar) between the beginning of text and the terminating\r
-                                                       ///< null character (without including the terminating null character itself)\r
-       const TChar* text;              ///< UTF-16, null terminated, Hosts Scale Name\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Event */\r
-//------------------------------------------------------------------------\r
-struct Event\r
-{\r
-       int32 busIndex;                         ///< event bus index\r
-       int32 sampleOffset;                     ///< sample frames related to the current block start sample position\r
-       TQuarterNotes ppqPosition;      ///< position in project\r
-       uint16 flags;                           ///< combination of \ref EventFlags\r
-\r
-       /** Event Flags - used for Event::flags */\r
-       enum EventFlags\r
-       {\r
-               kIsLive = 1 << 0,                       ///< indicates that the event is played live (directly from keyboard)\r
-\r
-               kUserReserved1 = 1 << 14,       ///< reserved for user (for internal use)\r
-               kUserReserved2 = 1 << 15        ///< reserved for user (for internal use)\r
-       };\r
-\r
-       /**  Event Types - used for Event::type */\r
-       enum EventTypes\r
-       {\r
-               kNoteOnEvent = 0,                       ///< is \ref NoteOnEvent\r
-               kNoteOffEvent,                          ///< is \ref NoteOffEvent\r
-               kDataEvent,                                     ///< is \ref DataEvent\r
-               kPolyPressureEvent,                     ///< is \ref PolyPressureEvent\r
-               kNoteExpressionValueEvent,      ///< is \ref NoteExpressionValueEvent\r
-               kNoteExpressionTextEvent,       ///< is \ref NoteExpressionTextEvent\r
-               kChordEvent,                            ///< is \ref ChordEvent\r
-               kScaleEvent                                     ///< is \ref ScaleEvent\r
-       };\r
-\r
-       uint16 type;                            ///< a value from \ref EventTypes\r
-       union\r
-       {\r
-               NoteOnEvent noteOn;                                                             ///< type == kNoteOnEvent\r
-               NoteOffEvent noteOff;                                                   ///< type == kNoteOffEvent\r
-               DataEvent data;                                                                 ///< type == kDataEvent\r
-               PolyPressureEvent polyPressure;                                 ///< type == kPolyPressureEvent\r
-               NoteExpressionValueEvent noteExpressionValue;   ///< type == kNoteExpressionValueEvent\r
-               NoteExpressionTextEvent noteExpressionText;             ///< type == kNoteExpressionTextEvent\r
-               ChordEvent chord;                                                               ///< type == kChordEvent\r
-               ScaleEvent scale;                                                               ///< type == kScaleEvent\r
-       };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** List of events to process.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-\see ProcessData, Event */\r
-//------------------------------------------------------------------------\r
-class IEventList: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns the count of events. */\r
-       virtual int32 PLUGIN_API getEventCount () = 0;\r
-\r
-       /** Gets parameter by index. */\r
-       virtual tresult PLUGIN_API getEvent (int32 index, Event& e /*out*/) = 0;\r
-\r
-       /** Adds a new event. */\r
-       virtual tresult PLUGIN_API addEvent (Event& e /*in*/) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEventList, 0x3A2C4214, 0x346349FE, 0xB2C4F397, 0xB9695A44)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h
deleted file mode 100644 (file)
index a7109ff..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivsthostapplication.h\r
-// Created by  : Steinberg, 04/2006\r
-// Description : VST Host Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstmessage.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Basic Host Callback Interface.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [passed as 'context' in to IPluginBase::initialize () ]\r
-- [released: 3.0.0]\r
-\r
-Basic VST host application interface. */\r
-//------------------------------------------------------------------------\r
-class IHostApplication: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Gets host application name. */\r
-       virtual tresult PLUGIN_API getName (String128 name) = 0;\r
-\r
-       /** Creates host object (e.g. Vst::IMessage). */\r
-       virtual tresult PLUGIN_API createInstance (TUID cid, TUID _iid, void** obj) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IHostApplication, 0x58E595CC, 0xDB2D4969, 0x8B6AAF8C, 0x36A664E5)\r
-\r
-//------------------------------------------------------------------------\r
-inline IMessage* allocateMessage (IHostApplication* host)\r
-{\r
-       TUID iid;\r
-       IMessage::iid.toTUID (iid);\r
-       IMessage* m = 0;\r
-       if (host->createInstance (iid, iid, (void**)&m) == kResultOk)\r
-               return m;\r
-       return 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** VST 3 to VST 2 Wrapper Interface.\r
-\ingroup vstIHost vst310\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.1.0]\r
-\r
-Informs the Plug-in that a VST 3 to VST 2 wrapper is used between the Plug-in and the real host.\r
-Implemented by the VST 2 Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IVst3ToVst2Wrapper: public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IVst3ToVst2Wrapper, 0x29633AEC, 0x1D1C47E2, 0xBB85B97B, 0xD36EAC61)\r
-\r
-//------------------------------------------------------------------------\r
-/** VST 3 to AU Wrapper Interface.\r
-\ingroup vstIHost vst310\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.1.0]\r
-\r
-Informs the Plug-in that a VST 3 to AU wrapper is used between the Plug-in and the real host.\r
-Implemented by the AU Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IVst3ToAUWrapper: public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IVst3ToAUWrapper, 0xA3B8C6C5, 0xC0954688, 0xB0916F0B, 0xB697AA44)\r
-\r
-//------------------------------------------------------------------------\r
-/** VST 3 to AAX Wrapper Interface.\r
-\ingroup vstIHost vst368\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.6.8]\r
-\r
-Informs the Plug-in that a VST 3 to AAX wrapper is used between the Plug-in and the real host.\r
-Implemented by the AAX Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IVst3ToAAXWrapper : public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IVst3ToAAXWrapper, 0x6D319DC6, 0x60C56242, 0xB32C951B, 0x93BEF4C6)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h
deleted file mode 100644 (file)
index b24df1c..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstinterappaudio.h\r
-// Created by  : Steinberg, 08/2013\r
-// Description : VST InterAppAudio Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-struct ViewRect;\r
-namespace Vst {\r
-struct Event;\r
-class IInterAppAudioPresetManager;\r
-\r
-//------------------------------------------------------------------------\r
-/** Inter-App Audio host Interface.\r
-\ingroup vstIHost vst360\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.6.0]\r
-\r
-Implemented by the InterAppAudio Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IInterAppAudioHost: public FUnknown\r
-{\r
-public:\r
-       /** get the size of the screen\r
-        *      @param size size of the screen\r
-        *      @param scale scale of the screen\r
-        *      @return kResultTrue on success\r
-        */\r
-       virtual tresult PLUGIN_API getScreenSize (ViewRect* size, float* scale) = 0;\r
-\r
-       /** get status of connection\r
-        *      @return kResultTrue if an Inter-App Audio connection is established\r
-        */\r
-       virtual tresult PLUGIN_API connectedToHost () = 0;\r
-\r
-       /** switch to the host.\r
-        *      @return kResultTrue on success\r
-        */\r
-       virtual tresult PLUGIN_API switchToHost () = 0;\r
-\r
-       /** send a remote control event to the host\r
-        *      @param event event type, see AudioUnitRemoteControlEvent in the iOS SDK documentation for possible types\r
-        *      @return kResultTrue on success\r
-        */\r
-       virtual tresult PLUGIN_API sendRemoteControlEvent (uint32 event) = 0;\r
-\r
-       /** ask for the host icon.\r
-        *      @param icon pointer to a CGImageRef\r
-        *      @return kResultTrue on success\r
-        */\r
-       virtual tresult PLUGIN_API getHostIcon (void** icon) = 0;\r
-\r
-       /** schedule an event from the user interface thread\r
-        *      @param event the event to schedule\r
-        *      @return kResultTrue on success\r
-        */\r
-       virtual tresult PLUGIN_API scheduleEventFromUI (Event& event) = 0;\r
-\r
-       /** get the preset manager\r
-        *      @param cid class ID to use by the preset manager\r
-        *      @return the preset manager. Needs to be released by called.\r
-        */\r
-       virtual IInterAppAudioPresetManager* PLUGIN_API createPresetManager (const TUID& cid) = 0;\r
-\r
-       /** show the settings view\r
-        *      currently includes MIDI settings and Tempo setting\r
-        *      @return kResultTrue on success\r
-        */\r
-       virtual tresult PLUGIN_API showSettingsView () = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInterAppAudioHost, 0x0CE5743D, 0x68DF415E, 0xAE285BD4, 0xE2CDC8FD)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for Inter-App Audio connection state change notifications\r
-\ingroup vstIPlug vst360\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.6.0]\r
-*/\r
-//------------------------------------------------------------------------\r
-class IInterAppAudioConnectionNotification : public FUnknown\r
-{\r
-public:\r
-       /** called when the Inter-App Audio connection state changes\r
-        *      @param newState true if an Inter-App Audio connection is established, otherwise false\r
-       */\r
-       virtual void PLUGIN_API onInterAppAudioConnectionStateChange (TBool newState) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInterAppAudioConnectionNotification, 0x6020C72D, 0x5FC24AA1, 0xB0950DB5, 0xD7D6D5CF)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for Inter-App Audio Preset Management\r
-\ingroup vstIPlug vst360\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.6.0]\r
-*/\r
-//------------------------------------------------------------------------\r
-class IInterAppAudioPresetManager : public FUnknown\r
-{\r
-public:\r
-       /** TODO */\r
-       virtual tresult PLUGIN_API runLoadPresetBrowser () = 0;\r
-       /** TODO */\r
-       virtual tresult PLUGIN_API runSavePresetBrowser () = 0;\r
-       /** TODO */\r
-       virtual tresult PLUGIN_API loadNextPreset () = 0;\r
-       /** TODO */\r
-       virtual tresult PLUGIN_API loadPreviousPreset () = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInterAppAudioPresetManager, 0xADE6FCC4, 0x46C94E1D, 0xB3B49A80, 0xC93FEFDD)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h
deleted file mode 100644 (file)
index 85dae3a..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstmessage.h\r
-// Created by  : Steinberg, 04/2005\r
-// Description : VST Message Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstattributes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Private Plug-in message.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [create via IHostApplication::createInstance]\r
-- [released: 3.0.0]\r
-\r
-Messages are sent from a VST-controller component to a VST-editor component and vice versa.\r
-\see IAttributeList, IConnectionPoint, \ref vst3Communication */\r
-//------------------------------------------------------------------------\r
-class IMessage: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns the message ID (for example "TextMessage"). */\r
-       virtual FIDString PLUGIN_API getMessageID () = 0;\r
-\r
-       /** Sets a message ID (for example "TextMessage"). */\r
-       virtual void PLUGIN_API setMessageID (FIDString id /*in*/) = 0;\r
-\r
-       /** Returns the attribute list associated to the message. */\r
-       virtual IAttributeList* PLUGIN_API getAttributes () = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IMessage, 0x936F033B, 0xC6C047DB, 0xBB0882F8, 0x13C1E613)\r
-\r
-//------------------------------------------------------------------------\r
-/** Connect a component with another one.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-This interface is used for the communication of separate components.\r
-Note that some hosts will place a proxy object between the components so that they are not directly connected.\r
-\r
-\see \ref vst3Communication*/\r
-//------------------------------------------------------------------------\r
-class IConnectionPoint: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Connects this instance with another connection point. */\r
-       virtual tresult PLUGIN_API connect (IConnectionPoint* other) = 0;\r
-\r
-       /** Disconnects a given connection point from this. */\r
-       virtual tresult PLUGIN_API disconnect (IConnectionPoint* other) = 0;\r
-\r
-       /** Called when a message has been sent from the connection point to this. */\r
-       virtual tresult PLUGIN_API notify (IMessage* message) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IConnectionPoint, 0x70A4156F, 0x6E6E4026, 0x989148BF, 0xAA60D8D1)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h
deleted file mode 100644 (file)
index da83478..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstmidicontrollers.h\r
-// Created by  : Steinberg, 02/2006\r
-// Description : VST MIDI Controller Enumeration\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Controller Numbers (MIDI) */\r
-//------------------------------------------------------------------------\r
-enum ControllerNumbers\r
-{\r
-       kCtrlBankSelectMSB      =       0,      ///< Bank Select MSB\r
-       kCtrlModWheel           =       1,      ///< Modulation Wheel\r
-       kCtrlBreath                     =       2,      ///< Breath controller\r
-\r
-       kCtrlFoot                       =       4,      ///< Foot Controller\r
-       kCtrlPortaTime          =       5,      ///< Portamento Time\r
-       kCtrlDataEntryMSB       =       6,      ///< Data Entry MSB\r
-       kCtrlVolume                     =       7,      ///< Channel Volume (formerly Main Volume)\r
-       kCtrlBalance            =       8,      ///< Balance\r
-\r
-       kCtrlPan                        =       10,     ///< Pan\r
-       kCtrlExpression         =       11,     ///< Expression\r
-       kCtrlEffect1            =       12,     ///< Effect Control 1\r
-       kCtrlEffect2            =       13,     ///< Effect Control 2\r
-\r
-       //---General Purpose Controllers #1 to #4---\r
-       kCtrlGPC1                       =       16,     ///< General Purpose Controller #1\r
-       kCtrlGPC2                       =       17,     ///< General Purpose Controller #2\r
-       kCtrlGPC3                       =       18,     ///< General Purpose Controller #3\r
-       kCtrlGPC4                       =       19,     ///< General Purpose Controller #4\r
-\r
-       kCtrlBankSelectLSB      =       32,     ///< Bank Select LSB\r
-\r
-       kCtrlDataEntryLSB       =       38,     ///< Data Entry LSB\r
-\r
-       kCtrlSustainOnOff       =       64,     ///< Damper Pedal On/Off (Sustain)\r
-       kCtrlPortaOnOff         =       65,     ///< Portamento On/Off\r
-       kCtrlSustenutoOnOff     =       66,     ///< Sustenuto On/Off\r
-       kCtrlSoftPedalOnOff     =       67,     ///< Soft Pedal On/Off\r
-       kCtrlLegatoFootSwOnOff= 68,     ///< Legato Footswitch On/Off\r
-       kCtrlHold2OnOff         =       69,     ///< Hold 2 On/Off\r
-\r
-       //---Sound Controllers #1 to #10---\r
-       kCtrlSoundVariation     =       70, ///< Sound Variation\r
-       kCtrlFilterCutoff       =       71,     ///< Filter Cutoff (Timbre/Harmonic Intensity)\r
-       kCtrlReleaseTime        =       72,     ///< Release Time\r
-       kCtrlAttackTime         =       73,     ///< Attack Time\r
-       kCtrlFilterResonance=   74,     ///< Filter Resonance (Brightness)\r
-       kCtrlDecayTime          =       75,     ///< Decay Time\r
-       kCtrlVibratoRate        =       76,     ///< Vibrato Rate\r
-       kCtrlVibratoDepth       =       77,     ///< Vibrato Depth\r
-       kCtrlVibratoDelay       =       78,     ///< Vibrato Delay\r
-       kCtrlSoundCtrler10      =       79, ///< undefined\r
-\r
-       //---General Purpose Controllers #5 to #8---\r
-       kCtrlGPC5                       =       80,     ///< General Purpose Controller #5\r
-       kCtrlGPC6                       =       81,     ///< General Purpose Controller #6\r
-       kCtrlGPC7                       =       82,     ///< General Purpose Controller #7\r
-       kCtrlGPC8                       =       83,     ///< General Purpose Controller #8\r
-\r
-       kCtrlPortaControl       =       84,     ///< Portamento Control\r
-\r
-       //---Effect Controllers---\r
-       kCtrlEff1Depth          =       91,     ///< Effect 1 Depth (Reverb Send Level)\r
-       kCtrlEff2Depth          =       92,     ///< Effect 2 Depth\r
-       kCtrlEff3Depth          =       93,     ///< Effect 3 Depth (Chorus Send Level)\r
-       kCtrlEff4Depth          =       94,     ///< Effect 4 Depth (Delay/Variation Level)\r
-       kCtrlEff5Depth          =       95,     ///< Effect 5 Depth\r
-\r
-       kCtrlDataIncrement      =       96,     ///< Data Increment (+1)\r
-       kCtrlDataDecrement      =       97,     ///< Data Decrement (-1)\r
-       kCtrlNRPNSelectLSB      =       98, ///< NRPN Select LSB\r
-       kCtrlNRPNSelectMSB      =       99, ///< NRPN Select MSB\r
-       kCtrlRPNSelectLSB       =       100, ///< RPN Select LSB\r
-       kCtrlRPNSelectMSB       =       101, ///< RPN Select MSB\r
-\r
-       //---Other Channel Mode Messages---\r
-       kCtrlAllSoundsOff       =       120, ///< All Sounds Off\r
-       kCtrlResetAllCtrlers =  121, ///< Reset All Controllers\r
-       kCtrlLocalCtrlOnOff     =       122, ///< Local Control On/Off\r
-       kCtrlAllNotesOff        =       123, ///< All Notes Off\r
-       kCtrlOmniModeOff        =       124, ///< Omni Mode Off + All Notes Off\r
-       kCtrlOmniModeOn         =       125, ///< Omni Mode On  + All Notes Off\r
-       kCtrlPolyModeOnOff      =       126, ///< Poly Mode On/Off + All Sounds Off\r
-       kCtrlPolyModeOn         =       127, ///< Poly Mode On\r
-\r
-       //---Extra--------------------------\r
-       kAfterTouch = 128,                      ///< After Touch\r
-       kPitchBend,                                     ///< Pitch Bend\r
-\r
-       kCountCtrlNumber                        ///< Count of Controller Number\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h
deleted file mode 100644 (file)
index 5033648..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstnoteexpression.h\r
-// Created by  : Steinberg, 10/2010\r
-// Description : VST Note Expression Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-typedef uint32 NoteExpressionTypeID;\r
-typedef double NoteExpressionValue;\r
-\r
-//------------------------------------------------------------------------\r
-/** NoteExpressionTypeIDs describes the type of the note expression.\r
-VST predefines some types like volume, pan, tuning by defining their ranges and curves.\r
-Used by NoteExpressionEvent::typeId and NoteExpressionTypeID::typeId\r
-\see NoteExpressionTypeInfo\r
-*/\r
-enum NoteExpressionTypeIDs\r
-{\r
-       kVolumeTypeID = 0,              ///< Volume, plain range [0 = -oo , 0.25 = 0dB, 0.5 = +6dB, 1 = +12dB]: plain = 20 * log (4 * norm)\r
-       kPanTypeID,                             ///< Panning (L-R), plain range [0 = left, 0.5 = center, 1 = right]\r
-       kTuningTypeID,                  ///< Tuning, plain range [0 = -120.0 (ten octaves down), 0.5 none, 1 = +120.0 (ten octaves up)]\r
-                                                       ///< plain = 240 * (norm - 0.5) and norm = plain / 240 + 0.5\r
-                                                       ///< oneOctave is 12.0 / 240.0; oneHalfTune = 1.0 / 240.0;\r
-       kVibratoTypeID,                 ///< Vibrato\r
-       kExpressionTypeID,              ///< Expression\r
-       kBrightnessTypeID,              ///< Brightness\r
-       kTextTypeID,                    ///< TODO:\r
-       kPhonemeTypeID,                 ///< TODO:\r
-\r
-       kCustomStart = 100000   ///< custom note change type ids must start from here\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a Note Expression Type\r
-This structure is part of the NoteExpressionTypeInfo structure, it describes for given NoteExpressionTypeID its default value\r
-(for example 0.5 for a kTuningTypeID (kIsBipolar: centered)), its minimum and maximum (for predefined NoteExpressionTypeID the full range is predefined too)\r
-and a stepCount when the given NoteExpressionTypeID is limited to discrete values (like on/off state).\r
-\see NoteExpressionTypeInfo\r
-*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionValueDescription\r
-{\r
-       NoteExpressionValue defaultValue;               ///< default normalized value [0,1]\r
-       NoteExpressionValue minimum;                    ///< minimum normalized value [0,1]\r
-       NoteExpressionValue maximum;                    ///< maximum normalized value [0,1]\r
-       int32 stepCount;                                                ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise - see \ref vst3parameterIntro)\r
-};\r
-\r
-#if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64\r
-#include "pluginterfaces/vst/vstpshpack4.h"\r
-#endif\r
-//------------------------------------------------------------------------\r
-/** Note Expression Value event. Used in \ref Event (union)\r
-A note expression event affects one single playing note (referring its noteId).\r
-This kind of event is send from host to the Plug-in like other events (NoteOnEvent, NoteOffEvent,...) in \ref ProcessData during the process call.\r
-Note expression events for a specific noteId can only occur after a NoteOnEvent. The host must take care that the event list (\ref IEventList) is properly sorted.\r
-Expression events are always absolute normalized values [0.0, 1.0].\r
-The predefined types have a predefined mapping of the normalized values (see \ref NoteExpressionTypeIDs)\r
-\sa INoteExpressionController\r
-*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionValueEvent\r
-{\r
-       NoteExpressionTypeID typeId;    ///< see \ref NoteExpressionTypeID\r
-       int32 noteId;                                   ///< associated note identifier to apply the change\r
-\r
-       NoteExpressionValue value;              ///< normalized value [0.0, 1.0].\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Note Expression Text event. Used in Event (union)\r
-A Expression event affects one single playing note. \sa INoteExpressionController\r
-\r
-\see NoteExpressionTypeInfo*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionTextEvent\r
-{\r
-       NoteExpressionTypeID typeId;    ///< see \ref NoteExpressionTypeID (kTextTypeID or kPhoneticTypeID)\r
-       int32 noteId;                                   ///< associated note identifier to apply the change\r
-\r
-       uint32 textLen;                                 ///< the number of characters (TChar) between the beginning of text and the terminating\r
-                                                                       ///< null character (without including the terminating null character itself)\r
-\r
-       const TChar* text;                              ///< UTF-16, null terminated\r
-};\r
-\r
-#if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64\r
-#include "pluginterfaces/base/falignpop.h"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-/** NoteExpressionTypeInfo is the structure describing a note expression supported by the Plug-in.\r
-This structure is used by the method \ref INoteExpressionController::getNoteExpressionInfo.\r
-\see INoteExpressionController\r
-*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionTypeInfo\r
-{\r
-       NoteExpressionTypeID typeId;                    ///< unique identifier of this note Expression type\r
-       String128 title;                                                ///< note Expression type title (e.g. "Volume")\r
-       String128 shortTitle;                                   ///< note Expression type short title (e.g. "Vol")\r
-       String128 units;                                                ///< note Expression type unit (e.g. "dB")\r
-       int32 unitId;                                                   ///< id of unit this NoteExpression belongs to (see \ref vst3UnitsIntro), in order to sort the note expression, it is possible to use unitId like for parameters. -1 means no unit used.\r
-       NoteExpressionValueDescription valueDesc;       ///< value description see \ref NoteExpressionValueDescription\r
-       ParamID associatedParameterId;                  ///< optional associated parameter ID (for mapping from note expression to global (using the parameter automation for example) and back). Only used when kAssociatedParameterIDValid is set in flags.\r
-\r
-       int32 flags;                                                    ///< NoteExpressionTypeFlags (see below)\r
-       enum NoteExpressionTypeFlags\r
-       {\r
-               kIsBipolar              = 1 << 0,                       ///< event is bipolar (centered), otherwise unipolar\r
-               kIsOneShot              = 1 << 1,                       ///< event occurs only one time for its associated note (at begin of the noteOn)\r
-               kIsAbsolute             = 1 << 2,                       ///< This note expression will apply an absolute change to the sound (not relative (offset))\r
-               kAssociatedParameterIDValid     = 1 << 3,///< indicates that the associatedParameterID is valid and could be used\r
-       };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for note expression event support\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-With this Plug-in interface, the host can retrieve all necessary note expression information supported by the Plug-in.\r
-Note expression information (\ref NoteExpressionTypeInfo) are specific for given channel and event bus.\r
-\r
-Note that there is only one NoteExpressionTypeID per given channel of an event bus.\r
-\r
-The method getNoteExpressionStringByValue allows conversion from a normalized value to a string representation\r
-and the getNoteExpressionValueByString method from a string to a normalized value.\r
-\r
-When the note expression state changes (per example when switching presets) the Plug-in needs\r
-to inform the host about it via \ref IComponentHandler::restartComponent (kNoteExpressionChanged).\r
-*/\r
-//------------------------------------------------------------------------\r
-class INoteExpressionController: public FUnknown\r
-{\r
-public:\r
-       /** Returns number of supported note change types for event bus index and channel. */\r
-       virtual int32 PLUGIN_API getNoteExpressionCount (int32 busIndex, int16 channel) = 0;\r
-\r
-       /** Returns note change type info. */\r
-       virtual tresult PLUGIN_API getNoteExpressionInfo (int32 busIndex, int16 channel, int32 noteExpressionIndex, NoteExpressionTypeInfo& info /*out*/) = 0;\r
-\r
-       /** Gets a user readable representation of the normalized note change value. */\r
-       virtual tresult PLUGIN_API getNoteExpressionStringByValue (int32 busIndex, int16 channel, NoteExpressionTypeID id, NoteExpressionValue valueNormalized /*in*/, String128 string /*out*/) = 0;\r
-\r
-       /** Converts the user readable representation to the normalized note change value. */\r
-       virtual tresult PLUGIN_API getNoteExpressionValueByString (int32 busIndex, int16 channel, NoteExpressionTypeID id, const TChar* string /*in*/, NoteExpressionValue& valueNormalized /*out*/) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (INoteExpressionController, 0xB7F8F859, 0x41234872, 0x91169581, 0x4F3721A3)\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-/** KeyswitchTypeIDs describes the type of a key switch\r
-\see KeyswitchInfo\r
-*/\r
-enum KeyswitchTypeIDs\r
-{\r
-       kNoteOnKeyswitchTypeID = 0,                             ///< press before noteOn is played\r
-       kOnTheFlyKeyswitchTypeID,                               ///< press while noteOn is played\r
-       kOnReleaseKeyswitchTypeID,                              ///< press before entering release\r
-       kKeyRangeTypeID                                                 ///< key should be maintained pressed for playing\r
-};\r
-\r
-typedef uint32 KeyswitchTypeID;\r
-\r
-//------------------------------------------------------------------------\r
-/** KeyswitchInfo is the structure describing a key switch\r
-This structure is used by the method \ref IKeyswitchController::getKeyswitchInfo.\r
-\see IKeyswitchController\r
-*/\r
-struct KeyswitchInfo\r
-{\r
-       KeyswitchTypeID typeId;                                 ///< see KeyswitchTypeID\r
-       String128 title;                                                ///< name of key switch (e.g. "Accentuation")\r
-       String128 shortTitle;                                   ///< short title (e.g. "Acc")\r
-\r
-       int32 keyswitchMin;                                             ///< associated main key switch min (value between [0, 127])\r
-       int32 keyswitchMax;                                             ///< associated main key switch max (value between [0, 127])\r
-       int32 keyRemapped;                                              /** optional remapped key switch (default -1), the Plug-in could provide one remapped\r
-                                                                                       key for a key switch (allowing better location on the keyboard of the key switches) */\r
-\r
-       int32 unitId;                                                   ///< id of unit this key switch belongs to (see \ref vst3UnitsIntro), -1 means no unit used.\r
-\r
-       int32 flags;                                                    ///< not yet used (set to 0)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for key switches support\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-When a (instrument) Plug-in supports such interface, the host could get from the Plug-in the current set\r
-of used key switches (megatrig/articulation) for a given channel of a event bus and then automatically use them (like in Cubase 6) to\r
-create VST Expression Map (allowing to associated symbol to a given articulation / key switch).\r
-*/\r
-//------------------------------------------------------------------------\r
-class IKeyswitchController: public FUnknown\r
-{\r
-public:\r
-       /** Returns number of supported key switches for event bus index and channel. */\r
-       virtual int32 PLUGIN_API getKeyswitchCount (int32 busIndex, int16 channel) = 0;\r
-\r
-       /** Returns key switch info. */\r
-       virtual tresult PLUGIN_API getKeyswitchInfo (int32 busIndex, int16 channel, int32 keySwitchIndex, KeyswitchInfo& info /*out*/) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IKeyswitchController, 0x1F2F76D3, 0xBFFB4B96, 0xB99527A5, 0x5EBCCEF4)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h
deleted file mode 100644 (file)
index bea061b..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstparameterchanges.h\r
-// Created by  : Steinberg, 09/2005\r
-// Description : VST Parameter Change Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//----------------------------------------------------------------------\r
-/** Queue of changes for a specific parameter.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-The change queue can be interpreted as segment of an automation curve. For each\r
-processing block a segment with the size of the block is transmitted to the processor.\r
-The curve is expressed as sampling points of a linear approximation of\r
-the original automation curve. If the original already is a linear curve it can\r
-be transmitted precisely. A non-linear curve has to be converted to a linear\r
-approximation by the host. Every point of the value queue defines a linear\r
-section of the curve as a straight line from the previous point of a block to\r
-the new one. So the Plug-in can calculate the value of the curve for any sample\r
-position in the block.\r
-\r
-<b>Implicit Points:</b> \n\r
-In each processing block the section of the curve for each parameter is transmitted.\r
-In order to reduce the amount of points, the point at block position 0 can be omitted.\r
-- If the curve has a slope of 0 over a period of multiple blocks, only one point is\r
-transmitted for the block where the constant curve section starts. The queue for the following\r
-blocks will be empty as long as the curve slope is 0.\r
-- If the curve has a constant slope other than 0 over the period of several blocks, only\r
-the value for the last sample of the block is transmitted. In this case the last valid point\r
-is at block position -1. The processor can calculate the value for each sample in the block\r
-by using a linear interpolation:\r
-\code\r
-double x1 = -1; // position of last point related to current buffer\r
-double y1 = currentParameterValue; // last transmitted value\r
-\r
-int32 pointTime = 0;\r
-ParamValue pointValue = 0;\r
-IParamValueQueue::getPoint (0, pointTime, pointValue);\r
-\r
-double x2 = pointTime;\r
-double y2 = pointValue;\r
-\r
-double slope = (y2 - y1) / (x2 - x1);\r
-double offset = y1 - (slope * x1);\r
-\r
-double curveValue = (slope * bufferTime) + offset; // bufferTime is any position in buffer\r
-\endcode\r
-\r
-<b>Jumps:</b> \n\r
-A jump in the automation curve has to be transmitted as two points: one with the\r
-old value and one with the new value at the next sample position.\r
-\r
-\image html "automation.jpg"\r
-\see IParameterChanges, ProcessData\r
-*/\r
-//----------------------------------------------------------------------\r
-class IParamValueQueue: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns its associated ID. */\r
-       virtual ParamID PLUGIN_API getParameterId () = 0;\r
-\r
-       /** Returns count of points in the queue. */\r
-       virtual int32 PLUGIN_API getPointCount () = 0;\r
-\r
-       /** Gets the value and offset at a given index. */\r
-       virtual tresult PLUGIN_API getPoint (int32 index, int32& sampleOffset /*out*/, ParamValue& value /*out*/) = 0;\r
-\r
-       /** Adds a new value at the end of the queue, its index is returned. */\r
-       virtual tresult PLUGIN_API addPoint (int32 sampleOffset, ParamValue value, int32& index /*out*/) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IParamValueQueue, 0x01263A18, 0xED074F6F, 0x98C9D356, 0x4686F9BA)\r
-\r
-//----------------------------------------------------------------------\r
-/** All parameter changes of a processing block.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-This interface is used to transmit any changes that shall be applied to parameters\r
-in the current processing block. A change can be caused by GUI interaction as\r
-well as automation. They are transmitted as a list of queues (IParamValueQueue)\r
-containing only queues for parameters that actually did change.\r
-\see IParamValueQueue, ProcessData */\r
-//----------------------------------------------------------------------\r
-class IParameterChanges: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns count of Parameter changes in the list. */\r
-       virtual int32 PLUGIN_API getParameterCount () = 0;\r
-\r
-       /** Returns the queue at a given index. */\r
-       virtual IParamValueQueue* PLUGIN_API getParameterData (int32 index) = 0;\r
-\r
-       /** Adds a new parameter queue with a given ID at the end of the list,\r
-       returns it and its index in the parameter changes list. */\r
-       virtual IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id, int32& index /*out*/) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IParameterChanges, 0xA4779663, 0x0BB64A56, 0xB44384A8, 0x466FEB9D)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h
deleted file mode 100644 (file)
index f6d153d..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstplugview.h\r
-// Created by  : Steinberg, 01/2009\r
-// Description : Plug-in User Interface Extension\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-// IParameterFinder Interface\r
-//------------------------------------------------------------------------\r
-/** Extension for IPlugView to find view parameters (lookup value under mouse support)\r
-\ingroup pluginGUI vst302\r
-- [plug imp]\r
-- [extends IPlugView]\r
-- [released: 3.0.2]\r
-\r
-It is highly recommended to implement this interface.\r
-A host can implement important functionality when a plug-in supports this interface.\r
-\r
-For example, all Steinberg hosts require this interface in order to support the "AI Knob".\r
-*/\r
-class IParameterFinder: public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** Find out which parameter in Plug-in view is at given position (relative to Plug-in view). */\r
-       virtual tresult PLUGIN_API findParameter (int32 xPos, int32 yPos, ParamID& resultTag /*out*/) = 0;\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IParameterFinder, 0x0F618302, 0x215D4587, 0xA512073C, 0x77B9D383)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h
deleted file mode 100644 (file)
index 90713eb..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstprefetchablesupport.h\r
-// Created by  : Steinberg, 02/2015\r
-// Description : VST Prefetchable Support Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-#include "pluginterfaces/vst/ivstattributes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-typedef uint32 PrefetchableSupport;\r
-enum ePrefetchableSupport\r
-{\r
-       kIsNeverPrefetchable = 0,       ///< every instance of the plug does not support prefetch processing\r
-       kIsYetPrefetchable,                     ///< in the current state the plug support prefetch processing\r
-       kIsNotYetPrefetchable,          ///< in the current state the plug does not support prefetch processing\r
-       kNumPrefetchableSupport\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// IPrefetchableSupport Interface\r
-//------------------------------------------------------------------------\r
-/** Indicates that the Plug-in could or not support Prefetch (dynamically).\r
-\ingroup vstIPlug vst365\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.6.5]\r
-- [optional]\r
-\r
-The Plug-in should implement this interface if it needs to dynamically change between Prefetchable or not.\r
-By default (without implementing this interface) the host will decide in which mode the Plug-in will be process.\r
-For more info about Prefetch processing mode check ProcessModes::kPrefetch documentation.\r
-\r
-\section IPrefetchableSupportExample Example\r
-\code\r
-tresult PLUGIN_API myPlug::getPrefetchableSupport (PrefetchableSupport& prefetchable)\r
-{\r
-       prefetchable = kIsNeverPrefetchable;\r
-\r
-       switch (myPrefetchableMode)\r
-       {\r
-               case 0: prefetchable = kIsNeverPrefetchable; break;\r
-               case 1: prefetchable = kIsYetPrefetchable; break;\r
-               case 2: prefetchable = kIsNotYetPrefetchable; break;\r
-       }\r
-       return kResultOk;\r
-}\r
-\endcode */\r
-class IPrefetchableSupport : public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** retrieve the current prefetch support. Use IComponentHandler::restartComponent (kPrefetchableSupportChanged)\r
-               to inform the host that this support has changed. */\r
-       virtual tresult PLUGIN_API getPrefetchableSupport (PrefetchableSupport& prefetchable /*out*/) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPrefetchableSupport, 0x8AE54FDA, 0xE93046B9, 0xA28555BC, 0xDC98E21E)\r
-\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h
deleted file mode 100644 (file)
index 1be1f53..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstprocesscontext.h\r
-// Created by  : Steinberg, 10/2005\r
-// Description : VST Processing Context Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Frame Rate */\r
-//------------------------------------------------------------------------\r
-struct FrameRate\r
-{\r
-//------------------------------------------------------------------------\r
-       enum FrameRateFlags\r
-       {\r
-               kPullDownRate = 1 << 0, ///< for ex. HDTV: 23.976 fps with 24 as frame rate\r
-               kDropRate     = 1 << 1  ///< for ex. 29.97 fps drop with 30 as frame rate\r
-       };\r
-//------------------------------------------------------------------------\r
-       uint32 framesPerSecond;         ///< frame rate\r
-       uint32 flags;                           ///< flags #FrameRateFlags\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a chord.\r
-A chord is described with a key note, a root note and the\r
-\copydoc chordMask\r
-\see ProcessContext*/\r
-//------------------------------------------------------------------------\r
-struct Chord\r
-{\r
-//------------------------------------------------------------------------\r
-       uint8 keyNote;          ///< key note in chord\r
-       uint8 rootNote;         ///< lowest note in chord\r
-\r
-       /** Bitmask of a chord.\r
-           1st bit set: minor second; 2nd bit set: major second, and so on. \n\r
-               There is \b no bit for the keynote (root of the chord) because it is inherently always present. \n\r
-               Examples:\r
-               - XXXX 0000 0100 1000 (= 0x0048) -> major chord\n\r
-               - XXXX 0000 0100 0100 (= 0x0044) -> minor chord\n\r
-               - XXXX 0010 0100 0100 (= 0x0244) -> minor chord with minor seventh  */\r
-       int16 chordMask;\r
-\r
-       enum Masks {\r
-               kChordMask = 0x0FFF,    ///< mask for chordMask\r
-               kReservedMask = 0xF000  ///< reserved for future use\r
-       };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Audio processing context.\r
-For each processing block the host provides timing information and\r
-musical parameters that can change over time. For a host that supports jumps\r
-(like cycle) it is possible to split up a processing block into multiple parts in\r
-order to provide a correct project time inside of every block, but this behaviour\r
-is not mandatory. Since the timing will be correct at the beginning of the next block\r
-again, a host that is dependent on a fixed processing block size can choose to neglect\r
-this problem.\r
-\see IAudioProcessor, ProcessData*/\r
-//------------------------------------------------------------------------\r
-struct ProcessContext\r
-{\r
-//------------------------------------------------------------------------\r
-       /** Transport state & other flags */\r
-       enum StatesAndFlags\r
-       {\r
-               kPlaying          = 1 << 1,             ///< currently playing\r
-               kCycleActive      = 1 << 2,             ///< cycle is active\r
-               kRecording        = 1 << 3,             ///< currently recording\r
-\r
-               kSystemTimeValid  = 1 << 8,             ///< systemTime contains valid information\r
-               kContTimeValid    = 1 << 17,    ///< continousTimeSamples contains valid information\r
-\r
-               kProjectTimeMusicValid = 1 << 9,///< projectTimeMusic contains valid information\r
-               kBarPositionValid = 1 << 11,    ///< barPositionMusic contains valid information\r
-               kCycleValid       = 1 << 12,    ///< cycleStartMusic and barPositionMusic contain valid information\r
-\r
-               kTempoValid       = 1 << 10,    ///< tempo contains valid information\r
-               kTimeSigValid     = 1 << 13,    ///< timeSigNumerator and timeSigDenominator contain valid information\r
-               kChordValid       = 1 << 18,    ///< chord contains valid information\r
-\r
-               kSmpteValid       = 1 << 14,    ///< smpteOffset and frameRate contain valid information\r
-               kClockValid       = 1 << 15             ///< samplesToNextClock valid\r
-       };\r
-\r
-       uint32 state;                                   ///< a combination of the values from \ref StatesAndFlags\r
-\r
-       double sampleRate;                              ///< current sample rate (always valid)\r
-       TSamples projectTimeSamples;    ///< project time in samples (always valid)\r
-\r
-       int64 systemTime;                               ///< system time in nanoseconds (optional)\r
-       TSamples continousTimeSamples;  ///< project time, without loop (optional)\r
-\r
-       TQuarterNotes projectTimeMusic; ///< musical position in quarter notes (1.0 equals 1 quarter note)\r
-       TQuarterNotes barPositionMusic; ///< last bar start position, in quarter notes\r
-       TQuarterNotes cycleStartMusic;  ///< cycle start in quarter notes\r
-       TQuarterNotes cycleEndMusic;    ///< cycle end in quarter notes\r
-\r
-       double tempo;                                   ///< tempo in BPM (Beats Per Minute)\r
-       int32 timeSigNumerator;                 ///< time signature numerator (e.g. 3 for 3/4)\r
-       int32 timeSigDenominator;               ///< time signature denominator (e.g. 4 for 3/4)\r
-\r
-       Chord chord;                                    ///< musical info\r
-\r
-       int32 smpteOffsetSubframes;             ///< SMPTE (sync) offset in subframes (1/80 of frame)\r
-       FrameRate frameRate;                    ///< frame rate\r
-\r
-       int32 samplesToNextClock;               ///< MIDI Clock Resolution (24 Per Quarter Note), can be negative (nearest)\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h
deleted file mode 100644 (file)
index b3ed1bf..0000000
+++ /dev/null
@@ -1,372 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstrepresentation.h\r
-// Created by  : Steinberg, 08/2010\r
-// Description : VST Representation Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-class IBStream;\r
-\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** RepresentationInfo is the structure describing a representation\r
-This structure is used in the function \see IXmlRepresentationController::getXmlRepresentationStream.\r
-\see IXmlRepresentationController\r
-*/\r
-struct RepresentationInfo\r
-{\r
-       RepresentationInfo ()\r
-       {\r
-               memset (vendor, 0, kNameSize);\r
-               memset (name, 0, kNameSize);\r
-               memset (version, 0, kNameSize);\r
-               memset (host, 0, kNameSize);\r
-       }\r
-\r
-       RepresentationInfo (char8* _vendor, char8* _name = 0, char8* _version = 0, char8* _host = 0)\r
-       {\r
-               memset (vendor, 0, kNameSize);\r
-               if (_vendor)\r
-                       strcpy (vendor, _vendor);\r
-               memset (name, 0, kNameSize);\r
-               if (_name)\r
-                       strcpy (name, _name);\r
-               memset (version, 0, kNameSize);\r
-               if (_version)\r
-                       strcpy (version, _version);\r
-               memset (host, 0, kNameSize);\r
-               if (_host)\r
-                       strcpy (host, _host);\r
-       }\r
-\r
-       enum\r
-       {\r
-               kNameSize = 64\r
-       };\r
-       char8 vendor[kNameSize];        ///< Vendor name of the associated representation (remote) (eg. "Yamaha").\r
-       char8 name[kNameSize];          ///< Representation (remote) Name (eg. "O2").\r
-       char8 version[kNameSize];       ///< Version of this "Remote" (eg. "1.0").\r
-       char8 host[kNameSize];          ///< Optional: used if the representation is for a given host only (eg. "Nuendo").\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for a component.\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-A Representation based on XML is a way to export and structure, group Plug-ins parameters for a specific remote (could be hardware or software rack (like quickcontrols)).\r
-\n\r
-It allows to describe more precisely each parameter (what is the best matching to a knob, different titles lengths matching limited remote display,...).\n See an \ref Example.\r
- \n\n\r
-- A Representation is composed of Pages (this means that to see all exported parameters the user has to navigate through the pages).\r
-- A Page is composed of Cells (for example 8 Cells per page).\r
-- A Cell is composed of Layers (for example a cell could have a knob, a display and a button which are 3 Layers).\r
-- A Layer is associated to a Plug-in parameter using the ParameterID as identifier:\r
-       - it could be a knob with a display for Title and/or value, this display uses the same parameterId, but it could an another one.\r
-       - Switch\r
-       - link which allows to jump directly to a subpage (an another page)\r
-       - more... See Vst::LayerType\r
-.\r
-\r
-\n\r
-This Representation is implemented as XML text following the Document Type Definition (DTD): http://dtd.steinberg.net/VST-Remote-1.1.dtd\r
-\r
-\section Example\r
-Here an example of what should be passed in the stream of getXmlRepresentationStream:\r
-\r
-\code\r
-<?xml version="1.0" encoding="utf-8"?>\r
-<!DOCTYPE vstXML PUBLIC "-//Steinberg//DTD VST Remote 1.1//EN" "http://dtd.steinberg.net/VST-Remote-1.1.dtd">\r
-<vstXML version="1.0">\r
-       <plugin classID="341FC5898AAA46A7A506BC0799E882AE" name="Chorus" vendor="Steinberg Media Technologies" />\r
-       <originator>My name</originator>\r
-       <date>2010-12-31</date>\r
-       <comment>This is an example for 4 Cells per Page for the Remote named ProductRemote\r
-                from company HardwareCompany.</comment>\r
-\r
-       <!-- ===================================== -->\r
-       <representation name="ProductRemote" vendor="HardwareCompany" version="1.0">\r
-               <page name="Root">\r
-                       <cell>\r
-                               <layer type="knob" parameterID="0">\r
-                                       <titleDisplay>\r
-                                               <name>Mix dry/wet</name>\r
-                                               <name>Mix</name>\r
-                                       </titleDisplay>\r
-                               </layer>\r
-                       </cell>\r
-                       <cell>\r
-                               <layer type="display"></layer>\r
-                       </cell>\r
-                       <cell>\r
-                               <layer type="knob" parameterID="3">\r
-                                       <titleDisplay>\r
-                                               <name>Delay</name>\r
-                                               <name>Dly</name>\r
-                                       </titleDisplay>\r
-                               </layer>\r
-                       </cell>\r
-                       <cell>\r
-                               <layer type="knob" parameterID="15">\r
-                                       <titleDisplay>\r
-                                               <name>Spatial</name>\r
-                                               <name>Spat</name>\r
-                                       </titleDisplay>\r
-                               </layer>\r
-                       </cell>\r
-               </page>\r
-               <page name="Page 2">\r
-                       <cell>\r
-                               <layer type="LED" ledStyle="spread" parameterID="2">\r
-                                       <titleDisplay>\r
-                                               <name>Width +</name>\r
-                                               <name>Widt</name>\r
-                                       </titleDisplay>\r
-                               </layer>\r
-                               <!--this is the switch for shape A/B-->\r
-                               <layer type="switch" switchStyle="pushIncLooped" parameterID="4"></layer>\r
-                       </cell>\r
-                       <cell>\r
-                               <layer type="display"></layer>\r
-                       </cell>\r
-                       <cell>\r
-                               <layer type="LED" ledStyle="singleDot" parameterID="17">\r
-                                       <titleDisplay>\r
-                                               <name>Sync Note +</name>\r
-                                               <name>Note</name>\r
-                                       </titleDisplay>\r
-                               </layer>\r
-                               <!--this is the switch for sync to tempo on /off-->\r
-                               <layer type="switch" switchStyle="pushIncLooped" parameterID="16"></layer>\r
-                       </cell>\r
-                       <cell>\r
-                               <layer type="knob" parameterID="1">\r
-                                       <titleDisplay>\r
-                                               <name>Rate</name>\r
-                                       </titleDisplay>\r
-                               </layer>\r
-                       </cell>\r
-               </page>\r
-       </representation>\r
-</vstXML>\r
-\endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-class IXmlRepresentationController: public FUnknown\r
-{\r
-public:\r
-       /** Retrieves a stream containing a XmlRepresentation for a wanted representation info */\r
-       virtual tresult PLUGIN_API getXmlRepresentationStream (RepresentationInfo& info /*in*/, IBStream* stream /*out*/) = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IXmlRepresentationController, 0xA81A0471, 0x48C34DC4, 0xAC30C9E1, 0x3C8393D5)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Defines for XML representation Tags and Attributes */\r
-\r
-#define ROOTXML_TAG                    "vstXML"\r
-\r
-#define COMMENT_TAG                    "comment"\r
-#define CELL_TAG                       "cell"\r
-#define CELLGROUP_TAG          "cellGroup"\r
-#define CELLGROUPTEMPLATE_TAG  "cellGroupTemplate"\r
-#define CURVE_TAG                      "curve"\r
-#define CURVETEMPLATE_TAG      "curveTemplate"\r
-#define DATE_TAG                       "date"\r
-#define LAYER_TAG                      "layer"\r
-#define NAME_TAG                       "name"\r
-#define ORIGINATOR_TAG         "originator"\r
-#define PAGE_TAG                       "page"\r
-#define PAGETEMPLATE_TAG       "pageTemplate"\r
-#define PLUGIN_TAG                     "plugin"\r
-#define VALUE_TAG                      "value"\r
-#define VALUEDISPLAY_TAG       "valueDisplay"\r
-#define VALUELIST_TAG          "valueList"\r
-#define REPRESENTATION_TAG     "representation"\r
-#define SEGMENT_TAG                    "segment"\r
-#define SEGMENTLIST_TAG                "segmentList"\r
-#define TITLEDISPLAY_TAG       "titleDisplay"\r
-\r
-#define ATTR_CATEGORY          "category"\r
-#define ATTR_CLASSID           "classID"\r
-#define ATTR_ENDPOINT          "endPoint"\r
-#define ATTR_INDEX                     "index"\r
-#define ATTR_FLAGS                     "flags"\r
-#define ATTR_FUNCTION          "function"\r
-#define ATTR_HOST                      "host"\r
-#define ATTR_LEDSTYLE          "ledStyle"\r
-#define ATTR_LENGTH                    "length"\r
-#define ATTR_LINKEDTO          "linkedTo"\r
-#define ATTR_NAME                      "name"\r
-#define ATTR_ORDER                     "order"\r
-#define ATTR_PAGE                      "page"\r
-#define ATTR_PARAMID           "parameterID"\r
-#define ATTR_STARTPOINT                "startPoint"\r
-#define ATTR_STYLE                     "style"\r
-#define ATTR_SWITCHSTYLE       "switchStyle"\r
-#define ATTR_TEMPLATE          "template"\r
-#define ATTR_TURNSPERFULLRANGE "turnsPerFullRange"\r
-#define ATTR_TYPE                      "type"\r
-#define ATTR_UNITID                    "unitID"\r
-#define ATTR_VARIABLES         "variables"\r
-#define ATTR_VENDOR                    "vendor"\r
-#define ATTR_VERSION           "version"\r
-\r
-//------------------------------------------------------------------------\r
-/** Defines some predefined Representation Remote Names */\r
-#define GENERIC                                "Generic"\r
-#define GENERIC_4_CELLS                        "Generic 4 Cells"\r
-#define GENERIC_8_CELLS                        "Generic 8 Cells"\r
-#define GENERIC_12_CELLS               "Generic 12 Cells"\r
-#define GENERIC_24_CELLS               "Generic 24 Cells"\r
-#define GENERIC_N_CELLS                        "Generic %d Cells"\r
-#define QUICK_CONTROL_8_CELLS  "Quick Controls 8 Cells"\r
-\r
-//------------------------------------------------------------------------\r
-/** Layer Types used in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace LayerType\r
-{\r
-       enum\r
-       {\r
-               kKnob = 0,              ///< a knob (encoder or not)\r
-               kPressedKnob,   ///< a knob which is used by pressing and turning\r
-               kSwitchKnob,    ///< knob could be pressed to simulate a switch\r
-               kSwitch,                ///< a "on/off" button\r
-               kLED,                   ///< LED like VU-meter or display around a knob\r
-               kLink,                  ///< indicates that this layer is a folder linked to an another INode (page)\r
-               kDisplay,               ///< only for text display (not really a control)\r
-               kFader,                 ///< a fader\r
-               kEndOfLayerType\r
-       };\r
-\r
-       /** FIDString variant of the LayerType */\r
-       static const FIDString layerTypeFIDString[] = {\r
-               "knob"\r
-               ,"pressedKnob"\r
-               ,"switchKnob"\r
-               ,"switch"\r
-               ,"LED"\r
-               ,"link"\r
-               ,"display"\r
-               ,"fader"\r
-               ,0\r
-       };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Curve Types used in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace CurveType\r
-{\r
-       const CString kSegment          = "segment";    ///<\r
-       const CString kValueList        = "valueList";  ///<\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes used to defined a Layer in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace Attributes\r
-{\r
-       const CString kStyle            = ATTR_STYLE;                   ///< string attribute : See AttributesStyle for available string value\r
-       const CString kLEDStyle         = ATTR_LEDSTYLE;                ///< string attribute : See AttributesStyle for available string value\r
-       const CString kSwitchStyle      = ATTR_SWITCHSTYLE;             ///< string attribute : See AttributesStyle for available string value\r
-       const CString kKnobTurnsPerFullRange = ATTR_TURNSPERFULLRANGE;  ///< float attribute\r
-       const CString kFunction         = ATTR_FUNCTION;                ///< string attribute : See AttributesFunction for available string value\r
-       const CString kFlags            = ATTR_FLAGS;                   ///< string attribute : See AttributesFlags for available string value\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes Function used to defined the function of a Layer in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace AttributesFunction\r
-{\r
-       /// Global Style\r
-       const CString kPanPosCenterXFunc                = "PanPosCenterX";              ///< Gravity point X-axis (L-R) (for stereo: middle between left and right)\r
-       const CString kPanPosCenterYFunc                = "PanPosCenterY";              ///< Gravity point Y-axis (Front-Rear)\r
-       const CString kPanPosFrontLeftXFunc             = "PanPosFrontLeftX";   ///< Left channel Position in X-axis\r
-       const CString kPanPosFrontLeftYFunc             = "PanPosFrontLeftY";   ///< Left channel Position in Y-axis\r
-       const CString kPanPosFrontRightXFunc    = "PanPosFrontRightX";  ///< Right channel Position in X-axis\r
-       const CString kPanPosFrontRightYFunc    = "PanPosFrontRightY";  ///< Right channel Position in Y-axis\r
-       const CString kPanRotationFunc                  = "PanRotation";                ///< Rotation around the Center (gravity point)\r
-       const CString kPanLawFunc                               = "PanLaw";                             ///< Panning Law\r
-       const CString kPanMirrorModeFunc                = "PanMirrorMode";              ///< Panning Mirror Mode\r
-       const CString kPanLfeGainFunc                   = "PanLfeGain";                 ///< Panning LFE Gain\r
-       const CString kGainReductionFunc                = "GainReduction";              ///< Gain Reduction for compressor\r
-       const CString kSoloFunc                                 = "Solo";                               ///< Solo\r
-       const CString kMuteFunc                                 = "Mute";                               ///< Mute\r
-       const CString kVolumeFunc                               = "Volume";                             ///< Volume\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes Style associated a specific Layer Type in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace AttributesStyle\r
-{\r
-       /// Global Style\r
-       const CString kInverseStyle                     = "inverse";    ///< the associated layer should use the inverse value of parameter (1 - x).\r
-\r
-       /// LED Style\r
-       const CString kLEDWrapLeftStyle         = "wrapLeft";   ///< |======>----- (the default one if not specified)\r
-       const CString kLEDWrapRightStyle        = "wrapRight";  ///< -------<====|\r
-       const CString kLEDSpreadStyle           = "spread";             ///< ---<==|==>---\r
-       const CString kLEDBoostCutStyle         = "boostCut";   ///< ------|===>--\r
-       const CString kLEDSingleDotStyle        = "singleDot";  ///< --------|----\r
-\r
-       /// Switch Style\r
-       const CString kSwitchPushStyle          = "push";               ///< Apply only when pressed, unpressed will reset the value to min.\r
-       const CString kSwitchPushIncLoopedStyle = "pushIncLooped";      ///< Push will increment the value. When the max is reached it will restart with min.\r
-                                                                                                                               ///< The default one if not specified (with 2 states values it is a OnOff switch).\r
-       const CString kSwitchPushDecLoopedStyle = "pushDecLooped";      ///< Push will decrement the value. When the min is reached it will restart with max.\r
-       const CString kSwitchPushIncStyle       = "pushInc";    ///< Increment after each press (delta depends of the curve).\r
-       const CString kSwitchPushDecStyle       = "pushDec";    ///< Decrement after each press (delta depends of the curve).\r
-       const CString kSwitchLatchStyle         = "latch";              ///< Each push-release will change the value between min and max.\r
-                                                                                                               ///< A timeout between push and release could be used to simulate a push style (if timeout is reached).\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes Flags defining a Layer in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace AttributesFlags\r
-{\r
-       const CString kHideableFlag                     = "hideable";   ///< the associated layer marked as hideable allows a remote to hide or make it not usable a parameter when the associated value is inactive\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h
deleted file mode 100644 (file)
index 3638355..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/ivstunits.h\r
-// Created by  : Steinberg, 2005\r
-// Description : VST Units Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Special UnitIDs for UnitInfo */\r
-static const UnitID kRootUnitId        = 0;        ///< identifier for the top level unit (root)\r
-static const UnitID kNoParentUnitId = -1;      ///< used for the root unit which doesn't have a parent.\r
-\r
-//------------------------------------------------------------------------\r
-/** Special ProgramListIDs for UnitInfo */\r
-static const ProgramListID kNoProgramListId = -1;      ///< no programs are used in the unit.\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Unit Description.\r
-\see IUnitInfo */\r
-//------------------------------------------------------------------------\r
-struct UnitInfo\r
-{\r
-       UnitID id;                                              ///< unit identifier\r
-       UnitID parentUnitId;                    ///< identifier of parent unit (kNoParentUnitId: does not apply, this unit is the root)\r
-       String128 name;                                 ///< name, optional for the root component, required otherwise\r
-       ProgramListID programListId;    ///< id of program list used in unit (kNoProgramListId = no programs used in this unit)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Program List Description.\r
-\see IUnitInfo */\r
-//------------------------------------------------------------------------\r
-struct ProgramListInfo\r
-{\r
-       ProgramListID id;                               ///< program list identifier\r
-       String128 name;                                 ///< name of program list\r
-       int32 programCount;                             ///< number of programs in this list\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Special programIndex value for IUnitHandler::notifyProgramListChange */\r
-static const int32 kAllProgramInvalid =        -1;             ///< all program information is invalid\r
-\r
-//------------------------------------------------------------------------\r
-/** Host callback for unit support.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.0.0]\r
-\r
-Host callback interface, used with IUnitInfo.\r
-Retrieve via queryInterface from IComponentHandler.\r
-\r
-\see \ref vst3Units, IUnitInfo */\r
-//------------------------------------------------------------------------\r
-class IUnitHandler: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Notify host when a module is selected in Plug-in GUI. */\r
-       virtual tresult PLUGIN_API notifyUnitSelection (UnitID unitId) = 0;\r
-\r
-       /** Tell host that the Plug-in controller changed a program list (rename, load, PitchName changes).\r
-           \param listId is the specified program list ID to inform.\r
-               \param programIndex : when kAllProgramInvalid, all program information is invalid, otherwise only the program of given index. */\r
-       virtual tresult PLUGIN_API notifyProgramListChange (ProgramListID listId, int32 programIndex) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitHandler, 0x4B5147F8, 0x4654486B, 0x8DAB30BA, 0x163A3C56)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Host callback for extended unit support.\r
-\ingroup vstIHost vst365\r
-- [host imp]\r
-- [extends IUnitHandler]\r
-- [released: 3.6.5]\r
-\r
-Host callback interface, used with IUnitInfo.\r
-Retrieve via queryInterface from IComponentHandler.\r
-\r
-\see \ref vst3Units, IUnitHandler */\r
-//------------------------------------------------------------------------\r
-class IUnitHandler2 : public FUnknown\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       /** Tell host that assignment Unit-Bus defined by IUnitInfo::getUnitByBus has changed. */\r
-       virtual tresult PLUGIN_API notifyUnitByBusChange () = 0;\r
-\r
-       //------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitHandler2, 0xF89F8CDF, 0x699E4BA5, 0x96AAC9A4, 0x81452B01)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Edit controller extension to describe the Plug-in structure.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.0.0]\r
-\r
-IUnitInfo describes the internal structure of the Plug-in.\r
-- The root unit is the component itself, so getUnitCount must return 1 at least.\r
-- The root unit id has to be 0 (kRootUnitId).\r
-- Each unit can reference one program list - this reference must not change.\r
-- Each unit using a program list, references one program of the list.\r
-\r
-\see \ref vst3Units, IUnitHandler */\r
-//------------------------------------------------------------------------\r
-class IUnitInfo: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns the flat count of units. */\r
-       virtual int32 PLUGIN_API getUnitCount () = 0;\r
-\r
-       /** Gets UnitInfo for a given index in the flat list of unit. */\r
-       virtual tresult PLUGIN_API getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/) = 0;\r
-\r
-       /** Component intern program structure. */\r
-       /** Gets the count of Program List. */\r
-       virtual int32 PLUGIN_API getProgramListCount () = 0;\r
-\r
-       /** Gets for a given index the Program List Info. */\r
-       virtual tresult PLUGIN_API getProgramListInfo (int32 listIndex, ProgramListInfo& info /*out*/) = 0;\r
-\r
-       /** Gets for a given program list ID and program index its program name. */\r
-       virtual tresult PLUGIN_API getProgramName (ProgramListID listId, int32 programIndex, String128 name /*out*/) = 0;\r
-\r
-       /** Gets for a given program list ID, program index and attributeId the associated attribute value. */\r
-       virtual tresult PLUGIN_API getProgramInfo (ProgramListID listId, int32 programIndex,\r
-               CString attributeId /*in*/, String128 attributeValue /*out*/) = 0;\r
-\r
-       /** Returns kResultTrue if the given program index of a given program list ID supports PitchNames. */\r
-       virtual tresult PLUGIN_API hasProgramPitchNames (ProgramListID listId, int32 programIndex) = 0;\r
-\r
-       /** Gets the PitchName for a given program list ID, program index and pitch.\r
-               If PitchNames are changed the Plug-in should inform the host with IUnitHandler::notifyProgramListChange. */\r
-       virtual tresult PLUGIN_API getProgramPitchName (ProgramListID listId, int32 programIndex,\r
-               int16 midiPitch, String128 name /*out*/) = 0;\r
-\r
-       // units selection --------------------\r
-       /** Gets the current selected unit. */\r
-       virtual UnitID PLUGIN_API getSelectedUnit () = 0;\r
-\r
-       /** Sets a new selected unit. */\r
-       virtual tresult PLUGIN_API selectUnit (UnitID unitId) = 0;\r
-\r
-       /** Gets the according unit if there is an unambiguous relation between a channel or a bus and a unit.\r
-           This method mainly is intended to find out which unit is related to a given MIDI input channel. */\r
-       virtual tresult PLUGIN_API getUnitByBus (MediaType type, BusDirection dir, int32 busIndex,\r
-               int32 channel, UnitID& unitId /*out*/) = 0;\r
-\r
-       /** Receives a preset data stream.\r
-           - If the component supports program list data (IProgramListData), the destination of the data\r
-                 stream is the program specified by list-Id and program index (first and second parameter)\r
-               - If the component supports unit data (IUnitData), the destination is the unit specified by the first\r
-                 parameter - in this case parameter programIndex is < 0). */\r
-       virtual tresult PLUGIN_API setUnitProgramData (int32 listOrUnitId, int32 programIndex, IBStream* data) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitInfo, 0x3D4BD6B5, 0x913A4FD2, 0xA886E768, 0xA5EB92C1)\r
-\r
-//------------------------------------------------------------------------\r
-/** Component extension to access program list data.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.0.0]\r
-\r
-A component can either support program list data via this interface or\r
-unit preset data (IUnitData), but not both!\r
-\r
-\see \ref vst3UnitPrograms */\r
-//------------------------------------------------------------------------\r
-class IProgramListData: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns kResultTrue if the given Program List ID supports Program Data. */\r
-       virtual tresult PLUGIN_API programDataSupported (ProgramListID listId) = 0;\r
-\r
-       /** Gets for a given program list ID and program index the program Data. */\r
-       virtual tresult PLUGIN_API getProgramData (ProgramListID listId, int32 programIndex, IBStream* data) = 0;\r
-\r
-       /** Sets for a given program list ID and program index a program Data. */\r
-       virtual tresult PLUGIN_API setProgramData (ProgramListID listId, int32 programIndex, IBStream* data) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IProgramListData, 0x8683B01F, 0x7B354F70, 0xA2651DEC, 0x353AF4FF)\r
-\r
-//------------------------------------------------------------------------\r
-/** Component extension to access unit data.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.0.0]\r
-\r
-A component can either support unit preset data via this interface or\r
-program list data (IProgramListData), but not both!\r
-\r
-\see \ref vst3UnitPrograms */\r
-//------------------------------------------------------------------------\r
-class IUnitData: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Returns kResultTrue if the specified unit supports export and import of preset data. */\r
-       virtual tresult PLUGIN_API unitDataSupported (UnitID unitID) = 0;\r
-\r
-       /** Gets the preset data for the specified unit. */\r
-       virtual tresult PLUGIN_API getUnitData (UnitID unitId, IBStream* data) = 0;\r
-\r
-       /** Sets the preset data for the specified unit. */\r
-       virtual tresult PLUGIN_API setUnitData (UnitID unitId, IBStream* data) = 0;\r
-\r
-//------------------------------------------------------------------------\r
-       static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitData, 0x6C389611, 0xD391455D, 0xB870B833, 0x94A0EFDD)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h
deleted file mode 100644 (file)
index 0f00f30..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-// Version     : 3.6.7\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/vstpshpack4.h\r
-// Created by  : Steinberg, 05/2010\r
-// Description : This file turns 4 Bytes packing of structures on. The file\r
-//               pluginterfaces/base/falignpop.h is the complement to this file.\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-//----------------------------------------------------------------------------------------------\r
-#if defined __BORLANDC__\r
-       #pragma -a4\r
-#else\r
-       #if (_MSC_VER >= 800 && !defined(_M_I86)) || defined(_PUSHPOP_SUPPORTED)\r
-               #pragma warning(disable:4103)\r
-       #endif\r
-\r
-       #pragma pack(push)\r
-       #pragma pack(4)\r
-#endif\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h
deleted file mode 100644 (file)
index fd553c0..0000000
+++ /dev/null
@@ -1,812 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/vstspeaker.h\r
-// Created by  : Steinberg, 01/2019\r
-// Description : common defines\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-#include "vsttypes.h"\r
-\r
-//#include "pluginterfaces/base/ftype.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** \defgroup speakerArrangements Speaker Arrangements\r
-\image html "vst3_speaker_types.jpg"\r
-\n\r
-A SpeakerArrangement is a bitset combination of speakers. For example:\r
-\code\r
-const SpeakerArrangement kStereo = kSpeakerL | kSpeakerR; // => hex: 0x03 / binary: 0011.\r
-\endcode*/\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Definitions.\r
-\ingroup speakerArrangements */\r
-//------------------------------------------------------------------------\r
-/**@{*/\r
-const Speaker kSpeakerL    = 1 << 0;           ///< Left (L)\r
-const Speaker kSpeakerR    = 1 << 1;           ///< Right (R)\r
-const Speaker kSpeakerC    = 1 << 2;           ///< Center (C)\r
-const Speaker kSpeakerLfe  = 1 << 3;           ///< Subbass (Lfe)\r
-const Speaker kSpeakerLs   = 1 << 4;           ///< Left Surround (Ls)\r
-const Speaker kSpeakerRs   = 1 << 5;           ///< Right Surround (Rs)\r
-const Speaker kSpeakerLc   = 1 << 6;           ///< Left of Center (Lc) - Front Left Center\r
-const Speaker kSpeakerRc   = 1 << 7;           ///< Right of Center (Rc) - Front Right Center\r
-const Speaker kSpeakerS    = 1 << 8;           ///< Surround (S)\r
-const Speaker kSpeakerCs   = kSpeakerS;                ///< Center of Surround (Cs) - Back Center - Surround (S)\r
-const Speaker kSpeakerSl   = 1 << 9;           ///< Side Left (Sl)\r
-const Speaker kSpeakerSr   = 1 << 10;          ///< Side Right (Sr)\r
-const Speaker kSpeakerTc   = 1 << 11;          ///< Top Center Over-head, Top Middle (Tc)\r
-const Speaker kSpeakerTfl  = 1 << 12;          ///< Top Front Left (Tfl)\r
-const Speaker kSpeakerTfc  = 1 << 13;          ///< Top Front Center (Tfc)\r
-const Speaker kSpeakerTfr  = 1 << 14;          ///< Top Front Right (Tfr)\r
-const Speaker kSpeakerTrl  = 1 << 15;          ///< Top Rear/Back Left (Trl)\r
-const Speaker kSpeakerTrc  = 1 << 16;          ///< Top Rear/Back Center (Trc)\r
-const Speaker kSpeakerTrr  = 1 << 17;          ///< Top Rear/Back Right (Trr)\r
-const Speaker kSpeakerLfe2 = 1 << 18;          ///< Subbass 2 (Lfe2)\r
-const Speaker kSpeakerM    = 1 << 19;          ///< Mono (M)\r
-\r
-const Speaker kSpeakerACN0  = (Speaker)1 << 20;        ///< Ambisonic ACN 0\r
-const Speaker kSpeakerACN1  = (Speaker)1 << 21;        ///< Ambisonic ACN 1\r
-const Speaker kSpeakerACN2  = (Speaker)1 << 22;        ///< Ambisonic ACN 2\r
-const Speaker kSpeakerACN3  = (Speaker)1 << 23;        ///< Ambisonic ACN 3\r
-const Speaker kSpeakerACN4  = (Speaker)1 << 38;        ///< Ambisonic ACN 4\r
-const Speaker kSpeakerACN5  = (Speaker)1 << 39;        ///< Ambisonic ACN 5\r
-const Speaker kSpeakerACN6  = (Speaker)1 << 40;        ///< Ambisonic ACN 6\r
-const Speaker kSpeakerACN7  = (Speaker)1 << 41;        ///< Ambisonic ACN 7\r
-const Speaker kSpeakerACN8  = (Speaker)1 << 42;        ///< Ambisonic ACN 8\r
-const Speaker kSpeakerACN9  = (Speaker)1 << 43;        ///< Ambisonic ACN 9\r
-const Speaker kSpeakerACN10 = (Speaker)1 << 44;        ///< Ambisonic ACN 10\r
-const Speaker kSpeakerACN11 = (Speaker)1 << 45;        ///< Ambisonic ACN 11\r
-const Speaker kSpeakerACN12 = (Speaker)1 << 46;        ///< Ambisonic ACN 12\r
-const Speaker kSpeakerACN13 = (Speaker)1 << 47;        ///< Ambisonic ACN 13\r
-const Speaker kSpeakerACN14 = (Speaker)1 << 48;        ///< Ambisonic ACN 14\r
-const Speaker kSpeakerACN15 = (Speaker)1 << 49;        ///< Ambisonic ACN 15\r
-\r
-const Speaker kSpeakerTsl = 1 << 24;           ///< Top Side Left (Tsl)\r
-const Speaker kSpeakerTsr = 1 << 25;           ///< Top Side Right (Tsr)\r
-const Speaker kSpeakerLcs = 1 << 26;           ///< Left of Center Surround (Lcs) - Back Left Center\r
-const Speaker kSpeakerRcs = 1 << 27;           ///< Right of Center Surround (Rcs) - Back Right Center\r
-\r
-const Speaker kSpeakerBfl = 1 << 28;           ///< Bottom Front Left (Bfl)\r
-const Speaker kSpeakerBfc = 1 << 29;           ///< Bottom Front Center (Bfc)\r
-const Speaker kSpeakerBfr = 1 << 30;           ///< Bottom Front Right (Bfr)\r
-\r
-const Speaker kSpeakerPl  = (Speaker)1 << 31;  ///< Proximity Left (Pl)\r
-const Speaker kSpeakerPr  = (Speaker)1 << 32;  ///< Proximity Right (Pr)\r
-\r
-const Speaker kSpeakerBsl = (Speaker)1 << 33;  ///< Bottom Side Left (Bsl)\r
-const Speaker kSpeakerBsr = (Speaker)1 << 34;  ///< Bottom Side Right (Bsr)\r
-const Speaker kSpeakerBrl = (Speaker)1 << 35;  ///< Bottom Rear Left (Brl)\r
-const Speaker kSpeakerBrc = (Speaker)1 << 36;  ///< Bottom Rear Center (Brc)\r
-const Speaker kSpeakerBrr = (Speaker)1 << 37;  ///< Bottom Rear Right (Brr)\r
-//------------------------------------------------------------------------\r
-/** @}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement Definitions (SpeakerArrangement)*/\r
-//------------------------------------------------------------------------\r
-namespace SpeakerArr\r
-{\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement Definitions.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-const SpeakerArrangement kEmpty                         = 0;          ///< empty arrangement\r
-const SpeakerArrangement kMono                  = kSpeakerM;  ///< M\r
-const SpeakerArrangement kStereo                = kSpeakerL   | kSpeakerR;    ///< L R\r
-const SpeakerArrangement kStereoSurround = kSpeakerLs  | kSpeakerRs;   ///< Ls Rs\r
-const SpeakerArrangement kStereoCenter  = kSpeakerLc  | kSpeakerRc;   ///< Lc Rc\r
-const SpeakerArrangement kStereoSide    = kSpeakerSl  | kSpeakerSr;   ///< Sl Sr\r
-const SpeakerArrangement kStereoCLfe    = kSpeakerC   | kSpeakerLfe;  ///< C Lfe\r
-const SpeakerArrangement kStereoTF              = kSpeakerTfl | kSpeakerTfr;  ///< Tfl Tfr\r
-const SpeakerArrangement kStereoTS              = kSpeakerTsl | kSpeakerTsr;  ///< Tsl Tsr\r
-const SpeakerArrangement kStereoTR              = kSpeakerTrl | kSpeakerTrr;  ///< Trl Trr\r
-const SpeakerArrangement kStereoBF              = kSpeakerBfl | kSpeakerBfr;  ///< Bfl Bfr\r
-\r
-/** L R C */\r
-const SpeakerArrangement k30Cine                = kSpeakerL  | kSpeakerR | kSpeakerC;\r
-/** L R S */\r
-const SpeakerArrangement k30Music               = kSpeakerL  | kSpeakerR | kSpeakerS;\r
-/** L R C   Lfe */\r
-const SpeakerArrangement k31Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe;\r
-/** L R Lfe S */\r
-const SpeakerArrangement k31Music               = kSpeakerL  | kSpeakerR | kSpeakerLfe | kSpeakerS;\r
-/** L R C   S (LCRS) */\r
-const SpeakerArrangement k40Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerS;\r
-/** L R Ls  Rs (Quadro) */\r
-const SpeakerArrangement k40Music               = kSpeakerL  | kSpeakerR | kSpeakerLs  | kSpeakerRs;\r
-/** L R C   Lfe S (LCRS+Lfe) */\r
-const SpeakerArrangement k41Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerS;\r
-/** L R Lfe Ls Rs (Quadro+Lfe) */\r
-const SpeakerArrangement k41Music               = kSpeakerL  | kSpeakerR | kSpeakerLfe | kSpeakerLs  | kSpeakerRs;\r
-/** L R C   Ls Rs */\r
-const SpeakerArrangement k50                    = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLs  | kSpeakerRs;\r
-/** L R C  Lfe Ls Rs */\r
-const SpeakerArrangement k51                    = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs;\r
-/** L R C  Ls  Rs Cs */\r
-const SpeakerArrangement k60Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLs  | kSpeakerRs | kSpeakerCs;\r
-/** L R Ls Rs  Sl Sr */\r
-const SpeakerArrangement k60Music               = kSpeakerL  | kSpeakerR | kSpeakerLs  | kSpeakerRs  | kSpeakerSl | kSpeakerSr;\r
-/** L R C  Lfe Ls Rs Cs */\r
-const SpeakerArrangement k61Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs;\r
-/** L R Lfe Ls  Rs Sl Sr */\r
-const SpeakerArrangement k61Music               = kSpeakerL  | kSpeakerR | kSpeakerLfe | kSpeakerLs  | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-/** L R C   Ls  Rs Lc Rc */\r
-const SpeakerArrangement k70Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLs  | kSpeakerRs | kSpeakerLc | kSpeakerRc;\r
-/** L R C   Ls  Rs Sl Sr */\r
-const SpeakerArrangement k70Music               = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLs  | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-/** L R C Lfe Ls Rs Lc Rc */\r
-const SpeakerArrangement k71Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc;\r
-const SpeakerArrangement k71CineFullFront= k71Cine;\r
-/** L R C Lfe Ls Rs Lcs Rcs */\r
-const SpeakerArrangement k71CineFullRear = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLcs | kSpeakerRcs;\r
-/** L R C Lfe Ls Rs Sl Sr */\r
-const SpeakerArrangement k71Music               = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-const SpeakerArrangement k71CineSideFill = k71Music;\r
-/** L R C Lfe Ls Rs Pl Pr */\r
-const SpeakerArrangement k71Proximity   = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerPl | kSpeakerPr;\r
-/** L R C Ls  Rs Lc Rc Cs */\r
-const SpeakerArrangement k80Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLs  | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs;\r
-/** L R C Ls  Rs Cs Sl Sr */\r
-const SpeakerArrangement k80Music               = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLs  | kSpeakerRs | kSpeakerCs | kSpeakerSl | kSpeakerSr;\r
-/** L R C Lfe Ls Rs Lc Rc Cs */\r
-const SpeakerArrangement k81Cine                = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs;\r
-/** L R C Lfe Ls Rs Cs Sl Sr */\r
-const SpeakerArrangement k81Music               = kSpeakerL  | kSpeakerR | kSpeakerC   | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerSl | kSpeakerSr;\r
-\r
-\r
-/** First-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */\r
-const SpeakerArrangement kAmbi1stOrderACN = kSpeakerACN0 | kSpeakerACN1 | kSpeakerACN2 | kSpeakerACN3;\r
-/** Second-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */\r
-const SpeakerArrangement kAmbi2cdOrderACN = kAmbi1stOrderACN | kSpeakerACN4 | kSpeakerACN5 | kSpeakerACN6 | kSpeakerACN7 | kSpeakerACN8;\r
-/** Third-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */\r
-const SpeakerArrangement kAmbi3rdOrderACN = kAmbi2cdOrderACN | kSpeakerACN9 | kSpeakerACN10 | kSpeakerACN11 | kSpeakerACN12 | kSpeakerACN13 | kSpeakerACN14 | kSpeakerACN15;\r
-\r
-\r
-/*-----------*/\r
-/* 3D formats */\r
-/*-----------*/\r
-/** L R Ls Rs Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k80Cube                  = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs  | kSpeakerTfl| kSpeakerTfr| kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Cs Tc */\r
-const SpeakerArrangement k71CineTopCenter  = kSpeakerL | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs  | kSpeakerTc;\r
-/** L R C Lfe Ls Rs Cs Tfc */\r
-const SpeakerArrangement k71CineCenterHigh = kSpeakerL | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs  | kSpeakerTfc;\r
-/** L R C Lfe Ls Rs Tfl Tfr */\r
-const SpeakerArrangement k71CineFrontHigh  = kSpeakerL | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTfl | kSpeakerTfr;\r
-const SpeakerArrangement k71MPEG3D                = k71CineFrontHigh;\r
-/** L R C Lfe Ls Rs Tsl Tsr */\r
-const SpeakerArrangement k71CineSideHigh   = kSpeakerL | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTsl | kSpeakerTsr;\r
-\r
-/** L R Lfe Ls Rs Tfl Tfc Tfr Bfc */\r
-const SpeakerArrangement k81MPEG3D              = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
-                                                                                  kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerBfc;\r
-\r
-/** L R C Ls Rs Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k90                    = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLs  | kSpeakerRs |\r
-                                                                                  kSpeakerTfl| kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k50_4                  = k90;\r
-/** L R C Lfe Ls Rs Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k91                    = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs  |\r
-                                                                                  kSpeakerTfl| kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k51_4                  = k91;\r
-\r
-/** L R C Lfe Ls Rs Sl Sr Tsl Tsr */\r
-const SpeakerArrangement k71_2                  = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs |\r
-                                                                                  kSpeakerRs | kSpeakerSl | kSpeakerSr | kSpeakerTsl | kSpeakerTsr;\r
-const SpeakerArrangement k91Atmos               = k71_2;\r
-\r
-/** L R C Ls Rs Tc Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k100                   = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLs  | kSpeakerRs |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Tc Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k101                   = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs  |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k101MPEG3D             = k101;\r
-\r
-/** L R C Lfe Ls Rs Tfl Tfc Tfr Trl Trr Lfe2 */\r
-const SpeakerArrangement k102                   = kSpeakerL  | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs  |\r
-                                                                                  kSpeakerTfl| kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerLfe2;\r
-\r
-/** L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k110                   = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLs  | kSpeakerRs |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k111                   = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-\r
-/** L R C Ls Rs Sl Sr Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k70_4                  = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
-                                                                                  kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-\r
-/** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k71_4                  = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
-                                                                                  kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k111MPEG3D             = k71_4;\r
-\r
-/** L R C Lfe Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr Lfe2 */\r
-const SpeakerArrangement k122                   = kSpeakerL  | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs  | kSpeakerLc  | kSpeakerRc |\r
-                                                                                  kSpeakerTfl| kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerLfe2;\r
-/** L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k130                   = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLs  | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k131                   = kSpeakerL  | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-\r
-/** L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr  */\r
-const SpeakerArrangement k140                   = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
-                                                                                  kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr |\r
-                                                                                  kSpeakerBfl | kSpeakerBfr | kSpeakerBrl | kSpeakerBrr;\r
-\r
-/** L R C Lfe Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr Lfe2 Tsl Tsr Bfl Bfc Bfr */\r
-const SpeakerArrangement k222                   = kSpeakerL  | kSpeakerR | kSpeakerC  | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs | kSpeakerSl | kSpeakerSr |\r
-                                                                                  kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrc | kSpeakerTrr | kSpeakerLfe2 | kSpeakerTsl | kSpeakerTsr |\r
-                                                                                  kSpeakerBfl| kSpeakerBfc | kSpeakerBfr;\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement String Representation.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-const CString kStringEmpty             = "";\r
-const CString kStringMono              = "Mono";\r
-const CString kStringStereo            = "Stereo";\r
-const CString kStringStereoR   = "Stereo (Ls Rs)";\r
-const CString kStringStereoC   = "Stereo (Lc Rc)";\r
-const CString kStringStereoSide        = "Stereo (Sl Sr)";\r
-const CString kStringStereoCLfe        = "Stereo (C LFE)";\r
-const CString kStringStereoTF  = "Stereo (Tfl Tfr)";\r
-const CString kStringStereoTS  = "Stereo (Tsl Tsr)";\r
-const CString kStringStereoTR  = "Stereo (Trl Trr)";\r
-const CString kStringStereoBF  = "Stereo (Bfl Bfr)";\r
-\r
-const CString kString30Cine            = "LRC";\r
-const CString kString30Music   = "LRS";\r
-const CString kString31Cine            = "LRC+LFE";\r
-const CString kString31Music   = "LRS+LFE";\r
-const CString kString40Cine            = "LRCS";\r
-const CString kString40Music   = "Quadro";\r
-const CString kString41Cine            = "LRCS+LFE";\r
-const CString kString41Music   = "Quadro+LFE";\r
-const CString kString50                        = "5.0";\r
-const CString kString51                        = "5.1";\r
-const CString kString60Cine            = "6.0 Cine";\r
-const CString kString60Music   = "6.0 Music";\r
-const CString kString61Cine            = "6.1 Cine";\r
-const CString kString61Music   = "6.1 Music";\r
-const CString kString70Cine            = "7.0 Cine (SDDS)";\r
-const CString kString70Music   = "7.0 Music (Dolby)";\r
-const CString kString71Cine            = "7.1 Cine (SDDS)";\r
-const CString kString71Music   = "7.1 Music (Dolby)";\r
-const CString kString71CineTopCenter   = "7.1 Cine Top Center";\r
-const CString kString71CineCenterHigh  = "7.1 Cine Center High";\r
-const CString kString71CineFrontHigh   = "7.1 Cine Front High";\r
-const CString kString71CineSideHigh            = "7.1 Cine Side High";\r
-const CString kString71CineFullRear            = "7.1 Cine Full Rear";\r
-const CString kString71Proximity               = "7.1 Proximity";\r
-const CString kString80Cine            = "8.0 Cine";\r
-const CString kString80Music   = "8.0 Music";\r
-const CString kString80Cube            = "8.0 Cube";\r
-const CString kString81Cine            = "8.1 Cine";\r
-const CString kString81Music   = "8.1 Music";\r
-const CString kString102               = "10.2 Experimental";\r
-const CString kString122               = "12.2";\r
-const CString kString50_4              = "5.0.4";\r
-const CString kString51_4              = "5.1.4";\r
-const CString kString91Atmos   = "9.1 Dolby Atmos";\r
-const CString kString100               = "10.0 Auro-3D";\r
-const CString kString101               = "10.1 Auro-3D";\r
-const CString kString110               = "11.0 Auro-3D";\r
-const CString kString111               = "11.1 Auro-3D";\r
-const CString kString130               = "13.0 Auro-3D";\r
-const CString kString131               = "13.1 Auro-3D";\r
-const CString kString81MPEG            = "8.1 MPEG";\r
-const CString kString70_4              = "7.0.4";\r
-const CString kString71_4              = "7.1.4";\r
-const CString kString140               = "14.0";\r
-const CString kString222               = "22.2";\r
-const CString kStringAmbi1stOrder = "Ambi 1st-Order";\r
-const CString kStringAmbi2cdOrder = "Ambi 2cd-Order";\r
-const CString kStringAmbi3rdOrder = "Ambi 3rd-Order";\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement String Representation with Speakers Name.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-const CString kStringMonoS             = "M";\r
-const CString kStringStereoS   = "L R";\r
-const CString kStringStereoRS  = "Ls Rs";\r
-const CString kStringStereoCS  = "Lc Rc";\r
-const CString kStringStereoSS  = "Sl Sr";\r
-const CString kStringStereoCLfeS= "C LFE";\r
-const CString kStringStereoTFS = "Tfl Tfr";\r
-const CString kStringStereoTSS = "Tsl Tsr";\r
-const CString kStringStereoTRS = "Trl Trr";\r
-const CString kStringStereoBFS = "Bfl Bfr";\r
-const CString kString30CineS   = "L R C";\r
-const CString kString30MusicS  = "L R S";\r
-const CString kString31CineS   = "L R C LFE";\r
-const CString kString31MusicS  = "L R LFE S";\r
-const CString kString40CineS   = "L R C S";\r
-const CString kString40MusicS  = "L R Ls Rs";\r
-const CString kString41CineS   = "L R C LFE S";\r
-const CString kString41MusicS  = "L R LFE Ls Rs";\r
-const CString kString50S               = "L R C Ls Rs";\r
-const CString kString51S               = "L R C LFE Ls Rs";\r
-const CString kString60CineS   = "L R C Ls Rs Cs";\r
-const CString kString60MusicS  = "L R Ls Rs Sl Sr";\r
-const CString kString61CineS   = "L R C LFE Ls Rs Cs";\r
-const CString kString61MusicS  = "L R LFE Ls Rs Sl Sr";\r
-const CString kString70CineS   = "L R C Ls Rs Lc Rc";\r
-const CString kString70MusicS  = "L R C Ls Rs Sl Sr";\r
-const CString kString71CineS   = "L R C LFE Ls Rs Lc Rc";\r
-const CString kString71MusicS  = "L R C LFE Ls Rs Sl Sr";\r
-const CString kString80CineS   = "L R C Ls Rs Lc Rc Cs";\r
-const CString kString80MusicS  = "L R C Ls Rs Cs Sl Sr";\r
-const CString kString81CineS   = "L R C LFE Ls Rs Lc Rc Cs";\r
-const CString kString81MusicS  = "L R C LFE Ls Rs Cs Sl Sr";\r
-const CString kString80CubeS   = "L R Ls Rs Tfl Tfr Trl Trr";\r
-const CString kString71CineTopCenterS  = "L R C LFE Ls Rs Cs Tc";\r
-const CString kString71CineCenterHighS = "L R C LFE Ls Rs Cs Tfc";\r
-const CString kString71CineFrontHighS  = "L R C LFE Ls Rs Tfl Tfl";\r
-const CString kString71CineSideHighS   = "L R C LFE Ls Rs Tsl Tsl";\r
-const CString kString71CineFullRearS   = "L R C LFE Ls Rs Lcs Rcs";\r
-const CString kString71ProximityS              = "L R C LFE Ls Rs Pl Pr";\r
-const CString kString50_4S             = "L R C Ls Rs Tfl Tfr Trl Trr";\r
-const CString kString51_4S             = "L R C LFE Ls Rs Tfl Tfr Trl Trr";\r
-const CString kString91AtmosS  = "L R C LFE Ls Rs Sl Sr Tsl Tsr";\r
-const CString kString100S              = "L R C Ls Rs Tc Tfl Tfr Trl Trr";\r
-const CString kString101S              = "L R C LFE Ls Rs Tc Tfl Tfr Trl Trr";\r
-const CString kString110S              = "L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kString111S              = "L R C LFE Ls Rs Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kStringk70_4S            = "L R C Ls Rs Sl Sr Tfl Tfr Trl Trr";\r
-const CString kStringk71_4S            = "L R C LFE Ls Rs Sl Sr Tfl Tfr Trl Trr";\r
-const CString kString130S              = "L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kString131S              = "L R C LFE Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kString102S              = "L R C LFE Ls Rs Tfl Tfc Tfr Trl Trr LFE2";\r
-const CString kString122S              = "L R C LFE Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr LFE2";\r
-const CString kString81MPEGS   = "L R LFE Ls Rs Tfl Tfc Tfr Bfc";\r
-const CString kString140S              = "L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr";\r
-const CString kString222S              = "L R C LFE Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr LFE2 Tsl Tsr Bfl Bfc Bfr";\r
-\r
-const CString kStringAmbi1stOrderS     = "0 1 2 3";\r
-const CString kStringAmbi2cdOrderS     = "0 1 2 3 4 5 6 7 8";\r
-const CString kStringAmbi3rdOrderS     = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns number of channels used in speaker arrangement.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-inline int32 getChannelCount (SpeakerArrangement arr)\r
-{\r
-       int32 count = 0;\r
-       while (arr)\r
-       {\r
-               if (arr & (SpeakerArrangement)1)\r
-                       ++count;\r
-               arr >>= 1;\r
-       }\r
-       return count;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the index of a given speaker in a speaker arrangement (-1 if speaker is not part of the arrangement). */\r
-inline int32 getSpeakerIndex (Speaker speaker, SpeakerArrangement arrangement)\r
-{\r
-       // check if speaker is present in arrangement\r
-       if ((arrangement & speaker) == 0)\r
-               return -1;\r
-\r
-       int32 result = 0;\r
-       Speaker i = 1;\r
-       while (i < speaker)\r
-       {\r
-               if (arrangement & i)\r
-                       result++;\r
-               i <<= 1;\r
-       }\r
-\r
-       return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the speaker for a given index in a speaker arrangement (return 0 when out of range). */\r
-inline Speaker getSpeaker (const SpeakerArrangement& arr, int32 index)\r
-{\r
-       SpeakerArrangement arrTmp = arr;\r
-\r
-       int32 index2 = -1;\r
-       int32 pos = -1;\r
-       while (arrTmp)\r
-       {\r
-               if (arrTmp & 0x1)\r
-                       index2++;\r
-               pos++;\r
-               if (index2 == index)\r
-                       return (Speaker)1 << pos;\r
-\r
-               arrTmp = arrTmp >> 1;\r
-       }\r
-       return 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns true if arrSubSet is a subset speaker of arr (means each speaker of arrSubSet is included in arr). */\r
-inline bool isSubsetOf (const SpeakerArrangement& arrSubSet, const SpeakerArrangement& arr)\r
-{\r
-       return (arrSubSet == (arrSubSet & arr));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns true if arrangement is a Auro configuration. */\r
-inline bool isAuro (const SpeakerArrangement& arr)\r
-{\r
-       if (arr == k90 || arr == k91 || arr == k100 || arr == k101 || arr == k110 || arr == k111 ||\r
-           arr == k130 || arr == k131)\r
-       {\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the speaker arrangement associated to a string representation.\r
-       Returns kEmpty if no associated arrangement is known.\r
-*/\r
-inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr)\r
-{\r
-       if (!strcmp8 (arrStr, kStringMono))\r
-               return kMono;\r
-       if (!strcmp8 (arrStr, kStringStereo))\r
-               return kStereo;\r
-       if (!strcmp8 (arrStr, kStringStereoR))\r
-               return kStereoSurround;\r
-       if (!strcmp8 (arrStr, kStringStereoC))\r
-               return kStereoCenter;\r
-       if (!strcmp8 (arrStr, kStringStereoSide))\r
-               return kStereoSide;\r
-       if (!strcmp8 (arrStr, kStringStereoCLfe))\r
-               return kStereoCLfe;\r
-       if (!strcmp8 (arrStr, kStringStereoTF))\r
-               return kStereoTF;\r
-       if (!strcmp8 (arrStr, kStringStereoTS))\r
-               return kStereoTS;\r
-       if (!strcmp8 (arrStr, kStringStereoTR))\r
-               return kStereoTR;\r
-       if (!strcmp8 (arrStr, kStringStereoBF))\r
-               return kStereoBF;\r
-       if (!strcmp8 (arrStr, kString30Cine))\r
-               return k30Cine;\r
-       if (!strcmp8 (arrStr, kString30Music))\r
-               return k30Music;\r
-       if (!strcmp8 (arrStr, kString31Cine))\r
-               return k31Cine;\r
-       if (!strcmp8 (arrStr, kString31Music))\r
-               return k31Music;\r
-       if (!strcmp8 (arrStr, kString40Cine))\r
-               return k40Cine;\r
-       if (!strcmp8 (arrStr, kString40Music))\r
-               return k40Music;\r
-       if (!strcmp8 (arrStr, kString41Cine))\r
-               return k41Cine;\r
-       if (!strcmp8 (arrStr, kString41Music))\r
-               return k41Music;\r
-       if (!strcmp8 (arrStr, kString50))\r
-               return k50;\r
-       if (!strcmp8 (arrStr, kString51))\r
-               return k51;\r
-       if (!strcmp8 (arrStr, kString60Cine))\r
-               return k60Cine;\r
-       if (!strcmp8 (arrStr, kString60Music))\r
-               return k60Music;\r
-       if (!strcmp8 (arrStr, kString61Cine))\r
-               return k61Cine;\r
-       if (!strcmp8 (arrStr, kString61Music))\r
-               return k61Music;\r
-       if (!strcmp8 (arrStr, kString70Cine))\r
-               return k70Cine;\r
-       if (!strcmp8 (arrStr, kString70Music))\r
-               return k70Music;\r
-       if (!strcmp8 (arrStr, kString71Cine))\r
-               return k71Cine;\r
-       if (!strcmp8 (arrStr, kString71Music))\r
-               return k71Music;\r
-       if (!strcmp8 (arrStr, kString71Proximity))\r
-               return k71Proximity;\r
-       if (!strcmp8 (arrStr, kString80Cine))\r
-               return k80Cine;\r
-       if (!strcmp8 (arrStr, kString80Music))\r
-               return k80Music;\r
-       if (!strcmp8 (arrStr, kString81Cine))\r
-               return k81Cine;\r
-       if (!strcmp8 (arrStr, kString81Music))\r
-               return k81Music;\r
-       if (!strcmp8 (arrStr, kString102))\r
-               return k102;\r
-       if (!strcmp8 (arrStr, kString122))\r
-               return k122;\r
-       if (!strcmp8 (arrStr, kString80Cube))\r
-               return k80Cube;\r
-       if (!strcmp8 (arrStr, kString71CineTopCenter))\r
-               return k71CineTopCenter;\r
-       if (!strcmp8 (arrStr, kString71CineCenterHigh))\r
-               return k71CineCenterHigh;\r
-       if (!strcmp8 (arrStr, kString71CineFrontHigh))\r
-               return k71CineFrontHigh;\r
-       if (!strcmp8 (arrStr, kString71CineSideHigh))\r
-               return k71CineSideHigh;\r
-       if (!strcmp8 (arrStr, kString71CineFullRear))\r
-               return k71CineFullRear;\r
-       if (!strcmp8 (arrStr, kString50_4))\r
-               return k50_4;\r
-       if (!strcmp8 (arrStr, kString51_4))\r
-               return k51_4;\r
-       if (!strcmp8 (arrStr, kString81MPEG))\r
-               return k81MPEG3D;\r
-       if (!strcmp8 (arrStr, kString91Atmos))\r
-               return k91Atmos;\r
-       if (!strcmp8 (arrStr, kString100))\r
-               return k100;\r
-       if (!strcmp8 (arrStr, kString101))\r
-               return k101;\r
-       if (!strcmp8 (arrStr, kString110))\r
-               return k110;\r
-       if (!strcmp8 (arrStr, kString111))\r
-               return k111;\r
-       if (!strcmp8 (arrStr, kString70_4))\r
-               return k70_4;\r
-       if (!strcmp8 (arrStr, kString71_4))\r
-               return k71_4;\r
-       if (!strcmp8 (arrStr, kString130))\r
-               return k130;\r
-       if (!strcmp8 (arrStr, kString131))\r
-               return k131;\r
-       if (!strcmp8 (arrStr, kString140))\r
-               return k140;\r
-       if (!strcmp8 (arrStr, kString222))\r
-               return k222;\r
-       if (!strcmp8 (arrStr, kStringAmbi1stOrder))\r
-               return kAmbi1stOrderACN;\r
-       if (!strcmp8 (arrStr, kStringAmbi2cdOrder))\r
-               return kAmbi2cdOrderACN;\r
-       if (!strcmp8 (arrStr, kStringAmbi3rdOrder))\r
-               return kAmbi3rdOrderACN;\r
-       return kEmpty;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the string representation of a given speaker arrangement.\r
-       Returns kStringEmpty if arr is unknown.\r
-*/\r
-inline CString getSpeakerArrangementString (SpeakerArrangement arr, bool withSpeakersName)\r
-{\r
-       switch (arr)\r
-       {\r
-               case kMono:                             return withSpeakersName ? kStringMonoS          : kStringMono;\r
-               case kStereo:                   return withSpeakersName ? kStringStereoS        : kStringStereo;\r
-               case kStereoSurround:   return withSpeakersName ? kStringStereoRS       : kStringStereoR;\r
-               case kStereoCenter:             return withSpeakersName ? kStringStereoCS       : kStringStereoC;\r
-               case kStereoSide:               return withSpeakersName ? kStringStereoSS       : kStringStereoSide;\r
-               case kStereoCLfe:               return withSpeakersName ? kStringStereoCLfeS: kStringStereoCLfe;\r
-               case kStereoTF:                 return withSpeakersName ? kStringStereoTFS      : kStringStereoTF;\r
-               case kStereoTS:                 return withSpeakersName ? kStringStereoTSS      : kStringStereoTS;\r
-               case kStereoTR:                 return withSpeakersName ? kStringStereoTRS      : kStringStereoTR;\r
-               case kStereoBF:                 return withSpeakersName ? kStringStereoBFS      : kStringStereoBF;\r
-               case k30Cine:                   return withSpeakersName ? kString30CineS        : kString30Cine;\r
-               case k30Music:                  return withSpeakersName ? kString30MusicS       : kString30Music;\r
-               case k31Cine:                   return withSpeakersName ? kString31CineS        : kString31Cine;\r
-               case k31Music:                  return withSpeakersName ? kString31MusicS       : kString31Music;\r
-               case k40Cine:                   return withSpeakersName ? kString40CineS        : kString40Cine;\r
-               case k40Music:                  return withSpeakersName ? kString40MusicS       : kString40Music;\r
-               case k41Cine:                   return withSpeakersName ? kString41CineS        : kString41Cine;\r
-               case k41Music:                  return withSpeakersName ? kString41MusicS       : kString41Music;\r
-               case k50:                               return withSpeakersName ? kString50S            : kString50;\r
-               case k51:                               return withSpeakersName ? kString51S            : kString51;\r
-               case k60Cine:                   return withSpeakersName ? kString60CineS        : kString60Cine;\r
-               case k60Music:                  return withSpeakersName ? kString60MusicS       : kString60Music;\r
-               case k61Cine:                   return withSpeakersName ? kString61CineS        : kString61Cine;\r
-               case k61Music:                  return withSpeakersName ? kString61MusicS       : kString61Music;\r
-               case k70Cine:                   return withSpeakersName ? kString70CineS        : kString70Cine;\r
-               case k70Music:                  return withSpeakersName ? kString70MusicS       : kString70Music;\r
-               case k71Cine:                   return withSpeakersName ? kString71CineS        : kString71Cine;\r
-               case k71Music:                  return withSpeakersName ? kString71MusicS       : kString71Music;\r
-               case k71Proximity:              return withSpeakersName ? kString71ProximityS : kString71Proximity;\r
-               case k80Cine:                   return withSpeakersName ? kString80CineS        : kString80Cine;\r
-               case k80Music:                  return withSpeakersName ? kString80MusicS       : kString80Music;\r
-               case k81Cine:                   return withSpeakersName ? kString81CineS        : kString81Cine;\r
-               case k81Music:                  return withSpeakersName ? kString81MusicS       : kString81Music;\r
-               case k81MPEG3D:                 return withSpeakersName ? kString81MPEGS        : kString81MPEG;\r
-               case k102:                              return withSpeakersName ? kString102S           : kString102;\r
-               case k122:                              return withSpeakersName ? kString122S           : kString122;\r
-               case k80Cube:                   return withSpeakersName ? kString80CubeS        : kString80Cube;\r
-               case k71CineTopCenter:  return withSpeakersName ? kString71CineTopCenterS       : kString71CineTopCenter;\r
-               case k71CineCenterHigh: return withSpeakersName ? kString71CineCenterHighS      : kString71CineCenterHigh;\r
-               case k71CineFrontHigh:  return withSpeakersName ? kString71CineFrontHighS       : kString71CineFrontHigh;\r
-               case k71CineSideHigh:   return withSpeakersName ? kString71CineSideHighS        : kString71CineSideHigh;\r
-               case k71CineFullRear:   return withSpeakersName ? kString71CineFullRearS        : kString71CineFullRear;\r
-               case k91Atmos:                  return withSpeakersName ? kString91AtmosS       : kString91Atmos;\r
-               case k100:                              return withSpeakersName ? kString100S           : kString100;\r
-               case k101:                              return withSpeakersName ? kString101S           : kString101;\r
-               case k110:                              return withSpeakersName ? kString110S           : kString110;\r
-               case k111:                              return withSpeakersName ? kString111S           : kString111;\r
-\r
-               case k50_4:                             return withSpeakersName ? kString50_4S          : kString50_4;\r
-               case k51_4:                             return withSpeakersName ? kString51_4S          : kString51_4;\r
-               case k70_4:                             return withSpeakersName ? kStringk70_4S         : kString70_4;\r
-               case k71_4:                             return withSpeakersName ? kStringk71_4S         : kString71_4;\r
-\r
-               case k130:                              return withSpeakersName ? kString130S           : kString130;\r
-               case k131:                              return withSpeakersName ? kString131S           : kString131;\r
-               case k140:                              return withSpeakersName ? kString140S           : kString140;\r
-               case k222:                              return withSpeakersName ? kString222S           : kString222;\r
-                       break;\r
-       }\r
-\r
-       if (arr == kAmbi1stOrderACN)\r
-               return withSpeakersName ? kStringAmbi1stOrderS : kStringAmbi1stOrder;\r
-       if (arr == kAmbi2cdOrderACN)\r
-               return withSpeakersName ? kStringAmbi2cdOrderS : kStringAmbi2cdOrder;\r
-       if (arr == kAmbi3rdOrderACN)\r
-               return withSpeakersName ? kStringAmbi3rdOrderS : kStringAmbi3rdOrder;\r
-\r
-       return kStringEmpty;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns a CString representation of a given speaker in a given arrangement\r
-*/\r
-inline CString getSpeakerShortName (const SpeakerArrangement& arr, int32 index)\r
-{\r
-       SpeakerArrangement arrTmp = arr;\r
-\r
-       bool found = false;\r
-       int32 index2 = -1;\r
-       int32 pos = -1;\r
-       while (arrTmp)\r
-       {\r
-               if (arrTmp & 0x1)\r
-                       index2++;\r
-               pos++;\r
-               if (index2 == index)\r
-               {\r
-                       found = true;\r
-                       break;\r
-               }\r
-               arrTmp = arrTmp >> 1;\r
-       }\r
-\r
-       if (!found)\r
-               return "";\r
-\r
-       Speaker speaker = (Speaker)1 << pos;\r
-       if (speaker == kSpeakerL)\r
-               return "L";\r
-       if (speaker == kSpeakerR)\r
-               return "R";\r
-       if (speaker == kSpeakerC)\r
-               return "C";\r
-       if (speaker == kSpeakerLfe)\r
-               return "LFE";\r
-       if (speaker == kSpeakerLs)\r
-               return "Ls";\r
-       if (speaker == kSpeakerRs)\r
-               return "Rs";\r
-       if (speaker == kSpeakerLc)\r
-               return "Lc";\r
-       if (speaker == kSpeakerRc)\r
-               return "Rc";\r
-       if (speaker == kSpeakerS)\r
-               return "S";\r
-       if (speaker == kSpeakerSl)\r
-               return "Sl";\r
-       if (speaker == kSpeakerSr)\r
-               return "Sr";\r
-       if (speaker == kSpeakerTc)\r
-               return "Tc";\r
-       if (speaker == kSpeakerTfl)\r
-               return "Tfl";\r
-       if (speaker == kSpeakerTfc)\r
-               return "Tfc";\r
-       if (speaker == kSpeakerTfr)\r
-               return "Tfr";\r
-       if (speaker == kSpeakerTrl)\r
-               return "Trl";\r
-       if (speaker == kSpeakerTrc)\r
-               return "Trc";\r
-       if (speaker == kSpeakerTrr)\r
-               return "Trr";\r
-       if (speaker == kSpeakerLfe2)\r
-               return "LFE2";\r
-       if (speaker == kSpeakerM)\r
-               return "M";\r
-\r
-       if (speaker == kSpeakerACN0)\r
-               return "0";\r
-       if (speaker == kSpeakerACN1)\r
-               return "1";\r
-       if (speaker == kSpeakerACN2)\r
-               return "2";\r
-       if (speaker == kSpeakerACN3)\r
-               return "3";\r
-       if (speaker == kSpeakerACN4)\r
-               return "4";\r
-       if (speaker == kSpeakerACN5)\r
-               return "5";\r
-       if (speaker == kSpeakerACN6)\r
-               return "6";\r
-       if (speaker == kSpeakerACN7)\r
-               return "7";\r
-       if (speaker == kSpeakerACN8)\r
-               return "8";\r
-       if (speaker == kSpeakerACN9)\r
-               return "9";\r
-       if (speaker == kSpeakerACN10)\r
-               return "10";\r
-       if (speaker == kSpeakerACN11)\r
-               return "11";\r
-       if (speaker == kSpeakerACN12)\r
-               return "12";\r
-       if (speaker == kSpeakerACN13)\r
-               return "13";\r
-       if (speaker == kSpeakerACN14)\r
-               return "14";\r
-       if (speaker == kSpeakerACN15)\r
-               return "15";\r
-\r
-       if (speaker == kSpeakerTsl)\r
-               return "Tsl";\r
-       if (speaker == kSpeakerTsr)\r
-               return "Tsr";\r
-       if (speaker == kSpeakerLcs)\r
-               return "Lcs";\r
-       if (speaker == kSpeakerRcs)\r
-               return "Rcs";\r
-\r
-       if (speaker == kSpeakerBfl)\r
-               return "Bfl";\r
-       if (speaker == kSpeakerBfc)\r
-               return "Bfc";\r
-       if (speaker == kSpeakerBfr)\r
-               return "Bfr";\r
-       if (speaker == kSpeakerPl)\r
-               return "Pl";\r
-       if (speaker == kSpeakerPr)\r
-               return "Pr";\r
-       if (speaker == kSpeakerBsl)\r
-               return "Bsl";\r
-       if (speaker == kSpeakerBsr)\r
-               return "Bsr";\r
-       if (speaker == kSpeakerBrl)\r
-               return "Brl";\r
-       if (speaker == kSpeakerBrc)\r
-               return "Brc";\r
-       if (speaker == kSpeakerBrr)\r
-               return "Brr";\r
-\r
-       return "";\r
-}\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace SpeakerArr\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h
deleted file mode 100644 (file)
index 6f72ae1..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Interfaces\r
-// Filename    : pluginterfaces/vst/vsttypes.h\r
-// Created by  : Steinberg, 12/2005\r
-// Description : common defines\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fstrdefs.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-#ifndef kVstVersionString\r
-#define kVstVersionString      "VST 3.6.9"     ///< SDK version for PClassInfo2\r
-#endif\r
-\r
-#define kVstVersionMajor       3\r
-#define kVstVersionMinor       6\r
-#define kVstVersionSub         9\r
-\r
-// this allows to write things like: #if VST_VERSION >= 0x030500 // note that 3.10.0 is 0x030a00\r
-#define VST_VERSION ((kVstVersionMajor << 16) | (kVstVersionMinor << 8) | kVstVersionSub)\r
-\r
-//------------------------------------------------------------------------\r
-// struct alignment definitions\r
-//------------------------------------------------------------------------\r
-#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))\r
-       #define VST3_STRUCT     struct __attribute__((aligned(4)))\r
-#elif SMTG_OS_WINDOWS\r
-       #if SMTG_PLATFORM_64\r
-               #define VST3_PACKED_SIZE        8\r
-       #else\r
-               #define VST3_PACKED_SIZE        4\r
-       #endif\r
-       #define VST3_STRUCT     __declspec(align(VST3_PACKED_SIZE)) struct\r
-#else\r
-       #error "unsupported compiler"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-/** \defgroup vst3typedef VST 3 Data Types\r
-*/\r
-/*@{*/\r
-//------------------------------------------------------------------------\r
-// String Types\r
-//------------------------------------------------------------------------\r
-typedef char16 TChar;                  ///< UTF-16 character\r
-typedef TChar String128[128];  ///< 128 character UTF-16 string\r
-typedef const char8* CString;  ///< C-String\r
-\r
-//------------------------------------------------------------------------\r
-// General\r
-//------------------------------------------------------------------------\r
-typedef int32 MediaType;               ///< media type (audio/event)\r
-typedef int32 BusDirection;            ///< bus direction (in/out)\r
-typedef int32 BusType;                 ///< bus type (main/aux)\r
-typedef int32 IoMode;                  ///< I/O mode (see \ref vst3IoMode)\r
-typedef int32 UnitID;                  ///< unit identifier\r
-typedef double ParamValue;             ///< parameter value type\r
-typedef uint32 ParamID;                        ///< parameter identifier\r
-typedef int32 ProgramListID;   ///< program list identifier\r
-typedef int16 CtrlNumber;              ///< MIDI controller number (see \ref ControllerNumbers for allowed values)\r
-\r
-typedef double TQuarterNotes;  ///< time expressed in quarter notes\r
-typedef int64 TSamples;                        ///< time expressed in audio samples\r
-\r
-typedef uint32 ColorSpec;              ///< color defining by 4 component ARGB value (Alpha/Red/Green/Blue)\r
-\r
-//------------------------------------------------------------------------\r
-static const ParamID kNoParamId = 0xffffffff;  ///< default for uninitialized parameter ID\r
-// static const ParamID kNoParamId = std::numeric_limits<ParamID>::max ();\r
-\r
-//------------------------------------------------------------------------\r
-// Audio Types\r
-//------------------------------------------------------------------------\r
-typedef float Sample32;                                ///< 32-bit precision audio sample\r
-typedef double Sample64;                       ///< 64-bit precision audio sample\r
-typedef double SampleRate;                     ///< sample rate\r
-\r
-//------------------------------------------------------------------------\r
-// Speaker Arrangements Types\r
-//------------------------------------------------------------------------\r
-typedef uint64 SpeakerArrangement;     ///< Bitset of speakers\r
-typedef uint64 Speaker;                    ///< Bit for one speaker\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt
deleted file mode 100644 (file)
index 1f195a9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-// \r
-//   * Redistributions of source code must retain the above copyright notice, \r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation \r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this \r
-//     software without specific prior written permission.\r
-// \r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp
deleted file mode 100644 (file)
index edb2502..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : Common Classes\r
-// Filename    : public.sdk/source/common/memorystream.cpp\r
-// Created by  : Steinberg, 03/2008\r
-// Description : IBStream Implementation for memory blocks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "memorystream.h"\r
-#include "pluginterfaces/base/futils.h"\r
-#include <stdlib.h>\r
-\r
-namespace Steinberg {\r
-\r
-//-----------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (MemoryStream, IBStream, IBStream::iid)\r
-static const TSize kMemGrowAmount = 4096;\r
-\r
-//-----------------------------------------------------------------------------\r
-MemoryStream::MemoryStream (void* data, TSize length)\r
-: memory ((char*)data)\r
-, memorySize (length)\r
-, size (length)\r
-, cursor (0)\r
-, ownMemory (false)\r
-, allocationError (false)\r
-{\r
-       FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-MemoryStream::MemoryStream ()\r
-: memory (nullptr)\r
-, memorySize (0)\r
-, size (0)\r
-, cursor (0)\r
-, ownMemory (true)\r
-, allocationError (false)\r
-{\r
-       FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-MemoryStream::~MemoryStream ()\r
-{\r
-       if (ownMemory && memory)\r
-               ::free (memory);\r
-\r
-       FUNKNOWN_DTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::read (void* data, int32 numBytes, int32* numBytesRead)\r
-{\r
-       if (memory == nullptr)\r
-       {\r
-               if (allocationError)\r
-                       return kOutOfMemory;\r
-               numBytes = 0;\r
-       }\r
-       else\r
-       {\r
-               // Does read exceed size ?\r
-               if (cursor + numBytes > size)\r
-               {\r
-                       int32 maxBytes = int32 (size - cursor);\r
-\r
-                       // Has length become zero or negative ?\r
-                       if (maxBytes <= 0)\r
-                       {\r
-                               cursor = size;\r
-                               numBytes = 0;\r
-                       }\r
-                       else\r
-                               numBytes = maxBytes;\r
-               }\r
-\r
-               if (numBytes)\r
-               {\r
-                       memcpy (data, &memory[cursor], numBytes);\r
-                       cursor += numBytes;\r
-               }\r
-       }\r
-\r
-       if (numBytesRead)\r
-               *numBytesRead = numBytes;\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)\r
-{\r
-       if (allocationError)\r
-               return kOutOfMemory;\r
-       if (buffer == nullptr)\r
-               return kInvalidArgument;\r
-\r
-       // Does write exceed size ?\r
-       TSize requiredSize = cursor + numBytes;\r
-       if (requiredSize > size)\r
-       {\r
-               if (requiredSize > memorySize)\r
-                       setSize (requiredSize);\r
-               else\r
-                       size = requiredSize;\r
-       }\r
-\r
-       // Copy data\r
-       if (memory && cursor >= 0 && numBytes > 0)\r
-       {\r
-               memcpy (&memory[cursor], buffer, numBytes);\r
-               // Update cursor\r
-               cursor += numBytes;\r
-       }\r
-       else\r
-               numBytes = 0;\r
-\r
-       if (numBytesWritten)\r
-               *numBytesWritten = numBytes;\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
-       switch (mode)\r
-       {\r
-               case kIBSeekSet:\r
-                       cursor = pos;\r
-                       break;\r
-               case kIBSeekCur:\r
-                       cursor = cursor + pos;\r
-                       break;\r
-               case kIBSeekEnd:\r
-                       cursor = size + pos;\r
-                       break;\r
-       }\r
-\r
-       if (ownMemory == false)\r
-               if (cursor > memorySize)\r
-                       cursor = memorySize;\r
-\r
-       if (result)\r
-               *result = cursor;\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::tell  (int64* pos)\r
-{\r
-       if (!pos)\r
-               return kInvalidArgument;\r
-\r
-       *pos = cursor;\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize MemoryStream::getSize ()\r
-{\r
-       return size;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void MemoryStream::setSize (TSize s)\r
-{\r
-       if (s <= 0)\r
-       {\r
-               if (ownMemory && memory)\r
-                       free (memory);\r
-\r
-               memory = nullptr;\r
-               memorySize = 0;\r
-               size = 0;\r
-               cursor = 0;\r
-               return;\r
-       }\r
-\r
-       TSize newMemorySize = (((Max (memorySize, s) - 1) / kMemGrowAmount) + 1) * kMemGrowAmount;\r
-       if (newMemorySize == memorySize)\r
-       {\r
-               size = s;\r
-               return;\r
-       }\r
-\r
-       if (memory && ownMemory == false)\r
-       {\r
-               allocationError = true;\r
-               return;\r
-       }\r
-\r
-       ownMemory = true;\r
-       char* newMemory = nullptr;\r
-\r
-       if (memory)\r
-       {\r
-               newMemory = (char*)realloc (memory, (size_t)newMemorySize);\r
-               if (newMemory == nullptr && newMemorySize > 0)\r
-               {\r
-                       newMemory = (char*)malloc ((size_t)newMemorySize);\r
-                       if (newMemory)\r
-                       {\r
-                               memcpy (newMemory, memory, (size_t)Min (newMemorySize, memorySize));\r
-                               free (memory);\r
-                       }\r
-               }\r
-       }\r
-       else\r
-               newMemory = (char*)malloc ((size_t)newMemorySize);\r
-\r
-       if (newMemory == nullptr)\r
-       {\r
-               if (newMemorySize > 0)\r
-                       allocationError = true;\r
-\r
-               memory = nullptr;\r
-               memorySize = 0;\r
-               size = 0;\r
-               cursor = 0;\r
-       }\r
-       else\r
-       {\r
-               memory = newMemory;\r
-               memorySize = newMemorySize;\r
-               size = s;\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-char* MemoryStream::getData ()\r
-{\r
-       return memory;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-char* MemoryStream::detachData ()\r
-{\r
-       if (ownMemory)\r
-       {\r
-               char* result = memory;\r
-               memory = nullptr;\r
-               memorySize = 0;\r
-               size = 0;\r
-               cursor = 0;\r
-               return result;\r
-       }\r
-       return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool MemoryStream::truncate ()\r
-{\r
-       if (ownMemory == false)\r
-               return false;\r
-\r
-       if (memorySize == size)\r
-               return true;\r
-\r
-       memorySize = size;\r
-\r
-       if (memorySize == 0)\r
-       {\r
-               if (memory)\r
-               {\r
-                       free (memory);\r
-                       memory = nullptr;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (memory)\r
-               {\r
-                       char* newMemory = (char*)realloc (memory, (size_t)memorySize);\r
-                       if (newMemory)\r
-                               memory = newMemory;\r
-               }\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool MemoryStream::truncateToCursor ()\r
-{\r
-       size = cursor;\r
-       return truncate ();\r
-}\r
-\r
-} // namespace\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h
deleted file mode 100644 (file)
index 63c45ba..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : Common Classes\r
-// Filename    : public.sdk/source/common/memorystream.h\r
-// Created by  : Steinberg, 03/2008\r
-// Description : IBStream Implementation for memory blocks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ibstream.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Memory based Stream for IBStream implementation (using malloc).\r
-\ingroup sdkBase\r
-*/\r
-//------------------------------------------------------------------------\r
-class MemoryStream : public IBStream\r
-{\r
-public:\r
-       //------------------------------------------------------------------------\r
-       MemoryStream ();\r
-       MemoryStream (void* memory, TSize memorySize);  ///< reuse a given memory without getting ownership\r
-       virtual ~MemoryStream ();\r
-\r
-       //---IBStream---------------------------------------\r
-       virtual tresult PLUGIN_API read  (void* buffer, int32 numBytes, int32* numBytesRead) SMTG_OVERRIDE;\r
-       virtual tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten) SMTG_OVERRIDE;\r
-       virtual tresult PLUGIN_API seek  (int64 pos, int32 mode, int64* result) SMTG_OVERRIDE;\r
-       virtual tresult PLUGIN_API tell  (int64* pos) SMTG_OVERRIDE;\r
-\r
-       TSize getSize ();               ///< returns the current memory size\r
-       void setSize (TSize size);      ///< set the memory size, a realloc will occur if memory already used\r
-       char* getData ();               ///< returns the memory pointer\r
-       char* detachData ();    ///< returns the memory pointer and give up ownership\r
-       bool truncate ();               ///< realloc to the current use memory size if needed\r
-       bool truncateToCursor ();       ///< truncate memory at current cursor position\r
-\r
-       //------------------------------------------------------------------------\r
-       DECLARE_FUNKNOWN_METHODS\r
-protected:\r
-       char* memory;                           // memory block\r
-       TSize memorySize;                       // size of the memory block\r
-       TSize size;                                     // size of the stream\r
-       int64 cursor;                           // stream pointer\r
-       bool ownMemory;                         // stream has allocated memory itself\r
-       bool allocationError;       // stream invalid\r
-};\r
-\r
-} // namespace\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp
deleted file mode 100644 (file)
index f20f9bc..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : Common Base Classes\r
-// Filename    : public.sdk/source/common/pluginview.cpp\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Plug-In View Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "pluginview.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-//  CPluginView implementation\r
-//------------------------------------------------------------------------\r
-CPluginView::CPluginView (const ViewRect* _rect)\r
-: rect (0, 0, 0, 0), systemWindow (nullptr), plugFrame (nullptr)\r
-{\r
-       if (_rect)\r
-               rect = *_rect;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-CPluginView::~CPluginView ()\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::isPlatformTypeSupported (FIDString /*type*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::attached (void* parent, FIDString /*type*/)\r
-{\r
-       systemWindow = parent;\r
-\r
-       attachedToParent ();\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::removed ()\r
-{\r
-       systemWindow = nullptr;\r
-\r
-       removedFromParent ();\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::onSize (ViewRect* newSize)\r
-{\r
-       if (newSize)\r
-               rect = *newSize;\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::getSize (ViewRect* size)\r
-{\r
-       if (size)\r
-       {\r
-               *size = rect;\r
-               return kResultTrue;\r
-       }\r
-       return kInvalidArgument;\r
-}\r
-\r
-} // end of namespace\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h
deleted file mode 100644 (file)
index 7a8de10..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : SDK Core\r
-//\r
-// Category    : Common Base Classes\r
-// Filename    : public.sdk/source/common/pluginview.h\r
-// Created by  : Steinberg, 01/2004\r
-// Description : Plug-In View Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/gui/iplugview.h"\r
-#include "base/source/fobject.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Plug-In view default implementation.\r
-\ingroup sdkBase\r
-Can be used as base class for an IPlugView implementation. */\r
-//------------------------------------------------------------------------\r
-class CPluginView: public FObject,\r
-                      public IPlugView\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       CPluginView (const ViewRect* rect = nullptr);\r
-       virtual ~CPluginView ();\r
-\r
-       /** Returns its current frame rectangle. */\r
-       const ViewRect& getRect () const        { return rect; }\r
-\r
-       /** Sets a new frame rectangle. */\r
-       void setRect (const ViewRect& r)        { rect = r; }\r
-\r
-       /** Checks if this view is attached to its parent view. */\r
-       bool isAttached () const                        { return systemWindow != nullptr; }\r
-\r
-       /** Calls when this view will be attached to its parent view. */\r
-       virtual void attachedToParent () {}\r
-\r
-       /** Calls when this view will be removed from its parent view. */\r
-       virtual void removedFromParent () {}\r
-\r
-       //---from IPlugView-------\r
-       tresult PLUGIN_API isPlatformTypeSupported (FIDString type) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API attached (void* parent, FIDString type) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API removed () SMTG_OVERRIDE;\r
-\r
-       tresult PLUGIN_API onWheel (float /*distance*/) SMTG_OVERRIDE { return kResultFalse; }\r
-       tresult PLUGIN_API onKeyDown (char16 /*key*/, int16 /*keyMsg*/, int16 /*modifiers*/) SMTG_OVERRIDE { return kResultFalse; }\r
-       tresult PLUGIN_API onKeyUp (char16 /*key*/, int16 /*keyMsg*/, int16 /*modifiers*/) SMTG_OVERRIDE { return kResultFalse; }\r
-       tresult PLUGIN_API getSize (ViewRect* size) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API onSize (ViewRect* newSize) SMTG_OVERRIDE;\r
-\r
-       tresult PLUGIN_API onFocus (TBool /*state*/) SMTG_OVERRIDE { return kResultFalse; }\r
-       tresult PLUGIN_API setFrame (IPlugFrame* frame) SMTG_OVERRIDE { plugFrame = frame; return kResultTrue; }\r
-\r
-       tresult PLUGIN_API canResize () SMTG_OVERRIDE { return kResultFalse; }\r
-       tresult PLUGIN_API checkSizeConstraint (ViewRect* /*rect*/) SMTG_OVERRIDE { return kResultFalse; }\r
-\r
-       //---Interface------\r
-       OBJ_METHODS (CPluginView, FObject)\r
-       DEFINE_INTERFACES\r
-               DEF_INTERFACE (IPlugView)\r
-       END_DEFINE_INTERFACES (FObject)\r
-       REFCOUNT_METHODS(FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       ViewRect rect;\r
-       void* systemWindow;\r
-       IPlugFrame* plugFrame;\r
-};\r
-\r
-}      // namespace\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp
deleted file mode 100644 (file)
index e582be0..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/hosting/hostclasses.cpp\r
-// Created by  : Steinberg, 03/05/2008.\r
-// Description : VST 3 hostclasses, example implementations for IHostApplication, IAttributeList and IMessage\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "hostclasses.h"\r
-\r
-#include <algorithm>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostApplication::getName (String128 name)\r
-{\r
-       String str ("My VST3 HostApplication");\r
-       str.copyTo16 (name, 0, 127);\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostApplication::createInstance (TUID cid, TUID _iid, void** obj)\r
-{\r
-       FUID classID (FUID::fromTUID (cid));\r
-       FUID interfaceID (FUID::fromTUID (_iid));\r
-       if (classID == IMessage::iid && interfaceID == IMessage::iid)\r
-       {\r
-               *obj = new HostMessage;\r
-               return kResultTrue;\r
-       }\r
-       else if (classID == IAttributeList::iid && interfaceID == IAttributeList::iid)\r
-       {\r
-               *obj = new HostAttributeList;\r
-               return kResultTrue;\r
-       }\r
-       *obj = 0;\r
-       return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostApplication::queryInterface (const char* _iid, void** obj)\r
-{\r
-       QUERY_INTERFACE (_iid, obj, FUnknown::iid, IHostApplication)\r
-       QUERY_INTERFACE (_iid, obj, IHostApplication::iid, IHostApplication)\r
-       *obj = 0;\r
-       return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 PLUGIN_API HostApplication::addRef ()\r
-{\r
-       return 1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 PLUGIN_API HostApplication::release ()\r
-{\r
-       return 1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (HostMessage, IMessage, IMessage::iid)\r
-//-----------------------------------------------------------------------------\r
-HostMessage::HostMessage () : messageId (0), attributeList (0)\r
-{\r
-       FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-HostMessage::~HostMessage ()\r
-{\r
-       setMessageID (0);\r
-       if (attributeList)\r
-               attributeList->release ();\r
-       FUNKNOWN_DTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const char* PLUGIN_API HostMessage::getMessageID ()\r
-{\r
-       return messageId;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API HostMessage::setMessageID (const char* mid)\r
-{\r
-       if (messageId)\r
-               delete[] messageId;\r
-       messageId = 0;\r
-       if (mid)\r
-       {\r
-               size_t len = strlen (mid) + 1;\r
-               messageId = new char[len];\r
-               strcpy (messageId, mid);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-IAttributeList* PLUGIN_API HostMessage::getAttributes ()\r
-{\r
-       if (!attributeList)\r
-               attributeList = new HostAttributeList;\r
-       return attributeList;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-class HostAttribute\r
-{\r
-public:\r
-       enum Type\r
-       {\r
-               kInteger,\r
-               kFloat,\r
-               kString,\r
-               kBinary\r
-       };\r
-\r
-       HostAttribute (int64 value) : size (0), type (kInteger) { v.intValue = value; }\r
-       HostAttribute (double value) : size (0), type (kFloat) { v.floatValue = value; }\r
-       HostAttribute (const TChar* value, uint32 size) : size (size), type (kString)\r
-       {\r
-               v.stringValue = new TChar[size];\r
-               memcpy (v.stringValue, value, size * sizeof (TChar));\r
-       }\r
-       HostAttribute (const void* value, uint32 size) : size (size), type (kBinary)\r
-       {\r
-               v.binaryValue = new char[size];\r
-               memcpy (v.binaryValue, value, size);\r
-       }\r
-       ~HostAttribute ()\r
-       {\r
-               if (size)\r
-                       delete[] v.binaryValue;\r
-       }\r
-\r
-       int64 intValue () const { return v.intValue; }\r
-       double floatValue () const { return v.floatValue; }\r
-       const TChar* stringValue (uint32& stringSize)\r
-       {\r
-               stringSize = size;\r
-               return v.stringValue;\r
-       }\r
-       const void* binaryValue (uint32& binarySize)\r
-       {\r
-               binarySize = size;\r
-               return v.binaryValue;\r
-       }\r
-\r
-       Type getType () const { return type; }\r
-\r
-protected:\r
-       union v\r
-       {\r
-               int64 intValue;\r
-               double floatValue;\r
-               TChar* stringValue;\r
-               char* binaryValue;\r
-       } v;\r
-       uint32 size;\r
-       Type type;\r
-};\r
-\r
-typedef std::map<String, HostAttribute*>::iterator mapIterator;\r
-\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (HostAttributeList, IAttributeList, IAttributeList::iid)\r
-//-----------------------------------------------------------------------------\r
-HostAttributeList::HostAttributeList ()\r
-{\r
-       FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-HostAttributeList::~HostAttributeList ()\r
-{\r
-       std::map<String, HostAttribute*>::reverse_iterator it = list.rbegin ();\r
-       while (it != list.rend ())\r
-       {\r
-               delete it->second;\r
-               it++;\r
-       }\r
-       FUNKNOWN_DTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void HostAttributeList::removeAttrID (AttrID aid)\r
-{\r
-       mapIterator it = list.find (aid);\r
-       if (it != list.end ())\r
-       {\r
-               delete it->second;\r
-               list.erase (it);\r
-       }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setInt (AttrID aid, int64 value)\r
-{\r
-       removeAttrID (aid);\r
-       list[aid] = new HostAttribute (value);\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getInt (AttrID aid, int64& value)\r
-{\r
-       mapIterator it = list.find (aid);\r
-       if (it != list.end () && it->second)\r
-       {\r
-               value = it->second->intValue ();\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setFloat (AttrID aid, double value)\r
-{\r
-       removeAttrID (aid);\r
-       list[aid] = new HostAttribute (value);\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getFloat (AttrID aid, double& value)\r
-{\r
-       mapIterator it = list.find (aid);\r
-       if (it != list.end () && it->second)\r
-       {\r
-               value = it->second->floatValue ();\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setString (AttrID aid, const TChar* string)\r
-{\r
-       removeAttrID (aid);\r
-       list[aid] = new HostAttribute (string, String (const_cast<TChar*> (string)).length ());\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getString (AttrID aid, TChar* string, uint32 size)\r
-{\r
-       mapIterator it = list.find (aid);\r
-       if (it != list.end () && it->second)\r
-       {\r
-               uint32 stringSize = 0;\r
-               const TChar* _string = it->second->stringValue (stringSize);\r
-               memcpy (string, _string, std::min<uint32> (stringSize, size) * sizeof (TChar));\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setBinary (AttrID aid, const void* data, uint32 size)\r
-{\r
-       removeAttrID (aid);\r
-       list[aid] = new HostAttribute (data, size);\r
-       return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getBinary (AttrID aid, const void*& data, uint32& size)\r
-{\r
-       mapIterator it = list.find (aid);\r
-       if (it != list.end () && it->second)\r
-       {\r
-               data = it->second->binaryValue (size);\r
-               return kResultTrue;\r
-       }\r
-       size = 0;\r
-       return kResultFalse;\r
-}\r
-}\r
-} // namespace\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h
deleted file mode 100644 (file)
index e10ebcd..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/hosting/hostclasses.h\r
-// Created by  : Steinberg, 03/05/2008.\r
-// Description : VST 3 hostclasses, example implementations for IHostApplication, IAttributeList and IMessage\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivsthostapplication.h"\r
-\r
-#include "base/source/fstring.h"\r
-\r
-#include <map>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Implementation's example of IHostApplication.\r
-\ingroup hostingBase\r
-*/\r
-class HostApplication : public IHostApplication\r
-{\r
-public:\r
-       HostApplication () { FUNKNOWN_CTOR }\r
-       virtual ~HostApplication () { FUNKNOWN_DTOR }\r
-\r
-       tresult PLUGIN_API getName (String128 name) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API createInstance (TUID cid, TUID _iid, void** obj) SMTG_OVERRIDE;\r
-\r
-       DECLARE_FUNKNOWN_METHODS\r
-};\r
-\r
-class HostAttribute;\r
-//------------------------------------------------------------------------\r
-/** Implementation's example of IAttributeList.\r
-\ingroup hostingBase\r
-*/\r
-class HostAttributeList : public IAttributeList\r
-{\r
-public:\r
-       HostAttributeList ();\r
-       virtual ~HostAttributeList ();\r
-\r
-       tresult PLUGIN_API setInt (AttrID aid, int64 value) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getInt (AttrID aid, int64& value) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setFloat (AttrID aid, double value) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getFloat (AttrID aid, double& value) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setString (AttrID aid, const TChar* string) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getString (AttrID aid, TChar* string, uint32 size) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setBinary (AttrID aid, const void* data, uint32 size) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getBinary (AttrID aid, const void*& data, uint32& size) SMTG_OVERRIDE;\r
-\r
-       DECLARE_FUNKNOWN_METHODS\r
-protected:\r
-       void removeAttrID (AttrID aid);\r
-       std::map<String, HostAttribute*> list;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Implementation's example of IMessage.\r
-\ingroup hostingBase\r
-*/\r
-class HostMessage : public IMessage\r
-{\r
-public:\r
-       HostMessage ();\r
-       virtual ~HostMessage ();\r
-\r
-       const char* PLUGIN_API getMessageID () SMTG_OVERRIDE;\r
-       void PLUGIN_API setMessageID (const char* messageID) SMTG_OVERRIDE;\r
-       IAttributeList* PLUGIN_API getAttributes () SMTG_OVERRIDE;\r
-\r
-       DECLARE_FUNKNOWN_METHODS\r
-protected:\r
-       char* messageId;\r
-       HostAttributeList* attributeList;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp
deleted file mode 100644 (file)
index a624e5e..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstbus.cpp\r
-// Created by  : Steinberg, 03/2008\r
-// Description : VST Bus Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstbus.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Bus Implementation\r
-//------------------------------------------------------------------------\r
-Bus::Bus (const TChar* _name, BusType _busType, int32 _flags)\r
-: name (_name), busType (_busType), flags (_flags), active (false)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool Bus::getInfo (BusInfo& info)\r
-{\r
-       name.copyTo16 (info.name, 0, str16BufferSize (info.name) - 1);\r
-       info.busType = busType;\r
-       info.flags = flags;\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// EventBus Implementation\r
-//------------------------------------------------------------------------\r
-EventBus::EventBus (const TChar* name, BusType busType, int32 flags, int32 channelCount)\r
-: Bus (name, busType, flags), channelCount (channelCount)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool EventBus::getInfo (BusInfo& info)\r
-{\r
-       info.channelCount = channelCount;\r
-       return Bus::getInfo (info);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// AudioBus Implementation\r
-//------------------------------------------------------------------------\r
-AudioBus::AudioBus (const TChar* name, BusType busType, int32 flags, SpeakerArrangement arr)\r
-: Bus (name, busType, flags), speakerArr (arr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool AudioBus::getInfo (BusInfo& info)\r
-{\r
-       info.channelCount = SpeakerArr::getChannelCount (speakerArr);\r
-       return Bus::getInfo (info);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// BusList Implementation\r
-//------------------------------------------------------------------------\r
-BusList::BusList (MediaType type, BusDirection dir) : type (type), direction (dir)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h
deleted file mode 100644 (file)
index 4cd2bac..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstbus.h\r
-// Created by  : Steinberg, 03/2008\r
-// Description : VST Bus Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "base/source/fstring.h"\r
-#include "pluginterfaces/vst/ivstcomponent.h"\r
-#include "pluginterfaces/vst/ivstaudioprocessor.h"\r
-\r
-#include <vector>\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Bus object.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class Bus: public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Constructor. */\r
-       Bus (const TChar* name, BusType busType, int32 flags);\r
-\r
-       /** Returns true if the bus is active. */\r
-       TBool isActive () const { return active; }\r
-\r
-       /** Activates the bus. */\r
-       void setActive (TBool state) { active = state; }\r
-\r
-       /** Sets a new name for this bus. */\r
-       void setName (String newName) { name = newName; }\r
-\r
-       /** Sets a new busType for this bus. */\r
-       void setBusType (BusType newBusType) { busType = newBusType; }\r
-\r
-       /** Sets a new flags for this bus. */\r
-       void setFlags (uint32 newFlags) { flags = newFlags; }\r
-\r
-       /** Gets the BusInfo of this bus. */\r
-       virtual bool getInfo (BusInfo&);\r
-\r
-       OBJ_METHODS (Vst::Bus, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       String name;                            ///< name\r
-       BusType busType;                        ///< kMain or kAux, see \ref BusTypes\r
-       int32 flags;                            ///< flags, see \ref BusFlags\r
-       TBool active;                           ///< activation state\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of an Event Bus.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class EventBus: public Bus\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Constructor of an EventBus. */\r
-       EventBus (const TChar* name, BusType busType, int32 flags, int32 channelCount);\r
-\r
-       //---from Bus-------\r
-       /** Gets the BusInfo associated to this Event bus. */\r
-       bool getInfo (BusInfo& info) SMTG_OVERRIDE;\r
-\r
-       OBJ_METHODS (Vst::EventBus, Vst::Bus);\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       int32 channelCount;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of an Audio Bus.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class AudioBus: public Bus\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       AudioBus (const TChar* name, BusType busType, int32 flags, SpeakerArrangement arr);\r
-\r
-       /** Gets the speaker arrangement defining this Audio bus. */\r
-       SpeakerArrangement getArrangement () const { return speakerArr; }\r
-\r
-       /** Sets the speaker arrangement defining this Audio bus. */\r
-       void setArrangement (const SpeakerArrangement& arr) { speakerArr = arr; }\r
-\r
-       //---from Bus---------------------\r
-       /** Gets the BusInfo associated to this Audio bus. */\r
-       bool getInfo (BusInfo& info) SMTG_OVERRIDE;\r
-\r
-       OBJ_METHODS (Vst::AudioBus, Vst::Bus)\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       SpeakerArrangement speakerArr;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** List of Buses.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class BusList: public FObject, public std::vector<IPtr<Vst::Bus> >\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Constructor. */\r
-       BusList (MediaType type, BusDirection dir);\r
-\r
-       /** Returns the BusList Type. See \ref MediaType */\r
-       MediaType getType () const { return type; }\r
-\r
-       /** Returns the BusList direction. See \ref BusDirection */\r
-       BusDirection getDirection () const { return direction; }\r
-\r
-       OBJ_METHODS (Vst::BusList, FObject);\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       MediaType type;\r
-       BusDirection direction;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp
deleted file mode 100644 (file)
index 4ee4cf2..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstcomponent.cpp\r
-// Created by  : Steinberg, 04/2005\r
-// Description : Basic VST Plug-in Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstcomponent.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Component Implementation\r
-//------------------------------------------------------------------------\r
-Component::Component ()\r
-: audioInputs (kAudio, kInput)\r
-, audioOutputs (kAudio, kOutput)\r
-, eventInputs (kEvent, kInput)\r
-, eventOutputs (kEvent, kOutput)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::initialize (FUnknown* context)\r
-{\r
-       return ComponentBase::initialize (context);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::terminate ()\r
-{\r
-       // remove all buses\r
-       removeAllBusses ();\r
-\r
-       return ComponentBase::terminate ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-BusList* Component::getBusList (MediaType type, BusDirection dir)\r
-{\r
-       if (type == kAudio)\r
-               return dir == kInput ? &audioInputs : &audioOutputs;\r
-       else if (type == kEvent)\r
-               return dir == kInput ? &eventInputs : &eventOutputs;\r
-       return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::removeAudioBusses ()\r
-{\r
-       audioInputs.clear ();\r
-       audioOutputs.clear ();\r
-\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::removeEventBusses ()\r
-{\r
-       eventInputs.clear ();\r
-       eventOutputs.clear ();\r
-\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::removeAllBusses ()\r
-{\r
-       removeAudioBusses ();\r
-       removeEventBusses ();\r
-\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getControllerClassId (TUID classID)\r
-{\r
-       if (controllerClass.isValid ())\r
-       {\r
-               controllerClass.toTUID (classID);\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::setIoMode (IoMode /*mode*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API Component::getBusCount (MediaType type, BusDirection dir)\r
-{\r
-       BusList* busList = getBusList (type, dir);\r
-       return busList ? static_cast<int32> (busList->size ()) : 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getBusInfo (MediaType type, BusDirection dir, int32 index,\r
-                                          BusInfo& info)\r
-{\r
-       if (index < 0)\r
-               return kInvalidArgument;\r
-       BusList* busList = getBusList (type, dir);\r
-       if (busList == nullptr)\r
-               return kInvalidArgument;\r
-       if (index >= static_cast<int32> (busList->size ()))\r
-               return kInvalidArgument;\r
-\r
-       Bus* bus = busList->at (index);\r
-       info.mediaType = type;\r
-       info.direction = dir;\r
-       if (bus->getInfo (info))\r
-               return kResultTrue;\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getRoutingInfo (RoutingInfo& /*inInfo*/, RoutingInfo& /*outInfo*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::activateBus (MediaType type, BusDirection dir, int32 index,\r
-                                           TBool state)\r
-{\r
-       if (index < 0)\r
-               return kInvalidArgument;\r
-       BusList* busList = getBusList (type, dir);\r
-       if (busList == nullptr)\r
-               return kInvalidArgument;\r
-       if (index >= static_cast<int32> (busList->size ()))\r
-               return kInvalidArgument;\r
-\r
-       Bus* bus = busList->at (index);\r
-       bus->setActive (state);\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::setActive (TBool /*state*/)\r
-{\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::setState (IBStream* /*state*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getState (IBStream* /*state*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::renameBus (MediaType type, BusDirection dir, int32 index,\r
-                              const String128 newName)\r
-{\r
-       if (index < 0)\r
-               return kInvalidArgument;\r
-       BusList* busList = getBusList (type, dir);\r
-       if (busList == nullptr)\r
-               return kInvalidArgument;\r
-       if (index >= static_cast<int32> (busList->size ()))\r
-               return kInvalidArgument;\r
-\r
-       Bus* bus = busList->at (index);\r
-       bus->setName (newName);\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// Helpers Implementation\r
-//------------------------------------------------------------------------\r
-tresult getSpeakerChannelIndex (SpeakerArrangement arrangement, uint64 speaker, int32& channel)\r
-{\r
-       channel = SpeakerArr::getSpeakerIndex (speaker, arrangement);\r
-       return channel < 0 ? kResultFalse : kResultTrue;\r
-}\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h
deleted file mode 100644 (file)
index 96645bc..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstcomponent.h\r
-// Created by  : Steinberg, 04/2005\r
-// Description : Basic VST Plug-in Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "public.sdk/source/vst/vstcomponentbase.h"\r
-#include "public.sdk/source/vst/vstbus.h"\r
-#include "pluginterfaces/vst/ivstcomponent.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Default implementation for a VST 3 Component.\r
-\ingroup vstClasses\r
-Can be used as base class for a VST 3 component implementation. */\r
-//------------------------------------------------------------------------\r
-class Component : public ComponentBase, public IComponent\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       /** Constructor */\r
-       Component ();\r
-\r
-       //---Internal Methods-------\r
-       /** Sets the controller Class ID associated to its component. */\r
-       void setControllerClass (const FUID& cid) { controllerClass = cid; }\r
-\r
-       /** Removes all Audio Buses. */\r
-       tresult removeAudioBusses ();\r
-\r
-       /** Removes all Event Buses. */\r
-       tresult removeEventBusses ();\r
-\r
-       /** Renames a specific bus. Do not forget to inform the host about this (see \ref\r
-        * IComponentHandler::restartComponent (kIoTitlesChanged)). */\r
-       tresult renameBus (MediaType type, BusDirection dir, int32 index, const String128 newName);\r
-\r
-       //---from IComponent--------\r
-       tresult PLUGIN_API getControllerClassId (TUID classID) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setIoMode (IoMode mode) SMTG_OVERRIDE;\r
-       int32 PLUGIN_API getBusCount (MediaType type, BusDirection dir) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getBusInfo (MediaType type, BusDirection dir, int32 index, BusInfo& info) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getRoutingInfo (RoutingInfo& inInfo, RoutingInfo& outInfo) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API activateBus (MediaType type, BusDirection dir, int32 index, TBool state) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setActive (TBool state) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setState (IBStream* state) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getState (IBStream* state) SMTG_OVERRIDE;\r
-\r
-       //---from ComponentBase------\r
-       tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API terminate () SMTG_OVERRIDE;\r
-\r
-       //---Interface---------\r
-       OBJ_METHODS (Component, ComponentBase)\r
-       DEFINE_INTERFACES\r
-               DEF_INTERFACE (IComponent)\r
-       END_DEFINE_INTERFACES (ComponentBase)\r
-       REFCOUNT_METHODS (ComponentBase)\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       FUID controllerClass;\r
-       BusList audioInputs;\r
-       BusList audioOutputs;\r
-       BusList eventInputs;\r
-       BusList eventOutputs;\r
-\r
-       BusList* getBusList (MediaType type, BusDirection dir);\r
-       tresult removeAllBusses ();\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// some Helper functions....\r
-//------------------------------------------------------------------------\r
-\r
-/** Gets the channel index of a given speaker in a arrangement, returns kResultFalse if speaker not\r
- * part of the arrangement else returns kResultTrue. */\r
-tresult getSpeakerChannelIndex (SpeakerArrangement arrangement, uint64 speaker, int32& channel);\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp
deleted file mode 100644 (file)
index e46de72..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstcomponentbase.cpp\r
-// Created by  : Steinberg, 05/2005\r
-// Description : Base class for VST Component and Edit Controller\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstcomponentbase.h"\r
-#include "base/source/fstring.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// ComponentBase Implementation\r
-//------------------------------------------------------------------------\r
-ComponentBase::ComponentBase () : hostContext (nullptr), peerConnection (nullptr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ComponentBase::~ComponentBase ()\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::initialize (FUnknown* context)\r
-{\r
-       // check if already initialized\r
-       if (hostContext)\r
-               return kResultFalse;\r
-\r
-       hostContext = context;\r
-       if (hostContext)\r
-               hostContext->addRef ();\r
-\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::terminate ()\r
-{\r
-       // release host interfaces\r
-       if (hostContext)\r
-       {\r
-               hostContext->release ();\r
-               hostContext = nullptr;\r
-       }\r
-\r
-       // in case host did not disconnect us,\r
-       // release peer now\r
-       if (peerConnection)\r
-       {\r
-               peerConnection->disconnect (this);\r
-               peerConnection->release ();\r
-               peerConnection = nullptr;\r
-       }\r
-\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::connect (IConnectionPoint* other)\r
-{\r
-       if (!other)\r
-               return kInvalidArgument;\r
-\r
-       // check if already connected\r
-       if (peerConnection)\r
-               return kResultFalse;\r
-\r
-       peerConnection = other;\r
-       peerConnection->addRef ();\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::disconnect (IConnectionPoint* other)\r
-{\r
-       if (peerConnection && other == peerConnection)\r
-       {\r
-               peerConnection->release ();\r
-               peerConnection = nullptr;\r
-               return kResultOk;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::notify (IMessage* message)\r
-{\r
-       if (!message)\r
-               return kInvalidArgument;\r
-\r
-       if (!strcmp (message->getMessageID (), "TextMessage"))\r
-       {\r
-               TChar string[256] = {0};\r
-               if (message->getAttributes ()->getString ("Text", string,\r
-                                                         sizeof (string) / sizeof (char16)) == kResultOk)\r
-               {\r
-                       String tmp (string);\r
-                       tmp.toMultiByte (kCP_Utf8);\r
-                       return receiveText (tmp.text8 ());\r
-               }\r
-       }\r
-\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-IMessage* ComponentBase::allocateMessage ()\r
-{\r
-       FUnknownPtr<IHostApplication> hostApp (hostContext);\r
-       if (hostApp)\r
-               return Vst::allocateMessage (hostApp);\r
-       return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ComponentBase::sendMessage (IMessage* message)\r
-{\r
-       if (message != nullptr && getPeer () != nullptr)\r
-               return getPeer ()->notify (message);\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ComponentBase::sendTextMessage (const char8* text)\r
-{\r
-       IMessage* message = allocateMessage ();\r
-       if (!message)\r
-               return kResultFalse;\r
-\r
-       FReleaser msgReleaser (message);\r
-       message->setMessageID ("TextMessage");\r
-       String tmp (text, kCP_Utf8);\r
-       if (tmp.length () >= 256)\r
-               tmp.remove (255);\r
-       message->getAttributes ()->setString ("Text", tmp.text16 ());\r
-       return sendMessage (message);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ComponentBase::receiveText (const char8* /*text*/)\r
-{\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h
deleted file mode 100644 (file)
index c8534e2..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstcomponentbase.h\r
-// Created by  : Steinberg, 05/2005\r
-// Description : Base class for Component and Edit Controller\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ipluginbase.h"\r
-#include "pluginterfaces/vst/ivstmessage.h"\r
-#include "pluginterfaces/vst/ivsthostapplication.h"\r
-#include "base/source/fobject.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Base class for VST 3 Component and Edit Controller.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class ComponentBase: public FObject,\r
-                                        public IPluginBase,\r
-                        public IConnectionPoint\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       ComponentBase ();\r
-       virtual ~ComponentBase ();\r
-\r
-       //--- Internal Methods------\r
-       /** Returns the hostContext (set by the host during initialize call). */\r
-       FUnknown* getHostContext () { return hostContext; }\r
-\r
-       /** Returns the peer for the messaging communication (you can only use IConnectionPoint::notify\r
-        * for communicate between peers, do not try to cast peerConnection. */\r
-       IConnectionPoint* getPeer () { return peerConnection; }\r
-\r
-       /** Allocates a message instance (don't forget to release it). */\r
-       IMessage* allocateMessage ();\r
-\r
-       /** Sends the given message to the peer. */\r
-       tresult sendMessage (IMessage* message);\r
-\r
-       /** Sends a simple text message to the peer (max 255 characters). Text is interpreted as UTF-8.\r
-        */\r
-       tresult sendTextMessage (const char8* text);\r
-\r
-       /** Receives a simple text message from the peer (max 255 characters). Text is UTF-8 encoded. */\r
-       virtual tresult receiveText (const char8* text);\r
-\r
-       //---from IPluginBase------\r
-       tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API terminate () SMTG_OVERRIDE;\r
-\r
-       //---from IConnectionPoint-----------\r
-       tresult PLUGIN_API connect (IConnectionPoint* other) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API disconnect (IConnectionPoint* other) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API notify (IMessage* message) SMTG_OVERRIDE;\r
-\r
-       //---Interface------\r
-       OBJ_METHODS (ComponentBase, FObject)\r
-       DEFINE_INTERFACES\r
-               DEF_INTERFACE (IPluginBase)\r
-               DEF_INTERFACE (IConnectionPoint)\r
-       END_DEFINE_INTERFACES (FObject)\r
-       REFCOUNT_METHODS (FObject)\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       FUnknown* hostContext;\r
-       IConnectionPoint* peerConnection;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp
deleted file mode 100644 (file)
index 6390d3a..0000000
+++ /dev/null
@@ -1,721 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vsteditcontroller.cpp\r
-// Created by  : Steinberg, 04/2005\r
-// Description : VST Edit Controller Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "public.sdk/source/vst/vsteditcontroller.h"\r
-#include "base/source/updatehandler.h"\r
-#include "pluginterfaces/base/ustring.h"\r
-\r
-#include <stdio.h>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-KnobMode EditController::hostKnobMode = kCircularMode;\r
-\r
-//------------------------------------------------------------------------\r
-// EditController Implementation\r
-//------------------------------------------------------------------------\r
-EditController::EditController () : componentHandler (nullptr), componentHandler2 (nullptr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::initialize (FUnknown* context)\r
-{\r
-       return ComponentBase::initialize (context);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::terminate ()\r
-{\r
-       parameters.removeAll ();\r
-\r
-       if (componentHandler)\r
-       {\r
-               componentHandler->release ();\r
-               componentHandler = nullptr;\r
-       }\r
-\r
-       if (componentHandler2)\r
-       {\r
-               componentHandler2->release ();\r
-               componentHandler2 = nullptr;\r
-       }\r
-\r
-       return ComponentBase::terminate ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setComponentState (IBStream* /*state*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setState (IBStream* /*state*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getState (IBStream* /*state*/)\r
-{\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API EditController::getParameterCount ()\r
-{\r
-       return parameters.getParameterCount ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getParameterInfo (int32 paramIndex, ParameterInfo& info)\r
-{\r
-       Parameter* parameter = parameters.getParameterByIndex (paramIndex);\r
-       if (parameter)\r
-       {\r
-               info = parameter->getInfo ();\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getParamStringByValue (ParamID tag, ParamValue valueNormalized,\r
-                                                          String128 string)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               parameter->toString (valueNormalized, string);\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getParamValueByString (ParamID tag, TChar* string,\r
-                                                          ParamValue& valueNormalized)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               if (parameter->fromString (string, valueNormalized))\r
-               {\r
-                       return kResultTrue;\r
-               }\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue PLUGIN_API EditController::normalizedParamToPlain (ParamID tag,\r
-                                                              ParamValue valueNormalized)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               return parameter->toPlain (valueNormalized);\r
-       }\r
-       return valueNormalized;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue PLUGIN_API EditController::plainParamToNormalized (ParamID tag, ParamValue plainValue)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               return parameter->toNormalized (plainValue);\r
-       }\r
-       return plainValue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue PLUGIN_API EditController::getParamNormalized (ParamID tag)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               return parameter->getNormalized ();\r
-       }\r
-       return 0.;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setParamNormalized (ParamID tag, ParamValue value)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               parameter->setNormalized (value);\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setComponentHandler (IComponentHandler* newHandler)\r
-{\r
-       if (componentHandler == newHandler)\r
-       {\r
-               return kResultTrue;\r
-       }\r
-\r
-       if (componentHandler)\r
-       {\r
-               componentHandler->release ();\r
-       }\r
-\r
-       componentHandler = newHandler;\r
-       if (componentHandler)\r
-       {\r
-               componentHandler->addRef ();\r
-       }\r
-\r
-       // try to get the extended version\r
-       if (componentHandler2)\r
-       {\r
-               componentHandler2->release ();\r
-               componentHandler2 = nullptr;\r
-       }\r
-\r
-       if (newHandler)\r
-       {\r
-               newHandler->queryInterface (IComponentHandler2::iid, (void**)&componentHandler2);\r
-       }\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::beginEdit (ParamID tag)\r
-{\r
-       if (componentHandler)\r
-       {\r
-               return componentHandler->beginEdit (tag);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::performEdit (ParamID tag, ParamValue valueNormalized)\r
-{\r
-       if (componentHandler)\r
-       {\r
-               return componentHandler->performEdit (tag, valueNormalized);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::endEdit (ParamID tag)\r
-{\r
-       if (componentHandler)\r
-       {\r
-               return componentHandler->endEdit (tag);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::startGroupEdit ()\r
-{\r
-       if (componentHandler2)\r
-       {\r
-               return componentHandler2->startGroupEdit ();\r
-       }\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::finishGroupEdit ()\r
-{\r
-       if (componentHandler2)\r
-       {\r
-               return componentHandler2->finishGroupEdit ();\r
-       }\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::getParameterInfoByTag (ParamID tag, ParameterInfo& info)\r
-{\r
-       Parameter* parameter = getParameterObject (tag);\r
-       if (parameter)\r
-       {\r
-               info = parameter->getInfo ();\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::setDirty (TBool state)\r
-{\r
-       if (componentHandler2)\r
-       {\r
-               return componentHandler2->setDirty (state);\r
-       }\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::requestOpenEditor (FIDString name)\r
-{\r
-       if (componentHandler2)\r
-       {\r
-               return componentHandler2->requestOpenEditor (name);\r
-       }\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// EditorView Implementation\r
-//------------------------------------------------------------------------\r
-EditorView::EditorView (EditController* controller, ViewRect* size)\r
-: CPluginView (size), controller (controller)\r
-{\r
-       if (controller)\r
-       {\r
-               controller->addRef ();\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-EditorView::~EditorView ()\r
-{\r
-       if (controller)\r
-       {\r
-               controller->editorDestroyed (this);\r
-               controller->release ();\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void EditorView::attachedToParent ()\r
-{\r
-       if (controller)\r
-       {\r
-               controller->editorAttached (this);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void EditorView::removedFromParent ()\r
-{\r
-       if (controller)\r
-       {\r
-               controller->editorRemoved (this);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// EditControllerEx1 implementation\r
-//------------------------------------------------------------------------\r
-EditControllerEx1::EditControllerEx1 () : selectedUnit (kRootUnitId)\r
-{\r
-       UpdateHandler::instance ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-EditControllerEx1::~EditControllerEx1 ()\r
-{\r
-       for (ProgramListVector::const_iterator it = programLists.begin (), end = programLists.end ();\r
-            it != end; ++it)\r
-       {\r
-               if (*it)\r
-                       (*it)->removeDependent (this);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool EditControllerEx1::addUnit (Unit* unit)\r
-{\r
-       units.push_back (IPtr<Unit> (unit, false));\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/)\r
-{\r
-       Unit* unit = units.at (unitIndex);\r
-       if (unit)\r
-       {\r
-               info = unit->getInfo ();\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditControllerEx1::notifyUnitSelection ()\r
-{\r
-       tresult result = kResultFalse;\r
-       FUnknownPtr<IUnitHandler> unitHandler (componentHandler);\r
-       if (unitHandler)\r
-               result = unitHandler->notifyUnitSelection (selectedUnit);\r
-       return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool EditControllerEx1::addProgramList (ProgramList* list)\r
-{\r
-       programIndexMap[list->getID ()] = programLists.size ();\r
-       programLists.push_back (IPtr<ProgramList> (list, false));\r
-       list->addDependent (this);\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ProgramList* EditControllerEx1::getProgramList (ProgramListID listId) const\r
-{\r
-       ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
-       return it == programIndexMap.end () ? nullptr : programLists[it->second];\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditControllerEx1::notifyProgramListChange (ProgramListID listId, int32 programIndex)\r
-{\r
-       tresult result = kResultFalse;\r
-       FUnknownPtr<IUnitHandler> unitHandler (componentHandler);\r
-       if (unitHandler)\r
-               result = unitHandler->notifyProgramListChange (listId, programIndex);\r
-       return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API EditControllerEx1::getProgramListCount ()\r
-{\r
-       return static_cast<int32> (programLists.size ());\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramListInfo (int32 listIndex,\r
-                                                          ProgramListInfo& info /*out*/)\r
-{\r
-       if (listIndex < 0 || listIndex >= static_cast<int32> (programLists.size ()))\r
-               return kResultFalse;\r
-       info = programLists[listIndex]->getInfo ();\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramName (ProgramListID listId, int32 programIndex,\r
-                                                      String128 name /*out*/)\r
-{\r
-       ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
-       if (it != programIndexMap.end ())\r
-       {\r
-               return programLists[it->second]->getProgramName (programIndex, name);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditControllerEx1::setProgramName (ProgramListID listId, int32 programIndex,\r
-                                           const String128 name /*in*/)\r
-{\r
-       ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
-       if (it != programIndexMap.end ())\r
-       {\r
-               return programLists[it->second]->setProgramName (programIndex, name);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramInfo (ProgramListID listId, int32 programIndex,\r
-                                                      CString attributeId /*in*/,\r
-                                                      String128 attributeValue /*out*/)\r
-{\r
-       ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
-       if (it != programIndexMap.end ())\r
-       {\r
-               return programLists[it->second]->getProgramInfo (programIndex, attributeId, attributeValue);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::hasProgramPitchNames (ProgramListID listId,\r
-                                                            int32 programIndex)\r
-{\r
-       ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
-       if (it != programIndexMap.end ())\r
-       {\r
-               return programLists[it->second]->hasPitchNames (programIndex);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramPitchName (ProgramListID listId, int32 programIndex,\r
-                                                           int16 midiPitch, String128 name /*out*/)\r
-{\r
-       ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
-       if (it != programIndexMap.end ())\r
-       {\r
-               return programLists[it->second]->getPitchName (programIndex, midiPitch, name);\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void PLUGIN_API EditControllerEx1::update (FUnknown* changedUnknown, int32 /*message*/)\r
-{\r
-       ProgramList* programList = FCast<ProgramList> (changedUnknown);\r
-       if (programList)\r
-       {\r
-               FUnknownPtr<IUnitHandler> unitHandler (componentHandler);\r
-               if (unitHandler)\r
-                       unitHandler->notifyProgramListChange (programList->getID (), kAllProgramInvalid);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// Unit implementation\r
-//------------------------------------------------------------------------\r
-Unit::Unit ()\r
-{\r
-       memset (&info, 0, sizeof (UnitInfo));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Unit::Unit (const String128 name, UnitID unitId, UnitID parentUnitId, ProgramListID programListId)\r
-{\r
-       setName (name);\r
-       info.id = unitId;\r
-       info.parentUnitId = parentUnitId;\r
-       info.programListId = programListId;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Unit::Unit (const UnitInfo& info) : info (info)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Unit::setName (const String128 newName)\r
-{\r
-       UString128 (newName).copyTo (info.name, 128);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ProgramList implementation\r
-//------------------------------------------------------------------------\r
-ProgramList::ProgramList (const String128 name, ProgramListID listId, UnitID unitId)\r
-: unitId (unitId), parameter (nullptr)\r
-{\r
-       UString128 (name).copyTo (info.name, 128);\r
-       info.id = listId;\r
-       info.programCount = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ProgramList::ProgramList (const ProgramList& programList)\r
-: info (programList.info)\r
-, unitId (programList.unitId)\r
-, programNames (programList.programNames)\r
-, parameter (nullptr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 ProgramList::addProgram (const String128 name)\r
-{\r
-       ++info.programCount;\r
-       programNames.push_back (name);\r
-       programInfos.push_back (ProgramInfoVector::value_type ());\r
-       return static_cast<int32> (programNames.size ()) - 1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool ProgramList::setProgramInfo (int32 programIndex, CString attributeId, const String128 value)\r
-{\r
-       if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
-       {\r
-               programInfos.at (programIndex).insert (std::make_pair (attributeId, value));\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ProgramList::getProgramInfo (int32 programIndex, CString attributeId,\r
-                                     String128 value /*out*/)\r
-{\r
-       if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
-       {\r
-               StringMap::const_iterator it = programInfos[programIndex].find (attributeId);\r
-               if (it != programInfos[programIndex].end ())\r
-               {\r
-                       if (!it->second.isEmpty ())\r
-                       {\r
-                               it->second.copyTo16 (value, 0, 128);\r
-                               return kResultTrue;\r
-                       }\r
-               }\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ProgramList::getProgramName (int32 programIndex, String128 name /*out*/)\r
-{\r
-       if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
-       {\r
-               programNames.at (programIndex).copyTo16 (name, 0, 128);\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ProgramList::setProgramName (int32 programIndex, const String128 name /*in*/)\r
-{\r
-       if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
-       {\r
-               programNames.at (programIndex) = name;\r
-               if (parameter)\r
-               {\r
-                       static_cast<StringListParameter*> (parameter)->replaceString (programIndex, name);\r
-               }\r
-               return kResultTrue;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ProgramList::getParameter ()\r
-{\r
-       if (parameter == nullptr)\r
-       {\r
-               StringListParameter* listParameter = new StringListParameter (\r
-                   info.name, info.id, 0,\r
-                   ParameterInfo::kCanAutomate | ParameterInfo::kIsList | ParameterInfo::kIsProgramChange,\r
-                   unitId);\r
-               for (StringVector::const_iterator it = programNames.begin (), end = programNames.end ();\r
-                    it != end; ++it)\r
-               {\r
-                       listParameter->appendString (*it);\r
-               }\r
-               parameter = listParameter;\r
-       }\r
-       return parameter;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ProgramListWithPitchNames implementation\r
-//-----------------------------------------------------------------------------\r
-ProgramListWithPitchNames::ProgramListWithPitchNames (const String128 name, ProgramListID listId,\r
-                                                      UnitID unitId)\r
-: ProgramList (name, listId, unitId)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ProgramListWithPitchNames::addProgram (const String128 name)\r
-{\r
-       int32 index = ProgramList::addProgram (name);\r
-       if (index >= 0)\r
-               pitchNames.push_back (PitchNamesVector::value_type ());\r
-       return index;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ProgramListWithPitchNames::setPitchName (int32 programIndex, int16 pitch,\r
-                                              const String128 pitchName)\r
-{\r
-       if (programIndex < 0 || programIndex >= getCount ())\r
-               return false;\r
-\r
-       bool nameChanged = true;\r
-       std::pair<PitchNameMap::iterator, bool> res =\r
-           pitchNames[programIndex].insert (std::make_pair (pitch, pitchName));\r
-       if (!res.second)\r
-       {\r
-               if (res.first->second == pitchName)\r
-                       nameChanged = false;\r
-               else\r
-                       res.first->second = pitchName;\r
-       }\r
-\r
-       if (nameChanged)\r
-               changed ();\r
-       return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ProgramListWithPitchNames::removePitchName (int32 programIndex, int16 pitch)\r
-{\r
-       bool result = false;\r
-       if (programIndex >= 0 && programIndex < getCount ())\r
-       {\r
-               result = pitchNames.at (programIndex).erase (pitch) != 0;\r
-       }\r
-       if (result)\r
-               changed ();\r
-       return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult ProgramListWithPitchNames::hasPitchNames (int32 programIndex)\r
-{\r
-       if (programIndex >= 0 && programIndex < getCount ())\r
-               return pitchNames.at (programIndex).empty () ? kResultFalse : kResultTrue;\r
-       return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult ProgramListWithPitchNames::getPitchName (int32 programIndex, int16 midiPitch,\r
-                                                 String128 name /*out*/)\r
-{\r
-       if (programIndex >= 0 && programIndex < getCount ())\r
-       {\r
-               PitchNameMap::const_iterator it = pitchNames[programIndex].find (midiPitch);\r
-               if (it != pitchNames[programIndex].end ())\r
-               {\r
-                       it->second.copyTo16 (name, 0, 128);\r
-                       return kResultTrue;\r
-               }\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h
deleted file mode 100644 (file)
index 88adc9b..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vsteditcontroller.h\r
-// Created by  : Steinberg, 04/2005\r
-// Description : VST Edit Controller Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "public.sdk/source/vst/vstcomponentbase.h"\r
-#include "public.sdk/source/vst/vstparameters.h"\r
-#include "public.sdk/source/common/pluginview.h"\r
-#include "base/source/fstring.h"\r
-\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-#include <vector>\r
-#include <map>\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-class EditorView;\r
-\r
-//------------------------------------------------------------------------\r
-/** Default implementation for a VST 3 edit controller.\r
-\ingroup vstClasses\r
-Can be used as base class for a specific controller implementation */\r
-//------------------------------------------------------------------------\r
-class EditController: public ComponentBase,\r
-                                         public IEditController,\r
-                                         public IEditController2\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       EditController ();\r
-\r
-       //---from IEditController-------\r
-       tresult PLUGIN_API setComponentState (IBStream* state) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setState (IBStream* state) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getState (IBStream* state) SMTG_OVERRIDE;\r
-       int32 PLUGIN_API getParameterCount () SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getParameterInfo (int32 paramIndex, ParameterInfo& info) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getParamStringByValue (ParamID tag, ParamValue valueNormalized, String128 string) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getParamValueByString (ParamID tag, TChar* string, ParamValue& valueNormalized) SMTG_OVERRIDE;\r
-       ParamValue PLUGIN_API normalizedParamToPlain (ParamID tag, ParamValue valueNormalized) SMTG_OVERRIDE;\r
-       ParamValue PLUGIN_API plainParamToNormalized (ParamID tag, ParamValue plainValue) SMTG_OVERRIDE;\r
-       ParamValue PLUGIN_API getParamNormalized (ParamID tag) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setParamNormalized (ParamID tag, ParamValue value) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API setComponentHandler (IComponentHandler* handler) SMTG_OVERRIDE;\r
-       IPlugView* PLUGIN_API createView (FIDString /*name*/) SMTG_OVERRIDE {return nullptr;}\r
-\r
-       //---from IEditController2-------\r
-       tresult PLUGIN_API setKnobMode (KnobMode mode) SMTG_OVERRIDE { hostKnobMode = mode; return kResultTrue; }\r
-       tresult PLUGIN_API openHelp (TBool /*onlyCheck*/) SMTG_OVERRIDE {return kResultFalse;}\r
-       tresult PLUGIN_API openAboutBox (TBool /*onlyCheck*/) SMTG_OVERRIDE {return kResultFalse;}\r
-\r
-       //---from ComponentBase---------\r
-       tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API terminate  () SMTG_OVERRIDE;\r
-\r
-       //---Internal Methods-------\r
-       virtual tresult beginEdit (ParamID tag);        ///< to be called before a serie of performEdit\r
-       virtual tresult performEdit (ParamID tag, ParamValue valueNormalized); ///< will inform the host about the value change\r
-       virtual tresult endEdit (ParamID tag);          ///< to be called after a serie of performEdit\r
-       virtual tresult startGroupEdit ();                      ///< calls IComponentHandler2::startGroupEdit() if host supports it\r
-       virtual tresult finishGroupEdit ();                     ///< calls IComponentHandler2::finishGroupEdit() if host supports it\r
-\r
-       virtual void editorDestroyed (EditorView* /*editor*/) {}        ///< called from EditorView if it was destroyed\r
-       virtual void editorAttached (EditorView* /*editor*/) {}         ///< called from EditorView if it was attached to a parent\r
-       virtual void editorRemoved (EditorView* /*editor*/) {}          ///< called from EditorView if it was removed from a parent\r
-\r
-       static KnobMode getHostKnobMode () { return hostKnobMode; }     ///< return host knob mode\r
-\r
-       /** Gets for a given tag the parameter object. */\r
-       virtual Parameter* getParameterObject (ParamID tag) { return parameters.getParameter (tag); }\r
-\r
-       /** Gets for a given tag the parameter information. */\r
-       virtual tresult getParameterInfoByTag (ParamID tag, ParameterInfo& info);\r
-\r
-       /** Calls IComponentHandler2::setDirty (state) if host supports it. */\r
-       virtual tresult setDirty (TBool state);\r
-\r
-       /** Calls IComponentHandler2::requestOpenEditor (name) if host supports it. */\r
-       virtual tresult requestOpenEditor (FIDString name = ViewType::kEditor);\r
-\r
-       //---Accessor Methods-------\r
-       IComponentHandler* getComponentHandler () const { return componentHandler; }\r
-\r
-       //---Interface---------\r
-       OBJ_METHODS (EditController, ComponentBase)\r
-       DEFINE_INTERFACES\r
-               DEF_INTERFACE (IEditController)\r
-               DEF_INTERFACE (IEditController2)\r
-       END_DEFINE_INTERFACES (ComponentBase)\r
-       REFCOUNT_METHODS (ComponentBase)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       IComponentHandler* componentHandler;\r
-       IComponentHandler2* componentHandler2;\r
-\r
-       ParameterContainer parameters;\r
-\r
-       static KnobMode hostKnobMode;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** View related to an edit controller.\r
-\ingroup vstClasses  */\r
-//------------------------------------------------------------------------\r
-class EditorView : public CPluginView\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       EditorView (EditController* controller, ViewRect* size = nullptr);\r
-       virtual ~EditorView ();\r
-\r
-       /** Gets its controller part. */\r
-       EditController* getController () { return controller; }\r
-\r
-       //---from CPluginView-------------\r
-       void attachedToParent () SMTG_OVERRIDE;\r
-       void removedFromParent () SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       EditController* controller;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Unit element.\r
-\ingroup vstClasses  */\r
-//------------------------------------------------------------------------\r
-class Unit : public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       Unit (const String128 name, UnitID unitId, UnitID parentUnitId = kRootUnitId,\r
-             ProgramListID programListId = kNoProgramListId);\r
-       Unit (const UnitInfo& unit);\r
-\r
-       /** Returns its info. */\r
-       const UnitInfo& getInfo () const { return info; }\r
-\r
-       /** Returns its Unit ID. */\r
-       UnitID getID () const { return info.id; }\r
-\r
-       /** Sets a new Unit ID. */\r
-       void setID (UnitID newID) { info.id = newID; }\r
-\r
-       /** Returns its Unit Name. */\r
-       const TChar* getName () const { return info.name; }\r
-\r
-       /** Sets a new Unit Name. */\r
-       void setName (const String128 newName);\r
-\r
-       /** Returns its ProgramList ID. */\r
-       ProgramListID getProgramListID () const { return info.programListId; }\r
-\r
-       /** Sets a new ProgramList ID. */\r
-       void setProgramListID (ProgramListID newID) { info.programListId = newID; }\r
-\r
-       OBJ_METHODS (Unit, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       Unit ();\r
-       UnitInfo info;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** ProgramList element.\r
-\ingroup vstClasses  */\r
-//------------------------------------------------------------------------\r
-class ProgramList : public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       ProgramList (const String128 name, ProgramListID listId, UnitID unitId);\r
-       ProgramList (const ProgramList& programList);\r
-\r
-       const ProgramListInfo& getInfo () const { return info; }\r
-       ProgramListID getID () const { return info.id; }\r
-       const TChar* getName () const { return info.name; }\r
-       int32 getCount () const { return info.programCount; }\r
-\r
-       virtual tresult getProgramName (int32 programIndex, String128 name /*out*/);\r
-       virtual tresult setProgramName (int32 programIndex, const String128 name /*in*/);\r
-       virtual tresult getProgramInfo (int32 programIndex, CString attributeId,\r
-                                       String128 value /*out*/);\r
-       virtual tresult hasPitchNames (int32 programIndex)\r
-       {\r
-               (void)programIndex;\r
-               return kResultFalse;\r
-       }\r
-       virtual tresult getPitchName (int32 programIndex, int16 midiPitch, String128 name /*out*/)\r
-       {\r
-               (void)programIndex;\r
-               (void)midiPitch;\r
-               (void)name;\r
-               return kResultFalse;\r
-       }\r
-\r
-       /** Adds a program to the end of the list. returns the index of the program. */\r
-       virtual int32 addProgram (const String128 name);\r
-\r
-       /** Sets a program attribute value. */\r
-       virtual bool setProgramInfo (int32 programIndex, CString attributeId, const String128 value);\r
-\r
-       /** Creates and returns the program parameter. */\r
-       virtual Parameter* getParameter ();\r
-\r
-       OBJ_METHODS (ProgramList, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       typedef std::map<String, String> StringMap;\r
-       typedef std::vector<String> StringVector;\r
-       typedef std::vector<StringMap> ProgramInfoVector;\r
-       ProgramListInfo info;\r
-       UnitID unitId;\r
-       StringVector programNames;\r
-       ProgramInfoVector programInfos;\r
-       Parameter* parameter;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** ProgramListWithPitchNames element.\r
-\ingroup vstClasses  */\r
-//-----------------------------------------------------------------------------\r
-class ProgramListWithPitchNames : public ProgramList\r
-{\r
-public:\r
-       ProgramListWithPitchNames (const String128 name, ProgramListID listId, UnitID unitId);\r
-\r
-       /** Sets a name for the given program index and a given pitch. */\r
-       bool setPitchName (int32 programIndex, int16 pitch, const String128 pitchName);\r
-\r
-       /** Removes the PitchName entry for the given program index and a given pitch. Returns true if\r
-        * it was found and removed. */\r
-       bool removePitchName (int32 programIndex, int16 pitch);\r
-\r
-       //---from ProgramList---------\r
-       int32 addProgram (const String128 name) SMTG_OVERRIDE;\r
-       tresult hasPitchNames (int32 programIndex) SMTG_OVERRIDE;\r
-       tresult getPitchName (int32 programIndex, int16 midiPitch,\r
-                             String128 name /*out*/) SMTG_OVERRIDE;\r
-\r
-       OBJ_METHODS (ProgramListWithPitchNames, ProgramList)\r
-protected:\r
-       typedef std::map<int16, String> PitchNameMap;\r
-       typedef std::vector<PitchNameMap> PitchNamesVector;\r
-       PitchNamesVector pitchNames;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Advanced implementation (support IUnitInfo) for a VST 3 edit controller.\r
-\ingroup vstClasses\r
-- [extends EditController]\r
-*/\r
-//------------------------------------------------------------------------\r
-class EditControllerEx1 : public EditController, public IUnitInfo\r
-{\r
-public:\r
-       EditControllerEx1 ();\r
-       virtual ~EditControllerEx1 ();\r
-\r
-       /** Adds a given unit. */\r
-       bool addUnit (Unit* unit);\r
-\r
-       /** Adds a given program list. */\r
-       bool addProgramList (ProgramList* list);\r
-\r
-       /** Returns the ProgramList associated to a given listId. */\r
-       ProgramList* getProgramList (ProgramListID listId) const;\r
-\r
-       /** Notifies the host about program list changes. */\r
-       tresult notifyProgramListChange (ProgramListID listId, int32 programIndex = kAllProgramInvalid);\r
-\r
-       //---from IUnitInfo------------------\r
-       int32 PLUGIN_API getUnitCount () SMTG_OVERRIDE { return static_cast<int32> (units.size ()); }\r
-       tresult PLUGIN_API getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/) SMTG_OVERRIDE;\r
-\r
-       int32 PLUGIN_API getProgramListCount () SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getProgramListInfo (int32 listIndex,\r
-                                              ProgramListInfo& info /*out*/) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getProgramName (ProgramListID listId, int32 programIndex,\r
-                                          String128 name /*out*/) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getProgramInfo (ProgramListID listId, int32 programIndex,\r
-                                          CString attributeId /*in*/,\r
-                                          String128 attributeValue /*out*/) SMTG_OVERRIDE;\r
-\r
-       tresult PLUGIN_API hasProgramPitchNames (ProgramListID listId,\r
-                                                int32 programIndex) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API getProgramPitchName (ProgramListID listId, int32 programIndex,\r
-                                               int16 midiPitch, String128 name /*out*/) SMTG_OVERRIDE;\r
-\r
-       virtual tresult setProgramName (ProgramListID listId, int32 programIndex,\r
-                                       const String128 name /*in*/);\r
-\r
-       // units selection --------------------\r
-       UnitID PLUGIN_API getSelectedUnit () SMTG_OVERRIDE { return selectedUnit; }\r
-       tresult PLUGIN_API selectUnit (UnitID unitId) SMTG_OVERRIDE\r
-       {\r
-               selectedUnit = unitId;\r
-               return kResultTrue;\r
-       }\r
-\r
-       tresult PLUGIN_API getUnitByBus (MediaType /*type*/, BusDirection /*dir*/, int32 /*busIndex*/,\r
-                                        int32 /*channel*/, UnitID& /*unitId*/ /*out*/) SMTG_OVERRIDE\r
-       {\r
-               return kResultFalse;\r
-       }\r
-       tresult PLUGIN_API setUnitProgramData (int32 /*listOrUnitId*/, int32 /*programIndex*/,\r
-                                              IBStream* /*data*/) SMTG_OVERRIDE\r
-       {\r
-               return kResultFalse;\r
-       }\r
-\r
-       /** Notifies the host about the selected Unit. */\r
-       virtual tresult notifyUnitSelection ();\r
-\r
-       //---from IDependent------------------\r
-       void PLUGIN_API update (FUnknown* changedUnknown, int32 message) SMTG_OVERRIDE;\r
-\r
-       //---Interface---------\r
-       OBJ_METHODS (EditControllerEx1, EditController)\r
-       DEFINE_INTERFACES\r
-               DEF_INTERFACE (IUnitInfo)\r
-       END_DEFINE_INTERFACES (EditController)\r
-       REFCOUNT_METHODS (EditController)\r
-\r
-protected:\r
-       typedef std::vector<IPtr<ProgramList>> ProgramListVector;\r
-       typedef std::map<ProgramListID, ProgramListVector::size_type> ProgramIndexMap;\r
-       typedef std::vector<IPtr<Unit>> UnitVector;\r
-       UnitVector units;\r
-       ProgramListVector programLists;\r
-       ProgramIndexMap programIndexMap;\r
-       UnitID selectedUnit;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp
deleted file mode 100644 (file)
index a1d89f7..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstinitiids.cpp\r
-// Created by  : Steinberg, 10/2009\r
-// Description : Interface symbols file\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-#include "pluginterfaces/vst/ivstaudioprocessor.h"\r
-#include "pluginterfaces/vst/ivstautomationstate.h"\r
-#include "pluginterfaces/vst/ivstchannelcontextinfo.h"\r
-#include "pluginterfaces/vst/ivstcontextmenu.h"\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstevents.h"\r
-#include "pluginterfaces/vst/ivsthostapplication.h"\r
-#include "pluginterfaces/vst/ivstinterappaudio.h"\r
-#include "pluginterfaces/vst/ivstmessage.h"\r
-#include "pluginterfaces/vst/ivstparameterchanges.h"\r
-#include "pluginterfaces/vst/ivstplugview.h"\r
-#include "pluginterfaces/vst/ivstprefetchablesupport.h"\r
-#include "pluginterfaces/vst/ivstrepresentation.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//----VST 3.0--------------------------------\r
-DEF_CLASS_IID (IComponent)\r
-DEF_CLASS_IID (IAudioProcessor)\r
-DEF_CLASS_IID (IUnitData)\r
-DEF_CLASS_IID (IProgramListData)\r
-\r
-DEF_CLASS_IID (IEditController)\r
-DEF_CLASS_IID (IUnitInfo)\r
-\r
-DEF_CLASS_IID (IConnectionPoint)\r
-\r
-DEF_CLASS_IID (IComponentHandler)\r
-DEF_CLASS_IID (IUnitHandler)\r
-\r
-DEF_CLASS_IID (IParamValueQueue)\r
-DEF_CLASS_IID (IParameterChanges)\r
-\r
-DEF_CLASS_IID (IEventList)\r
-DEF_CLASS_IID (IMessage)\r
-\r
-DEF_CLASS_IID (IHostApplication)\r
-DEF_CLASS_IID (IAttributeList)\r
-\r
-//----VST 3.0.1--------------------------------\r
-DEF_CLASS_IID (IMidiMapping)\r
-\r
-//----VST 3.0.2--------------------------------\r
-DEF_CLASS_IID (IParameterFinder)\r
-\r
-//----VST 3.1----------------------------------\r
-DEF_CLASS_IID (IComponentHandler2)\r
-DEF_CLASS_IID (IEditController2)\r
-DEF_CLASS_IID (IAudioPresentationLatency)\r
-DEF_CLASS_IID (IVst3ToVst2Wrapper)\r
-DEF_CLASS_IID (IVst3ToAUWrapper)\r
-\r
-//----VST 3.5----------------------------------\r
-DEF_CLASS_IID (INoteExpressionController)\r
-DEF_CLASS_IID (IKeyswitchController)\r
-DEF_CLASS_IID (IContextMenuTarget)\r
-DEF_CLASS_IID (IContextMenu)\r
-DEF_CLASS_IID (IComponentHandler3)\r
-DEF_CLASS_IID (IEditControllerHostEditing)\r
-DEF_CLASS_IID (IXmlRepresentationController)\r
-\r
-//----VST 3.6----------------------------------\r
-DEF_CLASS_IID (IInterAppAudioHost)\r
-DEF_CLASS_IID (IInterAppAudioConnectionNotification)\r
-DEF_CLASS_IID (IInterAppAudioPresetManager)\r
-DEF_CLASS_IID (IStreamAttributes)\r
-\r
-//----VST 3.6.5--------------------------------\r
-DEF_CLASS_IID (ChannelContext::IInfoListener)\r
-DEF_CLASS_IID (IPrefetchableSupport)\r
-DEF_CLASS_IID (IUnitHandler2)\r
-DEF_CLASS_IID (IAutomationState)\r
-\r
-//----VST 3.6.8--------------------------------\r
-DEF_CLASS_IID (IComponentHandlerBusActivation)\r
-DEF_CLASS_IID (IVst3ToAAXWrapper)\r
-}\r
-}\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp
deleted file mode 100644 (file)
index 5e55a0a..0000000
+++ /dev/null
@@ -1,436 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstparameters.cpp\r
-// Created by  : Steinberg, 03/2008\r
-// Description : VST Parameter Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstparameters.h"\r
-#include "pluginterfaces/base/futils.h"\r
-#include "pluginterfaces/base/ustring.h"\r
-#include <cstdlib>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Parameter Implementation\r
-//------------------------------------------------------------------------\r
-Parameter::Parameter () : valueNormalized (0.), precision (4)\r
-{\r
-       info = { 0 };\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter::Parameter (const ParameterInfo& info)\r
-: info (info), valueNormalized (info.defaultNormalizedValue), precision (4)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter::Parameter (const TChar* title, ParamID tag, const TChar* units,\r
-                      ParamValue defaultValueNormalized, int32 stepCount, int32 flags,\r
-                      UnitID unitID, const TChar* shortTitle)\r
-: precision (4)\r
-{\r
-       info = { 0 };\r
-\r
-       UString (info.title, str16BufferSize (String128)).assign (title);\r
-       if (units)\r
-               UString (info.units, str16BufferSize (String128)).assign (units);\r
-       if (shortTitle)\r
-               UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
-       info.stepCount = stepCount;\r
-       info.defaultNormalizedValue = valueNormalized = defaultValueNormalized;\r
-       info.flags = flags;\r
-       info.id = tag;\r
-       info.unitId = unitID;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter::~Parameter ()\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool Parameter::setNormalized (ParamValue normValue)\r
-{\r
-       if (normValue > 1.0)\r
-       {\r
-               normValue = 1.0;\r
-       }\r
-       else if (normValue < 0.)\r
-       {\r
-               normValue = 0.;\r
-       }\r
-\r
-       if (normValue != valueNormalized)\r
-       {\r
-               valueNormalized = normValue;\r
-               changed ();\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Parameter::toString (ParamValue normValue, String128 string) const\r
-{\r
-       UString wrapper (string, str16BufferSize (String128));\r
-       if (info.stepCount == 1)\r
-       {\r
-               if (normValue > 0.5)\r
-               {\r
-                       wrapper.assign (STR16 ("On"));\r
-               }\r
-               else\r
-               {\r
-                       wrapper.assign (STR16 ("Off"));\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (!wrapper.printFloat (normValue, precision))\r
-                       string[0] = 0;\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool Parameter::fromString (const TChar* string, ParamValue& normValue) const\r
-{\r
-       UString wrapper (const_cast<TChar*> (string), tstrlen (string));\r
-       return wrapper.scanFloat (normValue);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue Parameter::toPlain (ParamValue normValue) const\r
-{\r
-       return normValue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue Parameter::toNormalized (ParamValue plainValue) const\r
-{\r
-       return plainValue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// RangeParameter Implementation\r
-//------------------------------------------------------------------------\r
-RangeParameter::RangeParameter () : minPlain (0), maxPlain (1)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-RangeParameter::RangeParameter (const ParameterInfo& paramInfo, ParamValue min, ParamValue max)\r
-: Parameter (paramInfo), minPlain (min), maxPlain (max)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-RangeParameter::RangeParameter (const TChar* title, ParamID tag, const TChar* units,\r
-                                ParamValue minPlain, ParamValue maxPlain,\r
-                                ParamValue defaultValuePlain, int32 stepCount, int32 flags,\r
-                                UnitID unitID, const TChar* shortTitle)\r
-: minPlain (minPlain), maxPlain (maxPlain)\r
-{\r
-       UString (info.title, str16BufferSize (String128)).assign (title);\r
-       if (units)\r
-               UString (info.units, str16BufferSize (String128)).assign (units);\r
-       if (shortTitle)\r
-               UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
-       info.stepCount = stepCount;\r
-       info.defaultNormalizedValue = valueNormalized = toNormalized (defaultValuePlain);\r
-       info.flags = flags;\r
-       info.id = tag;\r
-       info.unitId = unitID;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void RangeParameter::toString (ParamValue _valueNormalized, String128 string) const\r
-{\r
-       if (info.stepCount > 1)\r
-       {\r
-               UString wrapper (string, str16BufferSize (String128));\r
-               int64 plain = static_cast<int64> (toPlain (_valueNormalized));\r
-               if (!wrapper.printInt (plain))\r
-                       string[0] = 0;\r
-       }\r
-       else\r
-       {\r
-               Parameter::toString (toPlain (_valueNormalized), string);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool RangeParameter::fromString (const TChar* string, ParamValue& _valueNormalized) const\r
-{\r
-       UString wrapper (const_cast<TChar*> (string), tstrlen (string));\r
-       if (info.stepCount > 1)\r
-       {\r
-               int64 plainValue;\r
-               if (wrapper.scanInt (plainValue))\r
-               {\r
-                       _valueNormalized = toNormalized ((ParamValue)plainValue);\r
-                       return true;\r
-               }\r
-               return false;\r
-       }\r
-       if (wrapper.scanFloat (_valueNormalized))\r
-       {\r
-               if (_valueNormalized < getMin ())\r
-                       _valueNormalized = getMin ();\r
-               else if (_valueNormalized > getMax ())\r
-                       _valueNormalized = getMax ();\r
-               _valueNormalized = toNormalized (_valueNormalized);\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue RangeParameter::toPlain (ParamValue _valueNormalized) const\r
-{\r
-       if (info.stepCount > 1)\r
-               return Min<int32> (info.stepCount, (int32) (_valueNormalized * (info.stepCount + 1))) +\r
-                      getMin ();\r
-       return _valueNormalized * (getMax () - getMin ()) + getMin ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue RangeParameter::toNormalized (ParamValue plainValue) const\r
-{\r
-       if (info.stepCount > 1)\r
-               return (plainValue - getMin ()) / info.stepCount;\r
-       return (plainValue - getMin ()) / (getMax () - getMin ());\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// StringListParameter Implementation\r
-//------------------------------------------------------------------------\r
-StringListParameter::StringListParameter (const ParameterInfo& paramInfo) : Parameter (paramInfo)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-StringListParameter::StringListParameter (const TChar* title, ParamID tag, const TChar* units,\r
-                                          int32 flags, UnitID unitID, const TChar* shortTitle)\r
-{\r
-       UString (info.title, str16BufferSize (String128)).assign (title);\r
-       if (units)\r
-               UString (info.units, str16BufferSize (String128)).assign (units);\r
-       if (shortTitle)\r
-               UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
-       info.stepCount = -1;\r
-       info.defaultNormalizedValue = 0;\r
-       info.flags = flags;\r
-       info.id = tag;\r
-       info.unitId = unitID;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-StringListParameter::~StringListParameter ()\r
-{\r
-       for (StringVector::iterator it = strings.begin (), end = strings.end (); it != end; ++it)\r
-               std::free (*it);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void StringListParameter::appendString (const String128 string)\r
-{\r
-       int32 length = strlen16 (string);\r
-       TChar* buffer = (TChar*)std::malloc ((length + 1) * sizeof (TChar));\r
-       if (!buffer)\r
-               return;\r
-\r
-       memcpy (buffer, string, length * sizeof (TChar));\r
-       buffer[length] = 0;\r
-       strings.push_back (buffer);\r
-       info.stepCount++;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool StringListParameter::replaceString (int32 index, const String128 string)\r
-{\r
-       TChar* str = strings.at (index);\r
-       if (!str)\r
-               return false;\r
-\r
-       int32 length = strlen16 (string);\r
-       TChar* buffer = (TChar*)malloc ((length + 1) * sizeof (TChar));\r
-       if (!buffer)\r
-               return false;\r
-\r
-       memcpy (buffer, string, length * sizeof (TChar));\r
-       buffer[length] = 0;\r
-       strings[index] = buffer;\r
-       std::free (str);\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void StringListParameter::toString (ParamValue _valueNormalized, String128 string) const\r
-{\r
-       int32 index = (int32)toPlain (_valueNormalized);\r
-       const TChar* valueString = strings.at (index);\r
-       if (valueString)\r
-       {\r
-               UString (string, str16BufferSize (String128)).assign (valueString);\r
-       }\r
-       else\r
-               string[0] = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool StringListParameter::fromString (const TChar* string, ParamValue& _valueNormalized) const\r
-{\r
-       int32 index = 0;\r
-       for (StringVector::const_iterator it = strings.begin (), end = strings.end (); it != end;\r
-            ++it, ++index)\r
-       {\r
-               if (strcmp16 (*it, string) == 0)\r
-               {\r
-                       _valueNormalized = toNormalized ((ParamValue)index);\r
-                       return true;\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue StringListParameter::toPlain (ParamValue _valueNormalized) const\r
-{\r
-       if (info.stepCount <= 0)\r
-               return 0;\r
-       return Min<int32> (info.stepCount, (int32) (_valueNormalized * (info.stepCount + 1)));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue StringListParameter::toNormalized (ParamValue plainValue) const\r
-{\r
-       if (info.stepCount <= 0)\r
-               return 0;\r
-       return plainValue / (ParamValue)info.stepCount;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ParameterContainer Implementation\r
-//------------------------------------------------------------------------\r
-ParameterContainer::ParameterContainer () : params (0)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParameterContainer::~ParameterContainer ()\r
-{\r
-       if (params)\r
-               delete params;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void ParameterContainer::init (int32 initialSize, int32 /*resizeDelta*/)\r
-{\r
-       if (!params)\r
-       {\r
-               params = new ParameterPtrVector;\r
-               if (initialSize > 0)\r
-                       params->reserve (initialSize);\r
-       }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::addParameter (Parameter* p)\r
-{\r
-       if (!params)\r
-               init ();\r
-       id2index[p->getInfo ().id] = params->size ();\r
-       params->push_back (IPtr<Parameter> (p, false));\r
-       return p;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::addParameter (const ParameterInfo& info)\r
-{\r
-       if (!params)\r
-               init ();\r
-       Parameter* p = new Parameter (info);\r
-       if (addParameter (p))\r
-               return p;\r
-       p->release ();\r
-       return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::getParameter (ParamID tag)\r
-{\r
-       if (params)\r
-       {\r
-               IndexMap::const_iterator it = id2index.find (tag);\r
-               if (it != id2index.end ())\r
-                       return params->at (it->second);\r
-       }\r
-       return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::addParameter (const TChar* title, const TChar* units,\r
-                                             int32 stepCount, ParamValue defaultNormalizedValue,\r
-                                             int32 flags, int32 tag, UnitID unitID, const TChar* shortTitle)\r
-{\r
-       if (!title)\r
-       {\r
-               return nullptr;\r
-       }\r
-\r
-       ParameterInfo info = {0};\r
-\r
-       UString (info.title, str16BufferSize (String128)).assign (title);\r
-       if (units)\r
-               UString (info.units, str16BufferSize (String128)).assign (units);\r
-       if (shortTitle)\r
-               UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
-       info.stepCount = stepCount;\r
-       info.defaultNormalizedValue = defaultNormalizedValue;\r
-       info.flags = flags;\r
-       info.id = (tag >= 0) ? tag : getParameterCount ();\r
-       info.unitId = unitID;\r
-\r
-       return addParameter (info);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h
deleted file mode 100644 (file)
index 109ba2b..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstparameters.h\r
-// Created by  : Steinberg, 03/2008\r
-// Description : VST Parameter Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-#include <map>\r
-#include <vector>\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a Parameter.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class Parameter : public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       Parameter ();\r
-       Parameter (const ParameterInfo&);\r
-       Parameter (const TChar* title, ParamID tag, const TChar* units = nullptr,\r
-                  ParamValue defaultValueNormalized = 0., int32 stepCount = 0,\r
-                  int32 flags = ParameterInfo::kCanAutomate, UnitID unitID = kRootUnitId,\r
-               const TChar* shortTitle = nullptr);\r
-       virtual ~Parameter ();\r
-\r
-       /** Returns its read only info. */\r
-       const ParameterInfo& getInfo () const { return info; }\r
-\r
-       /** Returns its writable info. */\r
-       ParameterInfo& getInfo () { return info; }\r
-\r
-       /** Sets its associated UnitId. */\r
-       void setUnitID (UnitID id) { info.unitId = id; }\r
-       /** Gets its associated UnitId. */\r
-       UnitID getUnitID () { return info.unitId; }\r
-\r
-       /** Gets its normalized value [0.0, 1.0]. */\r
-       ParamValue getNormalized () const { return valueNormalized; }\r
-       /** Sets its normalized value [0.0, 1.0]. */\r
-       virtual bool setNormalized (ParamValue v);\r
-\r
-       /** Converts a normalized value to a string. */\r
-       virtual void toString (ParamValue valueNormalized, String128 string) const;\r
-       /** Converts a string to a normalized value. */\r
-       virtual bool fromString (const TChar* string, ParamValue& valueNormalized) const;\r
-\r
-       /** Converts a normalized value to plain value (e.g. 0.5 to 10000.0Hz). */\r
-       virtual ParamValue toPlain (ParamValue valueNormalized) const;\r
-       /** Converts a plain value to a normalized value (e.g. 10000 to 0.5). */\r
-       virtual ParamValue toNormalized (ParamValue plainValue) const;\r
-\r
-       /** Gets the current precision (used for string representation of float). */\r
-       int32 getPrecision () const { return precision; }\r
-       /** Sets the precision for string representation of float value (for example 4.34 with 2 as\r
-        * precision). */\r
-       void setPrecision (int32 val) { precision = val; }\r
-\r
-       OBJ_METHODS (Parameter, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       ParameterInfo info;\r
-       ParamValue valueNormalized;\r
-       int32 precision;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a RangeParameter.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class RangeParameter : public Parameter\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       RangeParameter (const ParameterInfo& paramInfo, ParamValue min, ParamValue max);\r
-       RangeParameter (const TChar* title, ParamID tag, const TChar* units = nullptr,\r
-                       ParamValue minPlain = 0., ParamValue maxPlain = 1.,\r
-                       ParamValue defaultValuePlain = 0., int32 stepCount = 0,\r
-                       int32 flags = ParameterInfo::kCanAutomate, UnitID unitID = kRootUnitId,\r
-                    const TChar* shortTitle = nullptr);\r
-\r
-       /** Gets the minimum plain value, same as toPlain (0). */\r
-       virtual ParamValue getMin () const { return minPlain; }\r
-       /** Sets the minimum plain value. */\r
-       virtual void setMin (ParamValue value) { minPlain = value; }\r
-       /** Gets the maximum plain value, same as toPlain (1). */\r
-       virtual ParamValue getMax () const { return maxPlain; }\r
-       /** Sets the maximum plain value. */\r
-       virtual void setMax (ParamValue value) { maxPlain = value; }\r
-\r
-       /** Converts a normalized value to a string. */\r
-       void toString (ParamValue _valueNormalized, String128 string) const SMTG_OVERRIDE;\r
-       /** Converts a string to a normalized value. */\r
-       bool fromString (const TChar* string, ParamValue& _valueNormalized) const SMTG_OVERRIDE;\r
-\r
-       /** Converts a normalized value to plain value (e.g. 0.5 to 10000.0Hz). */\r
-       ParamValue toPlain (ParamValue _valueNormalized) const SMTG_OVERRIDE;\r
-       /** Converts a plain value to a normalized value (e.g. 10000 to 0.5). */\r
-       ParamValue toNormalized (ParamValue plainValue) const SMTG_OVERRIDE;\r
-\r
-       OBJ_METHODS (RangeParameter, Parameter)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       RangeParameter ();\r
-\r
-       ParamValue minPlain;\r
-       ParamValue maxPlain;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a StringListParameter.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class StringListParameter : public Parameter\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       StringListParameter (const ParameterInfo& paramInfo);\r
-       StringListParameter (const TChar* title, ParamID tag, const TChar* units = nullptr,\r
-                            int32 flags = ParameterInfo::kCanAutomate | ParameterInfo::kIsList,\r
-                            UnitID unitID = kRootUnitId, const TChar* shortTitle= nullptr);\r
-       virtual ~StringListParameter ();\r
-\r
-       /** Appends a string and increases the stepCount. */\r
-       virtual void appendString (const String128 string);\r
-       /** Replaces the string at index. Index must be between 0 and stepCount+1 */\r
-       virtual bool replaceString (int32 index, const String128 string);\r
-\r
-       /** Converts a normalized value to a string. */\r
-       void toString (ParamValue _valueNormalized, String128 string) const SMTG_OVERRIDE;\r
-       /** Converts a string to a normalized value. */\r
-       bool fromString (const TChar* string, ParamValue& _valueNormalized) const SMTG_OVERRIDE;\r
-\r
-       /** Converts a normalized value to plain value (e.g. 0.5 to 10000.0Hz). */\r
-       ParamValue toPlain (ParamValue _valueNormalized) const SMTG_OVERRIDE;\r
-       /** Converts a plain value to a normalized value (e.g. 10000 to 0.5). */\r
-       ParamValue toNormalized (ParamValue plainValue) const SMTG_OVERRIDE;\r
-\r
-       OBJ_METHODS (StringListParameter, Parameter)\r
-//------------------------------------------------------------------------\r
-protected:\r
-       typedef std::vector<TChar*> StringVector;\r
-       StringVector strings;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Collection of parameters.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class ParameterContainer\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       ParameterContainer ();\r
-       ~ParameterContainer ();\r
-\r
-       /** Init param array. */\r
-       void init (int32 initialSize = 10, int32 resizeDelta = 100);\r
-\r
-       /** Creates and adds a new parameter from a ParameterInfo. */\r
-       Parameter* addParameter (const ParameterInfo& info);\r
-\r
-       /** Creates and adds a new parameter with given properties. */\r
-       Parameter* addParameter (const TChar* title, const TChar* units = nullptr, int32 stepCount = 0,\r
-                                ParamValue defaultValueNormalized = 0.,\r
-                                int32 flags = ParameterInfo::kCanAutomate, int32 tag = -1,\r
-                                UnitID unitID = kRootUnitId, const TChar* shortTitle = nullptr);\r
-\r
-       /** Adds a given parameter. */\r
-       Parameter* addParameter (Parameter* p);\r
-\r
-       /** Returns the count of parameters. */\r
-       int32 getParameterCount () const { return params ? static_cast<int32> (params->size ()) : 0; }\r
-\r
-       /** Gets parameter by index. */\r
-       Parameter* getParameterByIndex (int32 index) { return params ? params->at (index) : nullptr; }\r
-\r
-       /** Removes all parameters. */\r
-       void removeAll ()\r
-       {\r
-               if (params)\r
-                       params->clear ();\r
-               id2index.clear ();\r
-       }\r
-\r
-       /** Gets parameter by ID. */\r
-       Parameter* getParameter (ParamID tag);\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       typedef std::vector<IPtr<Parameter>> ParameterPtrVector;\r
-       typedef std::map<ParamID, ParameterPtrVector::size_type> IndexMap;\r
-       ParameterPtrVector* params;\r
-       IndexMap id2index;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp
deleted file mode 100644 (file)
index 985f954..0000000
+++ /dev/null
@@ -1,935 +0,0 @@
-//------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstpresetfile.cpp\r
-// Created by  : Steinberg, 03/2006\r
-// Description : VST 3 Preset File Format\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstpresetfile.h"\r
-\r
-#include <algorithm>\r
-\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Preset Chunk IDs\r
-//------------------------------------------------------------------------\r
-static const ChunkID commonChunks[kNumPresetChunks] = {\r
-       {'V', 'S', 'T', '3'},   // kHeader\r
-       {'C', 'o', 'm', 'p'},   // kComponentState\r
-       {'C', 'o', 'n', 't'},   // kControllerState\r
-       {'P', 'r', 'o', 'g'},   // kProgramData\r
-       {'I', 'n', 'f', 'o'},   // kMetaInfo\r
-       {'L', 'i', 's', 't'}    // kChunkList\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// Preset Header: header id + version + class id + list offset\r
-static const int32 kFormatVersion = 1;\r
-static const int32 kClassIDSize = 32; // ASCII-encoded FUID\r
-static const int32 kHeaderSize = sizeof (ChunkID) + sizeof (int32) + kClassIDSize + sizeof (TSize);\r
-static const int32 kListOffsetPos = kHeaderSize - sizeof (TSize);\r
-\r
-//------------------------------------------------------------------------\r
-const ChunkID& getChunkID (ChunkType type)\r
-{\r
-       return commonChunks[type];\r
-}\r
-\r
-#ifdef verify\r
-#undef verify\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-inline bool verify (tresult result)\r
-{\r
-       return result == kResultOk || result == kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool copyStream (IBStream* inStream, IBStream* outStream)\r
-{\r
-       if (!inStream || !outStream)\r
-               return false;\r
-\r
-       int8 buffer[8192];\r
-       int32 read = 0;\r
-       int32 written = 0;\r
-       while (inStream->read (buffer, 8192, &read) == kResultTrue && read > 0)\r
-       {\r
-               if (outStream->write (buffer, read, &written) != kResultTrue)\r
-               {\r
-                       return false;\r
-               }\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// PresetFile\r
-//------------------------------------------------------------------------\r
-bool PresetFile::savePreset (IBStream* stream, const FUID& classID, IComponent* component,\r
-                             IEditController* editController, const char* xmlBuffer, int32 xmlSize)\r
-{\r
-       PresetFile pf (stream);\r
-       pf.setClassID (classID);\r
-       if (!pf.writeHeader ())\r
-               return false;\r
-\r
-       if (!pf.storeComponentState (component))\r
-               return false;\r
-\r
-       if (editController && !pf.storeControllerState (editController))\r
-               return false;\r
-\r
-       if (xmlBuffer && !pf.writeMetaInfo (xmlBuffer, xmlSize))\r
-               return false;\r
-\r
-       return pf.writeChunkList ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::savePreset (IBStream* stream, const FUID& classID, IBStream* componentStream,\r
-                             IBStream* editStream, const char* xmlBuffer, int32 xmlSize)\r
-{\r
-       PresetFile pf (stream);\r
-       pf.setClassID (classID);\r
-       if (!pf.writeHeader ())\r
-               return false;\r
-\r
-       if (!pf.storeComponentState (componentStream))\r
-               return false;\r
-\r
-       if (editStream && !pf.storeControllerState (editStream))\r
-               return false;\r
-\r
-       if (xmlBuffer && !pf.writeMetaInfo (xmlBuffer, xmlSize))\r
-               return false;\r
-\r
-       return pf.writeChunkList ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::loadPreset (IBStream* stream, const FUID& classID, IComponent* component,\r
-                             IEditController* editController, std::vector<FUID>* otherClassIDArray)\r
-{\r
-       PresetFile pf (stream);\r
-       if (!pf.readChunkList ())\r
-               return false;\r
-\r
-       if (pf.getClassID () != classID)\r
-       {\r
-               if (otherClassIDArray)\r
-               {\r
-                       // continue to load only if found in supported ID else abort load\r
-                       if (std::find (otherClassIDArray->begin (), otherClassIDArray->end (),\r
-                                      pf.getClassID ()) == otherClassIDArray->end ())\r
-                               return false;\r
-               }\r
-               else\r
-                       return false;\r
-       }\r
-\r
-       if (!pf.restoreComponentState (component))\r
-               return false;\r
-\r
-       if (editController)\r
-       {\r
-               // assign component state to controller\r
-               if (!pf.restoreComponentState (editController))\r
-                       return false;\r
-\r
-               // restore controller-only state (if present)\r
-               if (pf.contains (kControllerState) && !pf.restoreControllerState (editController))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-PresetFile::PresetFile (IBStream* stream) : stream (stream), entryCount (0)\r
-{\r
-       memset (entries, 0, sizeof (entries));\r
-\r
-       if (stream)\r
-               stream->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-PresetFile::~PresetFile ()\r
-{\r
-       if (stream)\r
-               stream->release ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const PresetFile::Entry* PresetFile::getEntry (ChunkType which) const\r
-{\r
-       const ChunkID& id = getChunkID (which);\r
-       for (int32 i = 0; i < entryCount; i++)\r
-               if (isEqualID (entries[i].id, id))\r
-                       return &entries[i];\r
-       return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const PresetFile::Entry* PresetFile::getLastEntry () const\r
-{\r
-       return entryCount > 0 ? &entries[entryCount - 1] : nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readID (ChunkID id)\r
-{\r
-       int32 numBytesRead = 0;\r
-       stream->read (id, sizeof (ChunkID), &numBytesRead);\r
-       return numBytesRead == sizeof (ChunkID);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeID (const ChunkID id)\r
-{\r
-       int32 numBytesWritten = 0;\r
-       stream->write ((void*)id, sizeof (ChunkID), &numBytesWritten);\r
-       return numBytesWritten == sizeof (ChunkID);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readEqualID (const ChunkID id)\r
-{\r
-       ChunkID temp = {0};\r
-       return readID (temp) && isEqualID (temp, id);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readSize (TSize& size)\r
-{\r
-       int32 numBytesRead = 0;\r
-       stream->read (&size, sizeof (TSize), &numBytesRead);\r
-#if BYTEORDER == kBigEndian\r
-       SWAP_64 (size)\r
-#endif\r
-       return numBytesRead == sizeof (TSize);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeSize (TSize size)\r
-{\r
-#if BYTEORDER == kBigEndian\r
-       SWAP_64 (size)\r
-#endif\r
-       int32 numBytesWritten = 0;\r
-       stream->write (&size, sizeof (TSize), &numBytesWritten);\r
-       return numBytesWritten == sizeof (TSize);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readInt32 (int32& value)\r
-{\r
-       int32 numBytesRead = 0;\r
-       stream->read (&value, sizeof (int32), &numBytesRead);\r
-#if BYTEORDER == kBigEndian\r
-       SWAP_32 (value)\r
-#endif\r
-       return numBytesRead == sizeof (int32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeInt32 (int32 value)\r
-{\r
-#if BYTEORDER == kBigEndian\r
-       SWAP_32 (value)\r
-#endif\r
-       int32 numBytesWritten = 0;\r
-       stream->write (&value, sizeof (int32), &numBytesWritten);\r
-       return numBytesWritten == sizeof (int32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::seekTo (TSize offset)\r
-{\r
-       int64 result = -1;\r
-       stream->seek (offset, IBStream::kIBSeekSet, &result);\r
-       return result == offset;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readChunkList ()\r
-{\r
-       seekTo (0);\r
-       entryCount = 0;\r
-\r
-       char8 classString[kClassIDSize + 1] = {0};\r
-\r
-       // Read header\r
-       int32 version = 0;\r
-       TSize listOffset = 0;\r
-       if (!(readEqualID (getChunkID (kHeader)) && readInt32 (version) &&\r
-             verify (stream->read (classString, kClassIDSize)) && readSize (listOffset) &&\r
-             listOffset > 0 && seekTo (listOffset)))\r
-               return false;\r
-\r
-       classID.fromString (classString);\r
-\r
-       // Read list\r
-       int32 count = 0;\r
-       if (!readEqualID (getChunkID (kChunkList)))\r
-               return false;\r
-       if (!readInt32 (count))\r
-               return false;\r
-\r
-       if (count > kMaxEntries)\r
-               count = kMaxEntries;\r
-\r
-       for (int32 i = 0; i < count; i++)\r
-       {\r
-               Entry& e = entries[i];\r
-               if (!(readID (e.id) && readSize (e.offset) && readSize (e.size)))\r
-                       break;\r
-\r
-               entryCount++;\r
-       }\r
-\r
-       return entryCount > 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeHeader ()\r
-{\r
-       // header id + version + class id + list offset (unknown yet)\r
-\r
-       char8 classString[kClassIDSize + 1] = {0};\r
-       classID.toString (classString);\r
-\r
-       return seekTo (0) && writeID (getChunkID (kHeader)) && writeInt32 (kFormatVersion) &&\r
-              verify (stream->write (classString, kClassIDSize)) && writeSize (0);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeChunkList ()\r
-{\r
-       // Update list offset\r
-       TSize pos = 0;\r
-       stream->tell (&pos);\r
-       if (!(seekTo (kListOffsetPos) && writeSize (pos) && seekTo (pos)))\r
-               return false;\r
-\r
-       // Write list\r
-       if (!writeID (getChunkID (kChunkList)))\r
-               return false;\r
-       if (!writeInt32 (entryCount))\r
-               return false;\r
-\r
-       for (int32 i = 0; i < entryCount; i++)\r
-       {\r
-               Entry& e = entries[i];\r
-               if (!(writeID (e.id) && writeSize (e.offset) && writeSize (e.size)))\r
-                       return false;\r
-       }\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::beginChunk (Entry& e, ChunkType which)\r
-{\r
-       if (entryCount >= kMaxEntries)\r
-               return false;\r
-\r
-       const ChunkID& id = getChunkID (which);\r
-       memcpy (e.id, &id, sizeof (ChunkID));\r
-       stream->tell (&e.offset);\r
-       e.size = 0;\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::endChunk (Entry& e)\r
-{\r
-       if (entryCount >= kMaxEntries)\r
-               return false;\r
-\r
-       TSize pos = 0;\r
-       stream->tell (&pos);\r
-       e.size = pos - e.offset;\r
-       entries[entryCount++] = e;\r
-       return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readMetaInfo (char* xmlBuffer, int32& size)\r
-{\r
-       bool result = false;\r
-       const Entry* e = getEntry (kMetaInfo);\r
-       if (e)\r
-       {\r
-               if (xmlBuffer)\r
-               {\r
-                       result = seekTo (e->offset) && verify (stream->read (xmlBuffer, size, &size));\r
-               }\r
-               else\r
-               {\r
-                       size = (int32)e->size;\r
-                       result = size > 0;\r
-               }\r
-       }\r
-       return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeMetaInfo (const char* xmlBuffer, int32 size, bool forceWriting)\r
-{\r
-       if (contains (kMetaInfo)) // already exists!\r
-       {\r
-               if (!forceWriting)\r
-                       return false;\r
-       }\r
-       if (!prepareMetaInfoUpdate ())\r
-               return false;\r
-\r
-       if (size == -1)\r
-               size = (int32)strlen (xmlBuffer);\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kMetaInfo) && verify (stream->write ((void*)xmlBuffer, size)) &&\r
-              endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::prepareMetaInfoUpdate ()\r
-{\r
-       TSize writePos = 0;\r
-       const Entry* e = getEntry (kMetaInfo);\r
-       if (e)\r
-       {\r
-               // meta info must be the last entry!\r
-               if (e != getLastEntry ())\r
-                       return false;\r
-\r
-               writePos = e->offset;\r
-               entryCount--;\r
-       }\r
-       else\r
-       {\r
-               // entries must be sorted ascending by offset!\r
-               e = getLastEntry ();\r
-               writePos = e ? e->offset + e->size : kHeaderSize;\r
-       }\r
-\r
-       return seekTo (writePos);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeChunk (const void* data, int32 size, ChunkType which)\r
-{\r
-       if (contains (which)) // already exists!\r
-               return false;\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, which) && verify (stream->write ((void*)data, size)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::seekToComponentState ()\r
-{\r
-       const Entry* e = getEntry (kComponentState);\r
-       return e && seekTo (e->offset);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeComponentState (IComponent* component)\r
-{\r
-       if (contains (kComponentState)) // already exists!\r
-               return false;\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kComponentState) && verify (component->getState (stream)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeComponentState (IBStream* componentStream)\r
-{\r
-       if (contains (kComponentState)) // already exists!\r
-               return false;\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kComponentState) && copyStream (componentStream, stream) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreComponentState (IComponent* component)\r
-{\r
-       const Entry* e = getEntry (kComponentState);\r
-       if (e)\r
-       {\r
-               ReadOnlyBStream* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);\r
-               FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
-               return verify (component->setState (readOnlyBStream));\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreComponentState (IEditController* editController)\r
-{\r
-       const Entry* e = getEntry (kComponentState);\r
-       if (e)\r
-       {\r
-               ReadOnlyBStream* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);\r
-               FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
-               return verify (editController->setComponentState (readOnlyBStream));\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::seekToControllerState ()\r
-{\r
-       const Entry* e = getEntry (kControllerState);\r
-       return e && seekTo (e->offset);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeControllerState (IEditController* editController)\r
-{\r
-       if (contains (kControllerState)) // already exists!\r
-               return false;\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kControllerState) && verify (editController->getState (stream)) &&\r
-              endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeControllerState (IBStream* editStream)\r
-{\r
-       if (contains (kControllerState)) // already exists!\r
-               return false;\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kControllerState) && copyStream (editStream, stream) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreControllerState (IEditController* editController)\r
-{\r
-       const Entry* e = getEntry (kControllerState);\r
-       if (e)\r
-       {\r
-               ReadOnlyBStream* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);\r
-               FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
-               return verify (editController->setState (readOnlyBStream));\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeProgramData (IBStream* inStream, ProgramListID listID)\r
-{\r
-       if (contains (kProgramData)) // already exists!\r
-               return false;\r
-\r
-       writeHeader ();\r
-\r
-       Entry e = {};\r
-       if (beginChunk (e, kProgramData))\r
-       {\r
-               if (writeInt32 (listID))\r
-               {\r
-                       if (!copyStream (inStream, stream))\r
-                               return false;\r
-\r
-                       return endChunk (e);\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeProgramData (IProgramListData* programListData, ProgramListID listID,\r
-                                   int32 programIndex)\r
-{\r
-       if (contains (kProgramData)) // already exists!\r
-               return false;\r
-\r
-       writeHeader ();\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kProgramData) && writeInt32 (listID) &&\r
-              verify (programListData->getProgramData (listID, programIndex, stream)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreProgramData (IProgramListData* programListData,\r
-                                     ProgramListID* programListID, int32 programIndex)\r
-{\r
-       const Entry* e = getEntry (kProgramData);\r
-       ProgramListID savedProgramListID = -1;\r
-       if (e && seekTo (e->offset))\r
-       {\r
-               if (readInt32 (savedProgramListID))\r
-               {\r
-                       if (programListID && *programListID != savedProgramListID)\r
-                               return false;\r
-\r
-                       int32 alreadyRead = sizeof (int32);\r
-                       ReadOnlyBStream* readOnlyBStream =\r
-                           new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);\r
-                       FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
-                       return programListData && verify (programListData->setProgramData (\r
-                                                     savedProgramListID, programIndex, readOnlyBStream));\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeProgramData (IUnitData* unitData, UnitID unitID)\r
-{\r
-       if (contains (kProgramData)) // already exists!\r
-               return false;\r
-\r
-       writeHeader ();\r
-\r
-       Entry e = {};\r
-       return beginChunk (e, kProgramData) && writeInt32 (unitID) &&\r
-              verify (unitData->getUnitData (unitID, stream)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreProgramData (IUnitData* unitData, UnitID* unitId)\r
-{\r
-       const Entry* e = getEntry (kProgramData);\r
-       UnitID savedUnitID = -1;\r
-       if (e && seekTo (e->offset))\r
-       {\r
-               if (readInt32 (savedUnitID))\r
-               {\r
-                       if (unitId && *unitId != savedUnitID)\r
-                               return false;\r
-\r
-                       int32 alreadyRead = sizeof (int32);\r
-                       ReadOnlyBStream* readOnlyBStream =\r
-                           new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);\r
-                       FReleaser readOnlyStreamReleaser (readOnlyBStream);\r
-                       return (unitData && verify (unitData->setUnitData (savedUnitID, readOnlyBStream)));\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreProgramData (IUnitInfo* unitInfo, int32 unitProgramListID,\r
-                                     int32 programIndex)\r
-{\r
-       const Entry* e = getEntry (kProgramData);\r
-       int32 savedProgramListID = -1;\r
-       if (e && seekTo (e->offset))\r
-       {\r
-               if (readInt32 (savedProgramListID))\r
-               {\r
-                       if (unitProgramListID != savedProgramListID)\r
-                               return false;\r
-\r
-                       int32 alreadyRead = sizeof (int32);\r
-                       ReadOnlyBStream* readOnlyBStream =\r
-                           new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);\r
-                       FReleaser readOnlyStreamReleaser (readOnlyBStream);\r
-                       return (unitInfo && unitInfo->setUnitProgramData (unitProgramListID, programIndex,\r
-                                                                         readOnlyBStream));\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::getUnitProgramListID (int32& unitProgramListID)\r
-{\r
-       const Entry* e = getEntry (kProgramData);\r
-       if (e && seekTo (e->offset))\r
-       {\r
-               if (readInt32 (unitProgramListID))\r
-               {\r
-                       return true;\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// FileStream implementation\r
-//------------------------------------------------------------------------\r
-IBStream* FileStream::open (const char* filename, const char* mode)\r
-{\r
-       FILE* file = fopen (filename, mode);\r
-       return file ? new FileStream (file) : nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FileStream::FileStream (FILE* file)\r
-: file (file) {FUNKNOWN_CTOR}\r
-\r
-//------------------------------------------------------------------------\r
-FileStream::~FileStream ()\r
-{\r
-       fclose (file);\r
-       FUNKNOWN_DTOR\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (FileStream, IBStream, IBStream::iid)\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::read (void* buffer, int32 numBytes, int32* numBytesRead)\r
-{\r
-       size_t result = fread (buffer, 1, numBytes, file);\r
-       if (numBytesRead)\r
-               *numBytesRead = (int32)result;\r
-       return static_cast<int32> (result) == numBytes ? kResultOk : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)\r
-{\r
-       size_t result = fwrite (buffer, 1, numBytes, file);\r
-       if (numBytesWritten)\r
-               *numBytesWritten = (int32)result;\r
-       return static_cast<int32> (result) == numBytes ? kResultOk : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
-       if (fseek (file, (int32)pos, mode) == 0)\r
-       {\r
-               if (result)\r
-                       *result = ftell (file);\r
-               return kResultOk;\r
-       }\r
-       return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::tell (int64* pos)\r
-{\r
-       if (pos)\r
-               *pos = ftell (file);\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ReadOnlyBStream implementation\r
-//------------------------------------------------------------------------\r
-IMPLEMENT_REFCOUNT (ReadOnlyBStream)\r
-\r
-//------------------------------------------------------------------------\r
-ReadOnlyBStream::ReadOnlyBStream (IBStream* sourceStream, TSize sourceOffset, TSize sectionSize)\r
-: sourceStream (sourceStream)\r
-, sourceOffset (sourceOffset)\r
-, sectionSize (sectionSize)\r
-, seekPosition (0)\r
-{\r
-       FUNKNOWN_CTOR\r
-       if (sourceStream)\r
-               sourceStream->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ReadOnlyBStream::~ReadOnlyBStream ()\r
-{\r
-       if (sourceStream)\r
-               sourceStream->release ();\r
-\r
-       FUNKNOWN_DTOR\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::queryInterface (const TUID _iid, void** obj)\r
-{\r
-       return sourceStream ? sourceStream->queryInterface (_iid, obj) : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::read (void* buffer, int32 numBytes, int32* numBytesRead)\r
-{\r
-       if (numBytesRead)\r
-               *numBytesRead = 0;\r
-\r
-       if (!sourceStream)\r
-               return kNotInitialized;\r
-\r
-       int32 maxBytesToRead = (int32) (sectionSize - seekPosition);\r
-       if (numBytes > maxBytesToRead)\r
-               numBytes = maxBytesToRead;\r
-       if (numBytes <= 0)\r
-               return kResultOk;\r
-\r
-       tresult result = sourceStream->seek (sourceOffset + seekPosition, kIBSeekSet);\r
-       if (result != kResultOk)\r
-               return result;\r
-\r
-       int32 numRead = 0;\r
-       result = sourceStream->read (buffer, numBytes, &numRead);\r
-\r
-       if (numRead > 0)\r
-               seekPosition += numRead;\r
-       if (numBytesRead)\r
-               *numBytesRead = numRead;\r
-\r
-       return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::write (void* /*buffer*/, int32 /*numBytes*/,\r
-                                           int32* numBytesWritten)\r
-{\r
-       if (numBytesWritten)\r
-               *numBytesWritten = 0;\r
-\r
-       return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
-       switch (mode)\r
-       {\r
-               case kIBSeekSet: seekPosition = pos; break;\r
-\r
-               case kIBSeekCur: seekPosition += pos; break;\r
-\r
-               case kIBSeekEnd: seekPosition = sectionSize + pos; break;\r
-       }\r
-\r
-       if (seekPosition < 0)\r
-               seekPosition = 0;\r
-       if (seekPosition > sectionSize)\r
-               seekPosition = sectionSize;\r
-\r
-       if (result)\r
-               *result = seekPosition;\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::tell (int64* pos)\r
-{\r
-       if (pos)\r
-               *pos = seekPosition;\r
-       return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// BufferStream implementation\r
-//------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (BufferStream, IBStream, IBStream::iid)\r
-\r
-//------------------------------------------------------------------------\r
-BufferStream::BufferStream () {FUNKNOWN_CTOR}\r
-\r
-//------------------------------------------------------------------------\r
-BufferStream::~BufferStream () {FUNKNOWN_DTOR}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::read (void* buffer, int32 numBytes, int32* numBytesRead)\r
-{\r
-       uint32 size = mBuffer.get (buffer, numBytes);\r
-       if (numBytesRead)\r
-               *numBytesRead = size;\r
-\r
-       return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)\r
-{\r
-       bool res = mBuffer.put (buffer, numBytes);\r
-       if (numBytesWritten)\r
-               *numBytesWritten = res ? numBytes : 0;\r
-\r
-       return res ? kResultTrue : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
-       bool res = false;\r
-       switch (mode)\r
-       {\r
-               //--- -----------------\r
-               case IBStream::kIBSeekSet:\r
-               {\r
-                       int64 tmp = pos;\r
-                       if (tmp < 0)\r
-                               tmp = 0;\r
-                       res = mBuffer.setFillSize (static_cast<uint32> (tmp));\r
-               }\r
-               break;\r
-\r
-               //--- -----------------\r
-               case IBStream::kIBSeekCur:\r
-               {\r
-                       int64 tmp = mBuffer.getFillSize () + pos;\r
-                       if (tmp < 0)\r
-                               tmp = 0;\r
-                       res = mBuffer.setFillSize (static_cast<uint32> (tmp));\r
-               }\r
-               break;\r
-\r
-               //--- -----------------\r
-               case IBStream::kIBSeekEnd:\r
-               {\r
-                       int64 tmp = mBuffer.getSize () - pos;\r
-                       if (tmp < 0)\r
-                               tmp = 0;\r
-                       res = mBuffer.setFillSize (static_cast<uint32> (tmp));\r
-               }\r
-               break;\r
-       }\r
-       if (res && result)\r
-               *result = mBuffer.getFillSize ();\r
-\r
-       return res ? kResultTrue : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::tell (int64* pos)\r
-{\r
-       if (pos)\r
-               *pos = mBuffer.getFillSize ();\r
-       return pos ? kResultTrue : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h
deleted file mode 100644 (file)
index 14f7e00..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-//-----------------------------------------------------------------------------\r
-// Project     : VST SDK\r
-//\r
-// Category    : Helpers\r
-// Filename    : public.sdk/source/vst/vstpresetfile.h\r
-// Created by  : Steinberg, 03/2006\r
-// Description : VST 3 Preset File Format\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-//   * Redistributions of source code must retain the above copyright notice,\r
-//     this list of conditions and the following disclaimer.\r
-//   * Redistributions in binary form must reproduce the above copyright notice,\r
-//     this list of conditions and the following disclaimer in the documentation\r
-//     and/or other materials provided with the distribution.\r
-//   * Neither the name of the Steinberg Media Technologies nor the names of its\r
-//     contributors may be used to endorse or promote products derived from this\r
-//     software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstcomponent.h"\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-#include "pluginterfaces/base/ibstream.h"\r
-#include "base/source/fbuffer.h"\r
-\r
-#include <cstdio>\r
-#include <vector>\r
-\r
-//------------------------------------------------------------------------\r
-/*\r
-       VST 3 Preset File Format Definition\r
-   ===================================\r
-\r
-0   +---------------------------+\r
-    | HEADER                    |\r
-    | header id ('VST3')        |       4 Bytes\r
-    | version                   |       4 Bytes (int32)\r
-    | ASCII-encoded class id    |       32 Bytes\r
- +--| offset to chunk list      |       8 Bytes (int64)\r
- |  +---------------------------+\r
- |  | DATA AREA                 |<-+\r
- |  | data of chunks 1..n       |  |\r
- |  ...                       ...  |\r
- |  |                           |  |\r
- +->+---------------------------+  |\r
-    | CHUNK LIST                |  |\r
-    | list id ('List')          |  |    4 Bytes\r
-    | entry count               |  |    4 Bytes (int32)\r
-    +---------------------------+  |\r
-    |  1..n                     |  |\r
-    |  +----------------------+ |  |\r
-    |  | chunk id             | |  |    4 Bytes\r
-    |  | offset to chunk data |----+    8 Bytes (int64)\r
-    |  | size of chunk data   | |       8 Bytes (int64)\r
-    |  +----------------------+ |\r
-EOF +---------------------------+\r
-*/\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-typedef char ChunkID[4];\r
-\r
-//------------------------------------------------------------------------\r
-enum ChunkType\r
-{\r
-       kHeader,\r
-       kComponentState,\r
-       kControllerState,\r
-       kProgramData,\r
-       kMetaInfo,\r
-       kChunkList,\r
-       kNumPresetChunks\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-extern const ChunkID& getChunkID (ChunkType type);\r
-\r
-//------------------------------------------------------------------------\r
-inline bool isEqualID (const ChunkID id1, const ChunkID id2)\r
-{\r
-       return memcmp (id1, id2, sizeof (ChunkID)) == 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Handler for a VST 3 Preset File.\r
-\ingroup vstClasses\r
-\see \ref presetformat */\r
-//------------------------------------------------------------------------\r
-class PresetFile\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       PresetFile (IBStream* stream); ///< Constructor of Preset file based on a stream\r
-       virtual ~PresetFile ();\r
-\r
-       /** Internal structure used for chunk handling */\r
-       struct Entry\r
-       {\r
-               ChunkID id;\r
-               TSize offset;\r
-               TSize size;\r
-       };\r
-\r
-       IBStream* getStream () { return stream; }                       ///< Returns the associated stream.\r
-\r
-       const FUID& getClassID () const { return classID; }     ///< Returns the associated classID (component ID: Processor part (not the controller!)).\r
-       void setClassID (const FUID& uid) { classID = uid; }///< Sets the associated classID (component ID: Processor part (not the controller!)).\r
-\r
-       const Entry* getEntry (ChunkType which) const;          ///< Returns an entry for a given chunk type.\r
-       const Entry* getLastEntry () const;                                     ///< Returns the last available entry.\r
-       int32 getEntryCount () const { return entryCount; }     ///< Returns the number of total entries in the current stream.\r
-       const Entry& at (int32 index) const { return entries[index]; }  ///< Returns the entry at a given position.\r
-       bool contains (ChunkType which) const { return getEntry (which) != nullptr; }   ///< Checks if a given chunk type exist in the stream.\r
-\r
-       bool readChunkList ();          ///< Reads and build the chunk list (including the header chunk).\r
-       bool writeHeader ();            ///< Writes into the stream the main header.\r
-       bool writeChunkList ();         ///< Writes into the stream the chunk list (should be at the end).\r
-\r
-       /** Reads the meta XML info and its size, the size could be retrieved by passing zero as xmlBuffer. */\r
-       bool readMetaInfo (char* xmlBuffer, int32& size);\r
-\r
-       /** Writes the meta XML info, -1 means null-terminated, forceWriting to true will force to rewrite the XML Info when the chunk already exists. */\r
-       bool writeMetaInfo (const char* xmlBuffer, int32 size = -1, bool forceWriting = false);\r
-       bool prepareMetaInfoUpdate ();  ///< checks if meta info chunk is the last one and jump to correct position.\r
-\r
-       /** Writes a given data of a given size as "which" chunk type. */\r
-       bool writeChunk (const void* data, int32 size, ChunkType which = kComponentState);\r
-\r
-       //-------------------------------------------------------------\r
-       // for storing and restoring the whole Plug-in state (component and controller states)\r
-       bool seekToComponentState ();                                                   ///< Seeks to the begin of the Component State.\r
-       bool storeComponentState (IComponent* component);               ///< Stores the component state (only one time).\r
-       bool storeComponentState (IBStream* componentStream);   ///< Stores the component state from stream (only one time).\r
-       bool restoreComponentState (IComponent* component);             ///< Restores the component state.\r
-\r
-       bool seekToControllerState ();                                                  ///< Seeks to the begin of the Controller State.\r
-       bool storeControllerState (IEditController* editController);///< Stores the controller state (only one time).\r
-       bool storeControllerState (IBStream* editStream);                       ///< Stores the controller state from stream (only one time).\r
-       bool restoreControllerState (IEditController* editController);///< Restores the controller state.\r
-\r
-       bool restoreComponentState (IEditController* editController);///< Restores the component state and apply it to the controller.\r
-\r
-       //--- ----------------------------------------------------------\r
-       /** Store program data or unit data from stream (including the header chunk).\r
-        \param listID could be ProgramListID or UnitID. */\r
-       bool storeProgramData (IBStream* inStream, ProgramListID listID);\r
-\r
-       //---when Plug-in uses IProgramListData-----------------------\r
-       /** Stores a IProgramListData with a given identifier and index (including the header chunk). */\r
-       bool storeProgramData (IProgramListData* programListData, ProgramListID programListID,\r
-                              int32 programIndex);\r
-       /** Restores a IProgramListData with a given identifier and index. */\r
-       bool restoreProgramData (IProgramListData* programListData, ProgramListID* programListID = nullptr,\r
-                                int32 programIndex = 0);\r
-\r
-       //---when Plug-in uses IUnitData------------------------------\r
-       /** Stores a IUnitData with a given unitID (including the header chunk). */\r
-       bool storeProgramData (IUnitData* unitData, UnitID unitID);\r
-       /** Restores a IUnitData with a given unitID (optional). */\r
-       bool restoreProgramData (IUnitData* unitData, UnitID* unitID = nullptr);\r
-\r
-       //--- ----------------------------------------------------------\r
-       /** for keeping the Controller part in sync concerning preset data stream, unitProgramListID\r
-        * could be ProgramListID or UnitID. */\r
-       bool restoreProgramData (IUnitInfo* unitInfo, int32 unitProgramListID, int32 programIndex = -1);\r
-\r
-       /** Gets the unitProgramListID saved in the kProgramData chunk (if available). */\r
-       bool getUnitProgramListID (int32& unitProgramListID);\r
-\r
-       //--- ---------------------------------------------------------------------\r
-       /** Shortcut helper to create preset from component/controller state. classID is the FUID of the\r
-        * component (processor) part. */\r
-       static bool savePreset (IBStream* stream, const FUID& classID, IComponent* component,\r
-                               IEditController* editController = nullptr,\r
-                               const char* xmlBuffer = nullptr, int32 xmlSize = -1);\r
-       static bool savePreset (IBStream* stream, const FUID& classID, IBStream* componentStream,\r
-                               IBStream* editStream = nullptr, const char* xmlBuffer = nullptr,\r
-                               int32 xmlSize = -1);\r
-\r
-       /** Shortcut helper to load preset with component/controller state. classID is the FUID of the\r
-        * component (processor) part. */\r
-       static bool loadPreset (IBStream* stream, const FUID& classID, IComponent* component,\r
-                               IEditController* editController = nullptr,\r
-                               std::vector<FUID>* otherClassIDArray = nullptr);\r
-//------------------------------------------------------------------------\r
-protected:\r
-       bool readID (ChunkID id);\r
-       bool writeID (const ChunkID id);\r
-       bool readEqualID (const ChunkID id);\r
-       bool readSize (TSize& size);\r
-       bool writeSize (TSize size);\r
-       bool readInt32 (int32& value);\r
-       bool writeInt32 (int32 value);\r
-       bool seekTo (TSize offset);\r
-       bool beginChunk (Entry& e, ChunkType which);\r
-       bool endChunk (Entry& e);\r
-\r
-       IBStream* stream;\r
-       FUID classID;           ///< classID is the FUID of the component (processor) part\r
-       enum { kMaxEntries = 128 };\r
-       Entry entries[kMaxEntries];\r
-       int32 entryCount;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream implementation for a file using stdio. */\r
-//------------------------------------------------------------------------\r
-class FileStream: public IBStream\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-       static IBStream* open (const char* filename, const char* mode); ///< open a stream using stdio function\r
-\r
-       //---from FUnknown------------------\r
-       DECLARE_FUNKNOWN_METHODS\r
-\r
-       //---from IBStream------------------\r
-       tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = nullptr) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = nullptr) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = nullptr) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-       FileStream (FILE* file);\r
-       virtual ~FileStream ();\r
-\r
-       FILE* file;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream representing a Read-Only subsection of its source stream. */\r
-//------------------------------------------------------------------------\r
-class ReadOnlyBStream: public IBStream\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-        ReadOnlyBStream (IBStream* sourceStream, TSize sourceOffset, TSize sectionSize);\r
-        virtual ~ReadOnlyBStream ();\r
-\r
-        //---from FUnknown------------------\r
-        DECLARE_FUNKNOWN_METHODS\r
-\r
-        //---from IBStream------------------\r
-        tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = nullptr) SMTG_OVERRIDE;\r
-        tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = nullptr) SMTG_OVERRIDE;\r
-        tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = nullptr) SMTG_OVERRIDE;\r
-        tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-        IBStream* sourceStream;\r
-        TSize sourceOffset;\r
-        TSize sectionSize;\r
-        TSize seekPosition;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream implementation for a memory buffer. */\r
-//------------------------------------------------------------------------\r
-class BufferStream : public IBStream\r
-{\r
-public:\r
-       BufferStream ();\r
-       virtual ~BufferStream ();\r
-\r
-       //---from FUnknown------------------\r
-       DECLARE_FUNKNOWN_METHODS\r
-\r
-       //---from IBStream------------------\r
-       tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = nullptr) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = nullptr) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = nullptr) SMTG_OVERRIDE;\r
-       tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
-protected:\r
-       Buffer mBuffer;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
index de59213181c45427fd42b270a4fbfc616360e474..5810e80f0885a78ef0ce74d785d5d8672b6298ac 100644 (file)
@@ -56,8 +56,10 @@ public:
 private:\r
     //==============================================================================\r
     void createPluginInstance (const PluginDescription&,\r
-                               double initialSampleRate, int initialBufferSize,\r
-                               void* userData, PluginCreationCallback) override;\r
+                               double initialSampleRate,\r
+                               int initialBufferSize,\r
+                               void* userData,\r
+                               void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
 \r
     bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
 \r
index 4418899db1d4c9515134966edfebdc54cc4cd29c..6552a81339880c2543bf1248b3130c67b9606401 100644 (file)
@@ -341,7 +341,12 @@ public:
 \r
             if (auto* au = pluginInstance.audioUnit)\r
             {\r
-                AudioUnitGetParameter (au, paramID, kAudioUnitScope_Global, 0, &value);\r
+                AudioUnitGetParameter (au,\r
+                                       paramID,\r
+                                       kAudioUnitScope_Global,\r
+                                       0,\r
+                                       &value);\r
+\r
                 value = normaliseParamValue (value);\r
             }\r
 \r
@@ -354,8 +359,12 @@ public:
 \r
             if (auto* au = pluginInstance.audioUnit)\r
             {\r
-                AudioUnitSetParameter (au, paramID, kAudioUnitScope_Global,\r
-                                       0, scaleParamValue (newValue), 0);\r
+                AudioUnitSetParameter (au,\r
+                                       paramID,\r
+                                       kAudioUnitScope_Global,\r
+                                       0,\r
+                                       scaleParamValue (newValue),\r
+                                       0);\r
 \r
                 sendParameterChangeEvent();\r
             }\r
@@ -397,12 +406,12 @@ public:
 \r
                     UInt32 propertySize = sizeof (stringValue);\r
 \r
-                    auto err = AudioUnitGetProperty (au,\r
-                                                     kAudioUnitProperty_ParameterStringFromValue,\r
-                                                     kAudioUnitScope_Global,\r
-                                                     0,\r
-                                                     &stringValue,\r
-                                                     &propertySize);\r
+                    OSStatus err = AudioUnitGetProperty (au,\r
+                                                         kAudioUnitProperty_ParameterStringFromValue,\r
+                                                         kAudioUnitScope_Global,\r
+                                                         0,\r
+                                                         &stringValue,\r
+                                                         &propertySize);\r
 \r
                     if (! err && stringValue.outString != nullptr)\r
                         return String::fromCFString (stringValue.outString).substring (0, maximumLength);\r
@@ -432,12 +441,12 @@ public:
 \r
                     UInt32 propertySize = sizeof (valueString);\r
 \r
-                    auto err = AudioUnitGetProperty (au,\r
-                                                     kAudioUnitProperty_ParameterValueFromString,\r
-                                                     kAudioUnitScope_Global,\r
-                                                     0,\r
-                                                     &valueString,\r
-                                                     &propertySize);\r
+                    OSStatus err = AudioUnitGetProperty (au,\r
+                                                         kAudioUnitProperty_ParameterValueFromString,\r
+                                                         kAudioUnitScope_Global,\r
+                                                         0,\r
+                                                         &valueString,\r
+                                                         &propertySize);\r
 \r
                     if (! err)\r
                         return normaliseParamValue (valueString.outValue);\r
@@ -447,10 +456,25 @@ public:
             return Parameter::getValueForText (text);\r
         }\r
 \r
-        bool isAutomatable() const override         { return automatable; }\r
-        bool isDiscrete() const override            { return discrete; }\r
-        bool isBoolean() const override             { return isSwitch; }\r
-        int getNumSteps() const override            { return numSteps; }\r
+        bool isAutomatable() const override\r
+        {\r
+            return automatable;\r
+        }\r
+\r
+        bool isDiscrete() const override\r
+        {\r
+            return discrete;\r
+        }\r
+\r
+        bool isBoolean() const override\r
+        {\r
+            return isSwitch;\r
+        }\r
+\r
+        int getNumSteps() const override\r
+        {\r
+            return numSteps;\r
+        }\r
 \r
         StringArray getAllValueStrings() const override\r
         {\r
@@ -504,6 +528,12 @@ public:
     AudioUnitPluginInstance (AudioComponentInstance au)\r
         : AudioPluginInstance (getBusesProperties (au)),\r
           auComponent (AudioComponentInstanceGetComponent (au)),\r
+          wantsMidiMessages (false),\r
+          producesMidiMessages (false),\r
+          wasPlaying (false),\r
+          prepared (false),\r
+          isAUv3 (false),\r
+          currentBuffer (nullptr),\r
           audioUnit (au),\r
         #if JUCE_MAC\r
           eventListenerRef (0),\r
@@ -705,7 +735,7 @@ public:
             if (getElementCount (scope) != n && isBusCountWritable (isInput))\r
             {\r
                 OSStatus err;\r
-                auto newCount = static_cast<UInt32> (n);\r
+                UInt32 newCount = static_cast<UInt32> (n);\r
                 layoutHasChanged = true;\r
 \r
                 err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount));\r
@@ -725,8 +755,7 @@ public:
                 {\r
                     AudioStreamBasicDescription stream;\r
                     UInt32 dataSize = sizeof (stream);\r
-                    auto err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (i), &stream, &dataSize);\r
-\r
+                    OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (i), &stream, &dataSize);\r
                     if (err != noErr || dataSize < sizeof (stream))\r
                         return false;\r
 \r
@@ -759,7 +788,7 @@ public:
                     UInt32 dataSize = minDataSize;\r
 \r
                     AudioChannelLayoutTag actualTag = kAudioChannelLayoutTag_Unknown;\r
-                    auto err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (i), &layout, &dataSize);\r
+                    OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (i), &layout, &dataSize);\r
                     bool supportsLayouts = (err == noErr && dataSize >= minDataSize);\r
 \r
                     if (supportsLayouts)\r
@@ -1329,9 +1358,8 @@ public:
 \r
     void refreshParameterList() override\r
     {\r
-        managedParameters.clear (false);\r
+        managedParameters.clear();\r
         paramIDToIndex.clear();\r
-        AudioProcessorParameterGroup parameterGroups ({}, {}, {});\r
 \r
         if (audioUnit != nullptr)\r
         {\r
@@ -1349,8 +1377,6 @@ public:
                 AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global,\r
                                       0, ids, &paramListSize);\r
 \r
-                std::map<UInt32, AudioProcessorParameterGroup*> groupIDMap;\r
-\r
                 for (size_t i = 0; i < numParams; ++i)\r
                 {\r
                     AudioUnitParameterInfo info;\r
@@ -1403,67 +1429,23 @@ public:
                                 break;\r
                         }\r
 \r
-                        auto* parameter = new AUInstanceParameter (*this,\r
-                                                                   ids[i],\r
-                                                                   paramName,\r
-                                                                   info.minValue,\r
-                                                                   info.maxValue,\r
-                                                                   info.defaultValue,\r
-                                                                   (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0,\r
-                                                                   isDiscrete,\r
-                                                                   isDiscrete ? (int) (info.maxValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(),\r
-                                                                   isBoolean,\r
-                                                                   label,\r
-                                                                   (info.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0);\r
-                        addParameterInternal (parameter);\r
-\r
-                        if (info.flags & kAudioUnitParameterFlag_HasClump)\r
-                        {\r
-                            auto groupInfo = groupIDMap.find (info.clumpID);\r
-\r
-                            if (groupInfo == groupIDMap.end())\r
-                            {\r
-                                auto getClumpName = [this, info]\r
-                                {\r
-                                    AudioUnitParameterNameInfo clumpNameInfo;\r
-                                    UInt32 sz = sizeof (clumpNameInfo);\r
-                                    zerostruct (clumpNameInfo);\r
-                                    clumpNameInfo.inID = info.clumpID;\r
-                                    clumpNameInfo.inDesiredLength = (SInt32) 256;\r
-\r
-                                    if (AudioUnitGetProperty (audioUnit,\r
-                                                              kAudioUnitProperty_ParameterClumpName,\r
-                                                              kAudioUnitScope_Global,\r
-                                                              0,\r
-                                                              &clumpNameInfo,\r
-                                                              &sz) == noErr)\r
-                                        return String::fromCFString (clumpNameInfo.outName);\r
-\r
-                                    return String (info.clumpID);\r
-                                };\r
-\r
-                                auto group = std::make_unique<AudioProcessorParameterGroup> (String (info.clumpID),\r
-                                                                                             getClumpName(), String());\r
-                                group->addChild (std::unique_ptr<AudioProcessorParameter> (parameter));\r
-                                groupIDMap[info.clumpID] = group.get();\r
-                                parameterGroups.addChild (std::move (group));\r
-                            }\r
-                            else\r
-                            {\r
-                                groupInfo->second->addChild (std::unique_ptr<AudioProcessorParameter> (parameter));\r
-                            }\r
-                        }\r
-                        else\r
-                        {\r
-                            parameterGroups.addChild (std::unique_ptr<AudioProcessorParameter> (parameter));\r
-                        }\r
+                        addParameter (new AUInstanceParameter (*this,\r
+                                                               ids[i],\r
+                                                               paramName,\r
+                                                               info.minValue,\r
+                                                               info.maxValue,\r
+                                                               info.defaultValue,\r
+                                                               (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0,\r
+                                                               isDiscrete,\r
+                                                               isDiscrete ? (int) (info.maxValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(),\r
+                                                               isBoolean,\r
+                                                               label,\r
+                                                               (info.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0));\r
                     }\r
                 }\r
             }\r
         }\r
 \r
-        parameterTree.swapWith (parameterGroups);\r
-\r
         UInt32 propertySize = 0;\r
         Boolean writable = false;\r
 \r
@@ -1502,10 +1484,7 @@ private:
     String pluginName, manufacturer, version;\r
     String fileOrIdentifier;\r
     CriticalSection lock;\r
-\r
-    bool wantsMidiMessages = false, producesMidiMessages = false,\r
-         wasPlaying = false, prepared = false,\r
-         isAUv3 = false, isMidiEffectPlugin = false;\r
+    bool wantsMidiMessages, producesMidiMessages, wasPlaying, prepared, isAUv3, isMidiEffectPlugin, lastBypassValue = false;\r
 \r
     struct AUBuffer\r
     {\r
@@ -1542,7 +1521,7 @@ private:
                 if (AudioUnitGetProperty (parent.audioUnit, kAudioUnitProperty_BypassEffect,\r
                                           kAudioUnitScope_Global, 0, &value, &dataSize) == noErr\r
                                && dataSize == sizeof (UInt32))\r
-                    return value != 0;\r
+                    return (value != 0);\r
             }\r
 \r
             return false;\r
@@ -1620,7 +1599,7 @@ private:
 \r
     OwnedArray<AUBuffer> outputBufferList;\r
     AudioTimeStamp timeStamp;\r
-    AudioBuffer<float>* currentBuffer = nullptr;\r
+    AudioBuffer<float>* currentBuffer;\r
     Array<Array<AudioChannelSet>> supportedInLayouts, supportedOutLayouts;\r
 \r
     int numChannelInfos;\r
@@ -1823,7 +1802,7 @@ private:
     {\r
         if (pktlist != nullptr && pktlist->numPackets)\r
         {\r
-            auto time = Time::getMillisecondCounterHiRes() * 0.001;\r
+            const double time = Time::getMillisecondCounterHiRes() * 0.001;\r
             const MIDIPacket* packet = &pktlist->packet[0];\r
 \r
             for (UInt32 i = 0; i < pktlist->numPackets; ++i)\r
@@ -1844,27 +1823,27 @@ private:
 \r
     OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const\r
     {\r
-        if (auto* ph = getPlayHead())\r
-        {\r
-            AudioPlayHead::CurrentPositionInfo result;\r
+        AudioPlayHead* const ph = getPlayHead();\r
+        AudioPlayHead::CurrentPositionInfo result;\r
 \r
-            if (ph->getCurrentPosition (result))\r
-            {\r
-                setIfNotNull (outCurrentBeat, result.ppqPosition);\r
-                setIfNotNull (outCurrentTempo, result.bpm);\r
-                return noErr;\r
-            }\r
+        if (ph != nullptr && ph->getCurrentPosition (result))\r
+        {\r
+            setIfNotNull (outCurrentBeat, result.ppqPosition);\r
+            setIfNotNull (outCurrentTempo, result.bpm);\r
+        }\r
+        else\r
+        {\r
+            setIfNotNull (outCurrentBeat, 0);\r
+            setIfNotNull (outCurrentTempo, 120.0);\r
         }\r
 \r
-        setIfNotNull (outCurrentBeat, 0);\r
-        setIfNotNull (outCurrentTempo, 120.0);\r
         return noErr;\r
     }\r
 \r
     OSStatus getMusicalTimeLocation (UInt32* outDeltaSampleOffsetToNextBeat, Float32* outTimeSig_Numerator,\r
                                      UInt32* outTimeSig_Denominator, Float64* outCurrentMeasureDownBeat) const\r
     {\r
-        if (auto* ph = getPlayHead())\r
+        if (AudioPlayHead* const ph = getPlayHead())\r
         {\r
             AudioPlayHead::CurrentPositionInfo result;\r
 \r
@@ -1889,7 +1868,7 @@ private:
                                 Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling,\r
                                 Float64* outCycleStartBeat, Float64* outCycleEndBeat)\r
     {\r
-        if (auto* ph = getPlayHead())\r
+        if (AudioPlayHead* const ph = getPlayHead())\r
         {\r
             AudioPlayHead::CurrentPositionInfo result;\r
 \r
@@ -1926,7 +1905,7 @@ private:
                                             UInt32 inNumberFrames, AudioBufferList* ioData)\r
     {\r
         return static_cast<AudioUnitPluginInstance*> (hostRef)\r
-                 ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);\r
+                    ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);\r
     }\r
 \r
     static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp*, UInt32 /*midiOutNum*/,\r
@@ -1969,14 +1948,13 @@ private:
      #endif\r
 \r
         UInt64 currentTime = mach_absolute_time();\r
-        static mach_timebase_info_data_t sTimebaseInfo = { 0, 0 };\r
+        static mach_timebase_info_data_t sTimebaseInfo = {0, 0};\r
 \r
         if (sTimebaseInfo.denom == 0)\r
             mach_timebase_info (&sTimebaseInfo);\r
 \r
-        auto bufferNanos = static_cast<double> (numSamples) * 1.0e9 / sampleRate;\r
-        auto bufferTicks = static_cast<UInt64> (std::ceil (bufferNanos * (static_cast<double> (sTimebaseInfo.denom)\r
-                                                                          / static_cast<double> (sTimebaseInfo.numer))));\r
+        double bufferNanos = static_cast<double> (numSamples) * 1.0e9 / sampleRate;\r
+        UInt64 bufferTicks = static_cast<UInt64> (std::ceil (bufferNanos * (static_cast<double> (sTimebaseInfo.denom) / static_cast<double> (sTimebaseInfo.numer))));\r
         currentTime += bufferTicks;\r
 \r
         return currentTime;\r
@@ -1986,9 +1964,10 @@ private:
     {\r
         UInt32 countSize;\r
         Boolean writable;\r
+        OSStatus err;\r
         AudioUnitScope scope = (isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output);\r
 \r
-        auto err = AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &countSize, &writable);\r
+        err = AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &countSize, &writable);\r
 \r
         return (err == noErr && writable != 0 && countSize == sizeof (UInt32));\r
     }\r
@@ -2004,7 +1983,7 @@ private:
         UInt32 count;\r
         UInt32 countSize = sizeof (count);\r
 \r
-        auto err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);\r
+        OSStatus err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);\r
         jassert (err == noErr);\r
         ignoreUnused (err);\r
 \r
@@ -2069,7 +2048,7 @@ private:
         {\r
             const bool isInput = (dir == 0);\r
             const AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;\r
-            auto n = getElementCount (scope);\r
+            const int n = getElementCount (scope);\r
 \r
             for (int busIdx = 0; busIdx < n; ++busIdx)\r
             {\r
@@ -2229,7 +2208,7 @@ class AudioUnitPluginWindowCocoa    : public AudioProcessorEditor
 public:\r
     AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded)\r
         : AudioProcessorEditor (&p),\r
-          plugin (p)\r
+          plugin (p), waitingForViewCallback (false)\r
     {\r
         addAndMakeVisible (wrapper);\r
 \r
@@ -2300,9 +2279,9 @@ private:
     ObjCBlock<ViewControllerCallbackBlock> viewControllerCallback;\r
    #endif\r
 \r
-    bool waitingForViewCallback = false;\r
+    bool waitingForViewCallback;\r
 \r
-    bool createView (bool createGenericViewIfNeeded)\r
+    bool createView (const bool createGenericViewIfNeeded)\r
     {\r
         JUCE_IOS_MAC_VIEW* pluginView = nil;\r
         UInt32 dataSize = 0;\r
@@ -2625,8 +2604,10 @@ void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>&
 }\r
 \r
 void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,\r
-                                                  double rate, int blockSize,\r
-                                                  void* userData, PluginCreationCallback callback)\r
+                                                  double rate,\r
+                                                  int blockSize,\r
+                                                  void* userData,\r
+                                                  void (*callback) (void*, AudioPluginInstance*, const String&))\r
 {\r
     using namespace AudioUnitFormatHelpers;\r
 \r
@@ -2664,9 +2645,9 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,
            #endif\r
 \r
             AUAsyncInitializationCallback (double inSampleRate, int inFramesPerBuffer,\r
-                                           void* inUserData, PluginCreationCallback inOriginalCallback)\r
-                : sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer),\r
-                  passUserData (inUserData), originalCallback (inOriginalCallback)\r
+                                           void* inUserData, void (*inOriginalCallback) (void*, AudioPluginInstance*, const String&))\r
+            : sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer),\r
+            passUserData (inUserData), originalCallback (inOriginalCallback)\r
             {\r
                #if JUCE_SUPPORTS_AUv3\r
                 block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion);\r
@@ -2701,14 +2682,15 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,
             double sampleRate;\r
             int framesPerBuffer;\r
             void* passUserData;\r
-            PluginCreationCallback originalCallback;\r
+            void (*originalCallback) (void*, AudioPluginInstance*, const String&);\r
 \r
            #if JUCE_SUPPORTS_AUv3\r
             ObjCBlock<AUCompletionCallbackBlock> block;\r
            #endif\r
         };\r
 \r
-        auto callbackBlock = new AUAsyncInitializationCallback (rate, blockSize, userData, callback);\r
+        AUAsyncInitializationCallback* callbackBlock\r
+            = new AUAsyncInitializationCallback (rate, blockSize, userData, callback);\r
 \r
        #if JUCE_SUPPORTS_AUv3\r
         //==============================================================================\r
@@ -2724,7 +2706,7 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,
        #endif // JUCE_SUPPORTS_AUv3\r
 \r
         AudioComponentInstance audioUnit;\r
-        auto err = AudioComponentInstanceNew(auComponent, &audioUnit);\r
+        OSStatus err = AudioComponentInstanceNew(auComponent, &audioUnit);\r
         callbackBlock->completion (err != noErr ? nullptr : audioUnit, err);\r
     }\r
     else\r
@@ -2798,12 +2780,12 @@ StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&,
 bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier)\r
 {\r
     AudioComponentDescription desc;\r
-    String name, version, manufacturer;\r
 \r
+    String name, version, manufacturer;\r
     if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer))\r
         return AudioComponentFindNext (nullptr, &desc) != nullptr;\r
 \r
-    auto f = File::createFileWithoutCheckingPath (fileOrIdentifier);\r
+    const File f (File::createFileWithoutCheckingPath (fileOrIdentifier));\r
 \r
     return (f.hasFileExtension (".component") || f.hasFileExtension (".appex"))\r
              && f.isDirectory();\r
index ecb0ccb7fd7f5d7c2c97593e14f513352587666b..439c06f8ac5b7b001f7aaf4a6cfc839170a813a5 100644 (file)
@@ -180,9 +180,7 @@ public:
 \r
         inputs.clear();\r
         outputs.clear();\r
-        managedParameters.clear (false);\r
-        AudioProcessorParameterGroup group ({}, {}, {});\r
-        parameterTree.swapWith (group);\r
+        managedParameters.clear();\r
 \r
         for (unsigned int i = 0; i < plugin->PortCount; ++i)\r
         {\r
@@ -518,7 +516,7 @@ private:
             if (useLog && low > 0 && high > 0)\r
                 return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha);\r
 \r
-            return low + (high - low) * alpha;\r
+                return low + (high - low) * alpha;\r
         }\r
 \r
         static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value)\r
@@ -610,9 +608,8 @@ void LADSPAPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& res
     }\r
 }\r
 \r
-void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc,\r
-                                               double sampleRate, int blockSize,\r
-                                               void* userData, PluginCreationCallback callback)\r
+void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc, double sampleRate, int blockSize,\r
+                                               void* userData, void (*callback) (void*, AudioPluginInstance*, const String&))\r
 {\r
     std::unique_ptr<LADSPAPluginInstance> result;\r
 \r
index ed080d25fcf137a801eb957d93e8429220e30e06..dbe205a7a712ca3b0159a279fee9fb16d51de786 100644 (file)
@@ -55,7 +55,8 @@ public:
 private:\r
     //==============================================================================\r
     void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
-                               int initialBufferSize, void* userData, PluginCreationCallback) override;\r
+                               int initialBufferSize, void* userData,\r
+                               void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
 \r
     bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
 \r
index 44d51aa190c894d3c431ffc21f84c5e958bc8d96..7cba0117b2dd93e410e07f35bd0aca33fded94a6 100644 (file)
@@ -151,32 +151,34 @@ static inline Steinberg::Vst::SpeakerArrangement getArrangementForNumChannels (i
 \r
 static inline Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set, AudioChannelSet::ChannelType type) noexcept\r
 {\r
+    using namespace Steinberg::Vst;\r
+\r
     switch (type)\r
     {\r
-        case AudioChannelSet::left:              return Steinberg::Vst::kSpeakerL;\r
-        case AudioChannelSet::right:             return Steinberg::Vst::kSpeakerR;\r
-        case AudioChannelSet::centre:            return (set == AudioChannelSet::mono() ? Steinberg::Vst::kSpeakerM : Steinberg::Vst::kSpeakerC);\r
-\r
-        case AudioChannelSet::LFE:               return Steinberg::Vst::kSpeakerLfe;\r
-        case AudioChannelSet::leftSurround:      return Steinberg::Vst::kSpeakerLs;\r
-        case AudioChannelSet::rightSurround:     return Steinberg::Vst::kSpeakerRs;\r
-        case AudioChannelSet::leftCentre:        return Steinberg::Vst::kSpeakerLc;\r
-        case AudioChannelSet::rightCentre:       return Steinberg::Vst::kSpeakerRc;\r
-        case AudioChannelSet::centreSurround:    return Steinberg::Vst::kSpeakerCs;\r
+        case AudioChannelSet::left:              return kSpeakerL;\r
+        case AudioChannelSet::right:             return kSpeakerR;\r
+        case AudioChannelSet::centre:            return (set == AudioChannelSet::mono() ? kSpeakerM : kSpeakerC);\r
+\r
+        case AudioChannelSet::LFE:               return kSpeakerLfe;\r
+        case AudioChannelSet::leftSurround:      return kSpeakerLs;\r
+        case AudioChannelSet::rightSurround:     return kSpeakerRs;\r
+        case AudioChannelSet::leftCentre:        return kSpeakerLc;\r
+        case AudioChannelSet::rightCentre:       return kSpeakerRc;\r
+        case AudioChannelSet::centreSurround:    return kSpeakerCs;\r
         case AudioChannelSet::leftSurroundSide:  return (1ull << 26); /* kSpeakerLcs */\r
         case AudioChannelSet::rightSurroundSide: return (1ull << 27); /* kSpeakerRcs */\r
         case AudioChannelSet::topMiddle:         return (1ull << 11); /* kSpeakerTm */\r
-        case AudioChannelSet::topFrontLeft:      return Steinberg::Vst::kSpeakerTfl;\r
-        case AudioChannelSet::topFrontCentre:    return Steinberg::Vst::kSpeakerTfc;\r
-        case AudioChannelSet::topFrontRight:     return Steinberg::Vst::kSpeakerTfr;\r
-        case AudioChannelSet::topRearLeft:       return Steinberg::Vst::kSpeakerTrl;\r
-        case AudioChannelSet::topRearCentre:     return Steinberg::Vst::kSpeakerTrc;\r
-        case AudioChannelSet::topRearRight:      return Steinberg::Vst::kSpeakerTrr;\r
-        case AudioChannelSet::LFE2:              return Steinberg::Vst::kSpeakerLfe2;\r
-        case AudioChannelSet::leftSurroundRear:  return Steinberg::Vst::kSpeakerSl;\r
-        case AudioChannelSet::rightSurroundRear: return Steinberg::Vst::kSpeakerSr;\r
-        case AudioChannelSet::wideLeft:          return Steinberg::Vst::kSpeakerPl;\r
-        case AudioChannelSet::wideRight:         return Steinberg::Vst::kSpeakerPr;\r
+        case AudioChannelSet::topFrontLeft:      return kSpeakerTfl;\r
+        case AudioChannelSet::topFrontCentre:    return kSpeakerTfc;\r
+        case AudioChannelSet::topFrontRight:     return kSpeakerTfr;\r
+        case AudioChannelSet::topRearLeft:       return kSpeakerTrl;\r
+        case AudioChannelSet::topRearCentre:     return kSpeakerTrc;\r
+        case AudioChannelSet::topRearRight:      return kSpeakerTrr;\r
+        case AudioChannelSet::LFE2:              return kSpeakerLfe2;\r
+        case AudioChannelSet::leftSurroundRear:  return kSpeakerSl;\r
+        case AudioChannelSet::rightSurroundRear: return kSpeakerSr;\r
+        case AudioChannelSet::wideLeft:          return kSpeakerPl;\r
+        case AudioChannelSet::wideRight:         return kSpeakerPr;\r
         case AudioChannelSet::ambisonicACN0:     return (1ull << 20); /* kSpeakerACN0 */\r
         case AudioChannelSet::ambisonicACN1:     return (1ull << 21); /* kSpeakerACN1 */\r
         case AudioChannelSet::ambisonicACN2:     return (1ull << 22); /* kSpeakerACN2 */\r
@@ -196,7 +198,7 @@ static inline Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set
         case AudioChannelSet::topSideLeft:       return (1ull << 24); /* kSpeakerTsl */\r
         case AudioChannelSet::topSideRight:      return (1ull << 25); /* kSpeakerTsr */\r
 \r
-        case AudioChannelSet::discreteChannel0:  return Steinberg::Vst::kSpeakerM;\r
+        case AudioChannelSet::discreteChannel0:  return kSpeakerM;\r
         default:\r
             break;\r
     }\r
@@ -217,53 +219,55 @@ static inline Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set
 \r
 static inline AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::SpeakerArrangement arr, Steinberg::Vst::Speaker type) noexcept\r
 {\r
+    using namespace Steinberg::Vst;\r
+\r
     switch (type)\r
     {\r
-        case Steinberg::Vst::kSpeakerL:     return AudioChannelSet::left;\r
-        case Steinberg::Vst::kSpeakerR:     return AudioChannelSet::right;\r
-        case Steinberg::Vst::kSpeakerC:     return AudioChannelSet::centre;\r
-        case Steinberg::Vst::kSpeakerLfe:   return AudioChannelSet::LFE;\r
-        case Steinberg::Vst::kSpeakerLs:    return AudioChannelSet::leftSurround;\r
-        case Steinberg::Vst::kSpeakerRs:    return AudioChannelSet::rightSurround;\r
-        case Steinberg::Vst::kSpeakerLc:    return AudioChannelSet::leftCentre;\r
-        case Steinberg::Vst::kSpeakerRc:    return AudioChannelSet::rightCentre;\r
-        case Steinberg::Vst::kSpeakerCs:    return AudioChannelSet::centreSurround;\r
-        case Steinberg::Vst::kSpeakerSl:    return AudioChannelSet::leftSurroundRear;\r
-        case Steinberg::Vst::kSpeakerSr:    return AudioChannelSet::rightSurroundRear;\r
+        case kSpeakerL:     return AudioChannelSet::left;\r
+        case kSpeakerR:     return AudioChannelSet::right;\r
+        case kSpeakerC:     return AudioChannelSet::centre;\r
+        case kSpeakerLfe:   return AudioChannelSet::LFE;\r
+        case kSpeakerLs:    return AudioChannelSet::leftSurround;\r
+        case kSpeakerRs:    return AudioChannelSet::rightSurround;\r
+        case kSpeakerLc:    return AudioChannelSet::leftCentre;\r
+        case kSpeakerRc:    return AudioChannelSet::rightCentre;\r
+        case kSpeakerCs:    return AudioChannelSet::centreSurround;\r
+        case kSpeakerSl:    return AudioChannelSet::leftSurroundRear;\r
+        case kSpeakerSr:    return AudioChannelSet::rightSurroundRear;\r
         case (1ull << 11):  return AudioChannelSet::topMiddle;  /* kSpeakerTm */\r
-        case Steinberg::Vst::kSpeakerTfl:   return AudioChannelSet::topFrontLeft;\r
-        case Steinberg::Vst::kSpeakerTfc:   return AudioChannelSet::topFrontCentre;\r
-        case Steinberg::Vst::kSpeakerTfr:   return AudioChannelSet::topFrontRight;\r
-        case Steinberg::Vst::kSpeakerTrl:   return AudioChannelSet::topRearLeft;\r
-        case Steinberg::Vst::kSpeakerTrc:   return AudioChannelSet::topRearCentre;\r
-        case Steinberg::Vst::kSpeakerTrr:   return AudioChannelSet::topRearRight;\r
-        case Steinberg::Vst::kSpeakerLfe2:  return AudioChannelSet::LFE2;\r
-        case (1ull << 19):                  return ((arr & Steinberg::Vst::kSpeakerC) != 0 ? AudioChannelSet::discreteChannel0 : AudioChannelSet::centre);\r
-        case (1ull << 20):                  return AudioChannelSet::ambisonicACN0;  /* kSpeakerACN0 */\r
-        case (1ull << 21):                  return AudioChannelSet::ambisonicACN1;  /* kSpeakerACN1 */\r
-        case (1ull << 22):                  return AudioChannelSet::ambisonicACN2;  /* kSpeakerACN2 */\r
-        case (1ull << 23):                  return AudioChannelSet::ambisonicACN3;  /* kSpeakerACN3 */\r
-        case (1ull << 38):                  return AudioChannelSet::ambisonicACN4;  /* kSpeakerACN4 */\r
-        case (1ull << 39):                  return AudioChannelSet::ambisonicACN5;  /* kSpeakerACN5 */\r
-        case (1ull << 40):                  return AudioChannelSet::ambisonicACN6;  /* kSpeakerACN6 */\r
-        case (1ull << 41):                  return AudioChannelSet::ambisonicACN7;  /* kSpeakerACN7 */\r
-        case (1ull << 42):                  return AudioChannelSet::ambisonicACN8;  /* kSpeakerACN8 */\r
-        case (1ull << 43):                  return AudioChannelSet::ambisonicACN9;  /* kSpeakerACN9 */\r
-        case (1ull << 44):                  return AudioChannelSet::ambisonicACN10; /* kSpeakerACN10 */\r
-        case (1ull << 45):                  return AudioChannelSet::ambisonicACN11; /* kSpeakerACN11 */\r
-        case (1ull << 46):                  return AudioChannelSet::ambisonicACN12; /* kSpeakerACN12 */\r
-        case (1ull << 47):                  return AudioChannelSet::ambisonicACN13; /* kSpeakerACN13 */\r
-        case (1ull << 48):                  return AudioChannelSet::ambisonicACN14; /* kSpeakerACN14 */\r
-        case (1ull << 49):                  return AudioChannelSet::ambisonicACN15; /* kSpeakerACN15 */\r
-        case (1ull << 24):                  return AudioChannelSet::topSideLeft;  /* kSpeakerTsl */\r
-        case (1ull << 25):                  return AudioChannelSet::topSideRight; /* kSpeakerTsr */\r
-        case (1ull << 26):                  return AudioChannelSet::leftSurroundSide;  /* kSpeakerLcs */\r
-        case (1ull << 27):                  return AudioChannelSet::rightSurroundSide; /* kSpeakerRcs */\r
-        case (1ull << 28):                  return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 3); /* kSpeakerBfl */\r
-        case (1ull << 29):                  return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 4); /* kSpeakerBfc */\r
-        case (1ull << 30):                  return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 5); /* kSpeakerBfr */\r
-        case Steinberg::Vst::kSpeakerPl:    return AudioChannelSet::wideLeft;\r
-        case Steinberg::Vst::kSpeakerPr:    return AudioChannelSet::wideRight;\r
+        case kSpeakerTfl:   return AudioChannelSet::topFrontLeft;\r
+        case kSpeakerTfc:   return AudioChannelSet::topFrontCentre;\r
+        case kSpeakerTfr:   return AudioChannelSet::topFrontRight;\r
+        case kSpeakerTrl:   return AudioChannelSet::topRearLeft;\r
+        case kSpeakerTrc:   return AudioChannelSet::topRearCentre;\r
+        case kSpeakerTrr:   return AudioChannelSet::topRearRight;\r
+        case kSpeakerLfe2:  return AudioChannelSet::LFE2;\r
+        case (1ull << 19):  return ((arr & kSpeakerC) != 0 ? AudioChannelSet::discreteChannel0 : AudioChannelSet::centre);\r
+        case (1ull << 20):  return AudioChannelSet::ambisonicACN0;  /* kSpeakerACN0 */\r
+        case (1ull << 21):  return AudioChannelSet::ambisonicACN1;  /* kSpeakerACN1 */\r
+        case (1ull << 22):  return AudioChannelSet::ambisonicACN2;  /* kSpeakerACN2 */\r
+        case (1ull << 23):  return AudioChannelSet::ambisonicACN3;  /* kSpeakerACN3 */\r
+        case (1ull << 38):  return AudioChannelSet::ambisonicACN4;  /* kSpeakerACN4 */\r
+        case (1ull << 39):  return AudioChannelSet::ambisonicACN5;  /* kSpeakerACN5 */\r
+        case (1ull << 40):  return AudioChannelSet::ambisonicACN6;  /* kSpeakerACN6 */\r
+        case (1ull << 41):  return AudioChannelSet::ambisonicACN7;  /* kSpeakerACN7 */\r
+        case (1ull << 42):  return AudioChannelSet::ambisonicACN8;  /* kSpeakerACN8 */\r
+        case (1ull << 43):  return AudioChannelSet::ambisonicACN9;  /* kSpeakerACN9 */\r
+        case (1ull << 44):  return AudioChannelSet::ambisonicACN10; /* kSpeakerACN10 */\r
+        case (1ull << 45):  return AudioChannelSet::ambisonicACN11; /* kSpeakerACN11 */\r
+        case (1ull << 46):  return AudioChannelSet::ambisonicACN12; /* kSpeakerACN12 */\r
+        case (1ull << 47):  return AudioChannelSet::ambisonicACN13; /* kSpeakerACN13 */\r
+        case (1ull << 48):  return AudioChannelSet::ambisonicACN14; /* kSpeakerACN14 */\r
+        case (1ull << 49):  return AudioChannelSet::ambisonicACN15; /* kSpeakerACN15 */\r
+        case (1ull << 24):  return AudioChannelSet::topSideLeft;  /* kSpeakerTsl */\r
+        case (1ull << 25):  return AudioChannelSet::topSideRight; /* kSpeakerTsr */\r
+        case (1ull << 26):  return AudioChannelSet::leftSurroundSide;  /* kSpeakerLcs */\r
+        case (1ull << 27):  return AudioChannelSet::rightSurroundSide; /* kSpeakerRcs */\r
+        case (1ull << 28):  return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 3); /* kSpeakerBfl */\r
+        case (1ull << 29):  return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 4); /* kSpeakerBfc */\r
+        case (1ull << 30):  return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 5); /* kSpeakerBfr */\r
+        case kSpeakerPl:    return AudioChannelSet::wideLeft;\r
+        case kSpeakerPr:    return AudioChannelSet::wideRight;\r
         default: break;\r
     }\r
 \r
@@ -492,47 +496,20 @@ public:
         }\r
     }\r
 \r
-    static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer,\r
-                             Steinberg::Vst::IParameterChanges* parameterChanges = nullptr,\r
-                             Steinberg::Vst::IMidiMapping* midiMapping = nullptr)\r
+    static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer)\r
     {\r
         MidiBuffer::Iterator iterator (midiBuffer);\r
-        const uint8* midiEventData = nullptr;\r
-        int midiEventSize = 0;\r
+        MidiMessage msg;\r
         int midiEventPosition = 0;\r
 \r
         enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once\r
         int numEvents = 0;\r
 \r
-        while (iterator.getNextEvent (midiEventData, midiEventSize, midiEventPosition))\r
+        while (iterator.getNextEvent (msg, midiEventPosition))\r
         {\r
             if (++numEvents > maxNumEvents)\r
                 break;\r
 \r
-            MidiMessage msg (midiEventData, midiEventSize);\r
-\r
-            if (midiMapping != nullptr && parameterChanges != nullptr)\r
-            {\r
-                Vst3MidiControlEvent controlEvent;\r
-\r
-                if (toVst3ControlEvent (msg, controlEvent))\r
-                {\r
-                    Steinberg::Vst::ParamID controlParamID;\r
-\r
-                    if (midiMapping->getMidiControllerAssignment (0, createSafeChannel (msg.getChannel()),\r
-                                                                  controlEvent.controllerNumber,\r
-                                                                  controlParamID) == Steinberg::kResultOk)\r
-                    {\r
-                        Steinberg::int32 ignore;\r
-\r
-                        if (auto* queue = parameterChanges->addParameterData (controlParamID, ignore))\r
-                            queue->addPoint (midiEventPosition, controlEvent.paramValue, ignore);\r
-                    }\r
-\r
-                    continue;\r
-                }\r
-            }\r
-\r
             Steinberg::Vst::Event e = { 0 };\r
 \r
             if (msg.isNoteOn())\r
@@ -557,16 +534,16 @@ public:
             else if (msg.isSysEx())\r
             {\r
                 e.type          = Steinberg::Vst::Event::kDataEvent;\r
-                e.data.bytes    = midiEventData + 1;\r
+                e.data.bytes    = msg.getSysExData();\r
                 e.data.size     = (uint32) msg.getSysExDataSize();\r
                 e.data.type     = Steinberg::Vst::DataEvent::kMidiSysEx;\r
             }\r
-            else if (msg.isChannelPressure())\r
+            else if (msg.isAftertouch())\r
             {\r
                 e.type                   = Steinberg::Vst::Event::kPolyPressureEvent;\r
                 e.polyPressure.channel   = createSafeChannel (msg.getChannel());\r
                 e.polyPressure.pitch     = createSafeNote (msg.getNoteNumber());\r
-                e.polyPressure.pressure  = normaliseMidiValue (msg.getChannelPressureValue());\r
+                e.polyPressure.pressure  = normaliseMidiValue (msg.getAfterTouchValue());\r
             }\r
             else\r
             {\r
@@ -593,24 +570,6 @@ private:
     static float normaliseMidiValue (int value) noexcept              { return jlimit (0.0f, 1.0f, (float) value / 127.0f); }\r
     static int denormaliseToMidiValue (float value) noexcept          { return roundToInt (jlimit (0.0f, 127.0f, value * 127.0f)); }\r
 \r
-    //==============================================================================\r
-    struct Vst3MidiControlEvent\r
-    {\r
-        Steinberg::Vst::CtrlNumber controllerNumber;\r
-        Steinberg::Vst::ParamValue paramValue;\r
-    };\r
-\r
-    static bool toVst3ControlEvent (const MidiMessage& msg, Vst3MidiControlEvent& result)\r
-    {\r
-        result.controllerNumber = -1;\r
-\r
-        if      (msg.isController())        result = { (Steinberg::Vst::CtrlNumber) msg.getControllerNumber(), msg.getControllerValue() / 127.0};\r
-        else if (msg.isPitchWheel())        result = { Steinberg::Vst::kPitchBend, msg.getPitchWheelValue() / 16383.0};\r
-        else if (msg.isAftertouch())        result = { Steinberg::Vst::kAfterTouch, msg.getAfterTouchValue() / 127.0};\r
-\r
-        return (result.controllerNumber != -1);\r
-    }\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiEventList)\r
 };\r
 \r
index 5fabf370c8b3b267df93f5df74e892b1d1b6f34b..b33acf5bd420e3ed5412e7f3e0ca6226e68cd0c1 100644 (file)
@@ -47,9 +47,6 @@
  #pragma clang diagnostic ignored "-Wdeprecated-declarations"\r
  #pragma clang diagnostic ignored "-Wextra-semi"\r
  #pragma clang diagnostic ignored "-Wmissing-braces"\r
- #if __has_warning("-Wpragma-pack")\r
-  #pragma clang diagnostic ignored "-Wpragma-pack"\r
- #endif\r
  #if __has_warning("-Wcomma")\r
   #pragma clang diagnostic ignored "-Wcomma"\r
  #endif\r
index dcd967bdb9ed35773f564dc2aca212980179a42d..b6aabd110bdc8966fe3a45397b355341c0bb67d8 100644 (file)
@@ -36,6 +36,9 @@ namespace juce
 using namespace Steinberg;\r
 \r
 //==============================================================================\r
+struct VST3Classes\r
+{\r
+\r
 #ifndef JUCE_VST3_DEBUGGING\r
  #define JUCE_VST3_DEBUGGING 0\r
 #endif\r
@@ -165,6 +168,15 @@ static void setStateForAllBusesOfType (Vst::IComponent* component,
         warnOnFailure (component->activateBus (mediaType, direction, i, state));\r
 }\r
 \r
+//==============================================================================\r
+/** Assigns a complete AudioBuffer's channels to an AudioBusBuffers' */\r
+static void associateWholeBufferTo (Vst::AudioBusBuffers& vstBuffers, AudioBuffer<float>& buffer) noexcept\r
+{\r
+    vstBuffers.channelBuffers32 = buffer.getArrayOfWritePointers();\r
+    vstBuffers.numChannels      = buffer.getNumChannels();\r
+    vstBuffers.silenceFlags     = 0;\r
+}\r
+\r
 //==============================================================================\r
 static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playHead, double sampleRate)\r
 {\r
@@ -235,7 +247,7 @@ static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playH
 }\r
 \r
 //==============================================================================\r
-class VST3PluginInstance;\r
+struct VST3PluginInstance;\r
 \r
 struct VST3HostContext  : public Vst::IComponentHandler,  // From VST V3.0.0\r
                           public Vst::IComponentHandler2, // From VST V3.1.0 (a very well named class, of course!)\r
@@ -262,11 +274,96 @@ struct VST3HostContext  : public Vst::IComponentHandler,  // From VST V3.0.0
     }\r
 \r
     //==============================================================================\r
-    tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override;\r
-    tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override;\r
-    tresult PLUGIN_API endEdit (Vst::ParamID paramID) override;\r
+    tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override\r
+    {\r
+        if (plugin != nullptr)\r
+        {\r
+            auto index = getIndexOfParamID (paramID);\r
+\r
+            if (index < 0)\r
+                return kResultFalse;\r
+\r
+            if (auto* param = plugin->getParameters()[index])\r
+                param->beginChangeGesture();\r
+            else\r
+                jassertfalse; // Invalid parameter index!\r
+        }\r
+\r
+        return kResultTrue;\r
+    }\r
 \r
-    tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override;\r
+    tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override\r
+    {\r
+        if (plugin != nullptr)\r
+        {\r
+            auto index = getIndexOfParamID (paramID);\r
+\r
+            if (index < 0)\r
+                return kResultFalse;\r
+\r
+            if (auto* param = plugin->getParameters()[index])\r
+                param->sendValueChangedMessageToListeners ((float) valueNormalized);\r
+            else\r
+                jassertfalse; // Invalid parameter index!\r
+\r
+            {\r
+                Steinberg::int32 eventIndex;\r
+                plugin->inputParameterChanges->addParameterData (paramID, eventIndex)->addPoint (0, valueNormalized, eventIndex);\r
+            }\r
+\r
+            // did the plug-in already update the parameter internally\r
+            if (plugin->editController->getParamNormalized (paramID) != (float) valueNormalized)\r
+                return plugin->editController->setParamNormalized (paramID, valueNormalized);\r
+        }\r
+\r
+        return kResultTrue;\r
+    }\r
+\r
+    tresult PLUGIN_API endEdit (Vst::ParamID paramID) override\r
+    {\r
+        if (plugin != nullptr)\r
+        {\r
+            auto index = getIndexOfParamID (paramID);\r
+\r
+            if (index < 0)\r
+                return kResultFalse;\r
+\r
+            if (auto* param = plugin->getParameters()[index])\r
+                param->endChangeGesture();\r
+            else\r
+                jassertfalse; // Invalid parameter index!\r
+        }\r
+\r
+        return kResultTrue;\r
+    }\r
+\r
+    tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override\r
+    {\r
+        if (plugin != nullptr)\r
+        {\r
+            if (hasFlag (flags, Vst::kReloadComponent))\r
+                plugin->reset();\r
+\r
+            if (hasFlag (flags, Vst::kIoChanged))\r
+            {\r
+                auto sampleRate = plugin->getSampleRate();\r
+                auto blockSize  = plugin->getBlockSize();\r
+\r
+                plugin->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0,\r
+                                       blockSize > 0 ? blockSize : 1024);\r
+            }\r
+\r
+            if (hasFlag (flags, Vst::kLatencyChanged))\r
+                if (plugin->processor != nullptr)\r
+                    plugin->setLatencySamples (jmax (0, (int) plugin->processor->getLatencySamples()));\r
+\r
+            plugin->updateHostDisplay();\r
+            return kResultTrue;\r
+        }\r
+\r
+        jassertfalse;\r
+        return kResultFalse;\r
+    }\r
 \r
     //==============================================================================\r
     tresult PLUGIN_API setDirty (TBool) override\r
@@ -356,7 +453,63 @@ struct VST3HostContext  : public Vst::IComponentHandler,  // From VST V3.0.0
             return kResultFalse;\r
         }\r
 \r
-        tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override;\r
+        tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override\r
+        {\r
+            Array<const Item*> subItemStack;\r
+            OwnedArray<PopupMenu> menuStack;\r
+            PopupMenu* topLevelMenu = menuStack.add (new PopupMenu());\r
+\r
+            for (int i = 0; i < items.size(); ++i)\r
+            {\r
+                auto& item = items.getReference (i).item;\r
+                auto* menuToUse = menuStack.getLast();\r
+\r
+                if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled))\r
+                {\r
+                    subItemStack.add (&item);\r
+                    menuStack.add (new PopupMenu());\r
+                }\r
+                else if (hasFlag (item.flags, Item::kIsGroupEnd))\r
+                {\r
+                    if (auto* subItem = subItemStack.getLast())\r
+                    {\r
+                        if (auto* m = menuStack [menuStack.size() - 2])\r
+                            m->addSubMenu (toString (subItem->name), *menuToUse,\r
+                                           ! hasFlag (subItem->flags, Item::kIsDisabled),\r
+                                           nullptr,\r
+                                           hasFlag (subItem->flags, Item::kIsChecked));\r
+\r
+                        menuStack.removeLast (1);\r
+                        subItemStack.removeLast (1);\r
+                    }\r
+                }\r
+                else if (hasFlag (item.flags, Item::kIsSeparator))\r
+                {\r
+                    menuToUse->addSeparator();\r
+                }\r
+                else\r
+                {\r
+                    menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement,\r
+                                        toString (item.name),\r
+                                        ! hasFlag (item.flags, Item::kIsDisabled),\r
+                                        hasFlag (item.flags, Item::kIsChecked));\r
+                }\r
+            }\r
+\r
+            PopupMenu::Options options;\r
+\r
+            if (auto* ed = owner.getActiveEditor())\r
+                options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1));\r
+\r
+           #if JUCE_MODAL_LOOPS_PERMITTED\r
+            // Unfortunately, Steinberg's docs explicitly say this should be modal..\r
+            handleResult (topLevelMenu->showMenu (options));\r
+           #else\r
+            topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, ComSmartPtr<ContextMenu> (this)));\r
+           #endif\r
+\r
+            return kResultOk;\r
+        }\r
 \r
        #if ! JUCE_MODAL_LOOPS_PERMITTED\r
         static void menuFinished (int modalResult, ComSmartPtr<ContextMenu> menu)  { menu->handleResult (modalResult); }\r
@@ -460,7 +613,13 @@ struct VST3HostContext  : public Vst::IComponentHandler,  // From VST V3.0.0
         return kResultFalse;\r
     }\r
 \r
-    tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override;\r
+    tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override\r
+    {\r
+        if (plugin != nullptr)\r
+            plugin->syncProgramNames();\r
+\r
+        return kResultTrue;\r
+    }\r
 \r
     //==============================================================================\r
     tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override\r
@@ -492,7 +651,29 @@ private:
     using ParamMapType = std::map<Vst::ParamID, int>;\r
     ParamMapType paramToIndexMap;\r
 \r
-    int getIndexOfParamID (Vst::ParamID paramID);\r
+    int getIndexOfParamID (Vst::ParamID paramID)\r
+    {\r
+        if (plugin == nullptr || plugin->editController == nullptr)\r
+            return -1;\r
+\r
+        auto result = getMappedParamID (paramID);\r
+\r
+        if (result < 0)\r
+        {\r
+            auto numParams = plugin->editController->getParameterCount();\r
+\r
+            for (int i = 0; i < numParams; ++i)\r
+            {\r
+                Vst::ParameterInfo paramInfo;\r
+                plugin->editController->getParameterInfo (i, paramInfo);\r
+                paramToIndexMap[paramInfo.id] = i;\r
+            }\r
+\r
+            result = getMappedParamID (paramID);\r
+        }\r
+\r
+        return result;\r
+    }\r
 \r
     int getMappedParamID (Vst::ParamID paramID)\r
     {\r
@@ -961,7 +1142,7 @@ private:
 \r
                 if (CFBundleLoadExecutableAndReturnError (bundleRef, &error))\r
                 {\r
-                    using BundleEntryProc = bool (*)(CFBundleRef);\r
+                    typedef bool (*BundleEntryProc)(CFBundleRef);\r
 \r
                     if (auto proc = (BundleEntryProc) getFunction ("bundleEntry"))\r
                     {\r
@@ -1101,10 +1282,6 @@ private:
 //==============================================================================\r
 struct VST3PluginWindow : public AudioProcessorEditor,\r
                           public ComponentMovementWatcher,\r
-                         #if ! JUCE_MAC\r
-                          public ComponentPeer::ScaleFactorListener,\r
-                          public Timer,\r
-                         #endif\r
                           public IPlugFrame\r
 {\r
     VST3PluginWindow (AudioProcessor* owner, IPlugView* pluginView)\r
@@ -1117,19 +1294,7 @@ struct VST3PluginWindow : public AudioProcessorEditor,
         setVisible (true);\r
 \r
         warnOnFailure (view->setFrame (this));\r
-\r
-       #if JUCE_MAC\r
         resizeToFit();\r
-       #endif\r
-\r
-        Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
-        view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
-\r
-        if (scaleInterface != nullptr)\r
-        {\r
-            pluginRespondsToDPIChanges = true;\r
-            scaleInterface->release();\r
-        }\r
     }\r
 \r
     ~VST3PluginWindow()\r
@@ -1144,12 +1309,6 @@ struct VST3PluginWindow : public AudioProcessorEditor,
        #endif\r
 \r
         view = nullptr;\r
-\r
-       #if ! JUCE_MAC\r
-        for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
-            if (auto* p = ComponentPeer::getPeer (i))\r
-                p->removeScaleFactorListener (this);\r
-       #endif\r
     }\r
 \r
     JUCE_DECLARE_VST3_COM_REF_METHODS\r
@@ -1175,14 +1334,6 @@ struct VST3PluginWindow : public AudioProcessorEditor,
     bool keyPressed (const KeyPress& /*key*/) override  { return true; }\r
 \r
     //==============================================================================\r
-    void componentPeerChanged() override\r
-    {\r
-       #if ! JUCE_MAC\r
-        if (auto* topPeer = getTopLevelComponent()->getPeer())\r
-            topPeer->addScaleFactorListener (this);\r
-       #endif\r
-    }\r
-\r
     void componentMovedOrResized (bool, bool wasResized) override\r
     {\r
         if (recursiveResize)\r
@@ -1193,7 +1344,7 @@ struct VST3PluginWindow : public AudioProcessorEditor,
         if (topComp->getPeer() != nullptr)\r
         {\r
            #if JUCE_WINDOWS\r
-            auto pos = (topComp->getLocalPoint (this, Point<int>()) * nativeScaleFactor).roundToInt();\r
+            auto pos = topComp->getLocalPoint (this, Point<int>());\r
            #endif\r
 \r
             recursiveResize = true;\r
@@ -1202,18 +1353,17 @@ struct VST3PluginWindow : public AudioProcessorEditor,
 \r
             if (wasResized && view->canResize() == kResultTrue)\r
             {\r
-                rect.right  = (Steinberg::int32) roundToInt (getWidth()  * nativeScaleFactor);\r
-                rect.bottom = (Steinberg::int32) roundToInt (getHeight() * nativeScaleFactor);\r
-\r
+                rect.right  = (Steinberg::int32) getWidth();\r
+                rect.bottom = (Steinberg::int32) getHeight();\r
                 view->checkSizeConstraint (&rect);\r
 \r
-                auto w = roundToInt (rect.getWidth()  / nativeScaleFactor);\r
-                auto h = roundToInt (rect.getHeight() / nativeScaleFactor);\r
+                auto w = (int) rect.getWidth();\r
+                auto h = (int) rect.getHeight();\r
                 setSize (w, h);\r
 \r
                #if JUCE_WINDOWS\r
                 SetWindowPos (pluginHandle, 0,\r
-                              pos.x, pos.y, rect.getWidth(), rect.getHeight(),\r
+                              pos.x, pos.y, w, h,\r
                               isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW);\r
                #elif JUCE_MAC\r
                 embeddedComponent.setBounds (getLocalBounds());\r
@@ -1241,79 +1391,19 @@ struct VST3PluginWindow : public AudioProcessorEditor,
         }\r
     }\r
 \r
+    void componentPeerChanged() override {}\r
+\r
     void componentVisibilityChanged() override\r
     {\r
         attachPluginWindow();\r
-\r
-       #if ! JUCE_MAC\r
-        if (auto* topPeer = getTopLevelComponent()->getPeer())\r
-            nativeScaleFactorChanged ((float) topPeer->getPlatformScaleFactor());\r
-       #endif\r
-\r
-        if (! hasDoneInitialResize)\r
-            resizeToFit();\r
-\r
         componentMovedOrResized (true, true);\r
     }\r
 \r
-   #if ! JUCE_MAC\r
-    void nativeScaleFactorChanged (double newScaleFactor) override\r
-    {\r
-        if (pluginHandle == nullptr || approximatelyEqual ((float) newScaleFactor, nativeScaleFactor))\r
-            return;\r
-\r
-        nativeScaleFactor = (float) newScaleFactor;\r
-\r
-        if (pluginRespondsToDPIChanges)\r
-        {\r
-            Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
-            view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
-\r
-            if (scaleInterface != nullptr)\r
-            {\r
-                scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor);\r
-                scaleInterface->release();\r
-            }\r
-        }\r
-        else\r
-        {\r
-            // If the plug-in doesn't respond to scale factor changes then we need to scale our window, but\r
-            // we can't do it immediately as it may cause a recursive resize loop so fire up a timer\r
-            startTimerHz (4);\r
-        }\r
-    }\r
-\r
-    bool willCauseRecursiveResize (int w, int h)\r
-    {\r
-        auto newScreenBounds = Rectangle<int> (w, h).withPosition (getScreenPosition());\r
-\r
-        return Desktop::getInstance().getDisplays().findDisplayForRect (newScreenBounds).scale != nativeScaleFactor;\r
-    }\r
-\r
-    void timerCallback() override\r
-    {\r
-        ViewRect rect;\r
-        warnOnFailure (view->getSize (&rect));\r
-\r
-        auto w = roundToInt ((rect.right - rect.left) / nativeScaleFactor);\r
-        auto h = roundToInt ((rect.bottom - rect.top) / nativeScaleFactor);\r
-\r
-        if (willCauseRecursiveResize (w, h))\r
-            return;\r
-\r
-        // window can be resized safely now\r
-        stopTimer();\r
-        setSize (w, h);\r
-    }\r
-   #endif\r
-\r
     void resizeToFit()\r
     {\r
         ViewRect rect;\r
         warnOnFailure (view->getSize (&rect));\r
-        resizeWithRect (*this, rect, nativeScaleFactor);\r
-\r
-        hasDoneInitialResize = true;\r
+        resizeWithRect (*this, rect);\r
     }\r
 \r
     tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override\r
@@ -1322,7 +1412,7 @@ struct VST3PluginWindow : public AudioProcessorEditor,
              && newSize != nullptr\r
              && incomingView == view)\r
         {\r
-            resizeWithRect (embeddedComponent, *newSize, nativeScaleFactor);\r
+            resizeWithRect (embeddedComponent, *newSize);\r
             setSize (embeddedComponent.getWidth(), embeddedComponent.getHeight());\r
             return kResultTrue;\r
         }\r
@@ -1331,6 +1421,19 @@ struct VST3PluginWindow : public AudioProcessorEditor,
         return kInvalidArgument;\r
     }\r
 \r
+    void setScaleFactor (float newScale) override\r
+    {\r
+        Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
+        view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
+\r
+        if (scaleInterface != nullptr)\r
+        {\r
+            scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) newScale);\r
+            scaleInterface->release();\r
+            resizeToFit();\r
+        }\r
+    }\r
+\r
 private:\r
     //==============================================================================\r
     Atomic<int> refCount { 1 };\r
@@ -1360,17 +1463,12 @@ private:
     HandleFormat pluginHandle = {};\r
     bool recursiveResize = false;\r
 \r
-    float nativeScaleFactor = 1.0f;\r
-    bool hasDoneInitialResize = false;\r
-    bool pluginRespondsToDPIChanges = false;\r
-\r
     //==============================================================================\r
-    static void resizeWithRect (Component& comp, const ViewRect& rect, float scaleFactor)\r
+    static void resizeWithRect (Component& comp, const ViewRect& rect)\r
     {\r
-        comp.setBounds (roundToInt (rect.left / scaleFactor),\r
-                        roundToInt (rect.top  / scaleFactor),\r
-                        jmax (10, std::abs (roundToInt (rect.getWidth()  / scaleFactor))),\r
-                        jmax (10, std::abs (roundToInt (rect.getHeight() / scaleFactor))));\r
+        comp.setBounds ((int) rect.left, (int) rect.top,\r
+                        jmax (10, std::abs ((int) rect.getWidth())),\r
+                        jmax (10, std::abs ((int) rect.getHeight())));\r
     }\r
 \r
     void attachPluginWindow()\r
@@ -1536,7 +1634,7 @@ struct VST3ComponentHolder
         // On Windows it's highly advisable to create your plugins using the message thread,\r
         // because many plugins need a chance to create HWNDs that will get their messages\r
         // delivered by the main message thread, and that's not possible from a background thread.\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
        #endif\r
 \r
         factory = ComSmartPtr<IPluginFactory> (module->getPluginFactory());\r
@@ -1596,9 +1694,8 @@ struct VST3ComponentHolder
 };\r
 \r
 //==============================================================================\r
-class VST3PluginInstance : public AudioPluginInstance\r
+struct VST3PluginInstance : public AudioPluginInstance\r
 {\r
-public:\r
     struct VST3Parameter final  : public Parameter\r
     {\r
         VST3Parameter (VST3PluginInstance& parent,\r
@@ -1701,10 +1798,10 @@ public:
     };\r
 \r
     VST3PluginInstance (VST3ComponentHolder* componentHolder)\r
-        : AudioPluginInstance (getBusProperties (componentHolder->component)),\r
-          holder (componentHolder),\r
-          inputParameterChanges (new ParamValueQueueList()),\r
-          outputParameterChanges (new ParamValueQueueList()),\r
+      : AudioPluginInstance (getBusProperties (componentHolder->component)),\r
+        holder (componentHolder),\r
+        inputParameterChanges (new ParamValueQueueList()),\r
+        outputParameterChanges (new ParamValueQueueList()),\r
         midiInputs (new MidiEventList()),\r
         midiOutputs (new MidiEventList())\r
     {\r
@@ -1738,7 +1835,6 @@ public:
         componentHandler2 = nullptr;\r
         componentHandler = nullptr;\r
         processor = nullptr;\r
-        midiMapping = nullptr;\r
         editController2 = nullptr;\r
         editController = nullptr;\r
     }\r
@@ -1749,7 +1845,7 @@ public:
         // On Windows it's highly advisable to create your plugins using the message thread,\r
         // because many plugins need a chance to create HWNDs that will get their messages\r
         // delivered by the main message thread, and that's not possible from a background thread.\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
        #endif\r
 \r
         if (! holder->initialise())\r
@@ -1768,7 +1864,19 @@ public:
         editController->setComponentHandler (holder->host);\r
         grabInformationObjects();\r
         interconnectComponentAndController();\r
-        addParameters();\r
+\r
+        for (int i = 0; i < editController->getParameterCount(); ++i)\r
+        {\r
+            auto paramInfo = getParameterInfoForIndex (i);\r
+            VST3Parameter* p = new VST3Parameter (*this,\r
+                                                  paramInfo.id,\r
+                                                  (paramInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0);\r
+            addParameter (p);\r
+\r
+            if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)\r
+                bypassParam = p;\r
+        }\r
+\r
         synchroniseStates();\r
         syncProgramNames();\r
         setupIO();\r
@@ -2188,14 +2296,7 @@ public:
             auto sampleRate = getSampleRate();\r
 \r
             if (sampleRate > 0.0)\r
-            {\r
-                auto tailSamples = processor->getTailSamples();\r
-\r
-                if (tailSamples == Vst::kInfiniteTail)\r
-                    return std::numeric_limits<double>::infinity();\r
-\r
                 return jlimit (0, 0x7fffffff, (int) processor->getTailSamples()) / sampleRate;\r
-            }\r
         }\r
 \r
         return 0.0;\r
@@ -2450,7 +2551,6 @@ private:
     // Rudimentary interfaces:\r
     ComSmartPtr<Vst::IEditController> editController;\r
     ComSmartPtr<Vst::IEditController2> editController2;\r
-    ComSmartPtr<Vst::IMidiMapping> midiMapping;\r
     ComSmartPtr<Vst::IAudioProcessor> processor;\r
     ComSmartPtr<Vst::IComponentHandler> componentHandler;\r
     ComSmartPtr<Vst::IComponentHandler2> componentHandler2;\r
@@ -2526,71 +2626,6 @@ private:
         }\r
     }\r
 \r
-    void addParameters()\r
-    {\r
-        AudioProcessorParameterGroup parameterGroups ({}, {}, {});\r
-\r
-        // We're going to add parameter groups to the tree recursively in the same order as the\r
-        // first parameters contained within them.\r
-        std::map<Vst::UnitID, Vst::UnitInfo> infoMap;\r
-        std::map<Vst::UnitID, AudioProcessorParameterGroup*> groupMap;\r
-        groupMap[Vst::kRootUnitId] = &parameterGroups;\r
-\r
-        if (unitInfo != nullptr)\r
-        {\r
-            const auto numUnits = unitInfo->getUnitCount();\r
-\r
-            for (int i = 1; i < numUnits; ++i)\r
-            {\r
-                Vst::UnitInfo ui = { 0 };\r
-                unitInfo->getUnitInfo (i, ui);\r
-                infoMap[ui.id] = std::move (ui);\r
-            }\r
-        }\r
-\r
-        for (int i = 0; i < editController->getParameterCount(); ++i)\r
-        {\r
-            auto paramInfo = getParameterInfoForIndex (i);\r
-            auto* param = new VST3Parameter (*this,\r
-                                             paramInfo.id,\r
-                                             (paramInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0);\r
-            addParameterInternal (param);\r
-\r
-            if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)\r
-                bypassParam = param;\r
-\r
-            std::function<AudioProcessorParameterGroup*(Vst::UnitID)> findOrCreateGroup;\r
-\r
-            findOrCreateGroup = [&groupMap, &infoMap, &findOrCreateGroup](Vst::UnitID groupID)\r
-            {\r
-                auto existingGroup = groupMap.find (groupID);\r
-\r
-                if (existingGroup != groupMap.end())\r
-                    return existingGroup->second;\r
-\r
-                auto groupInfo = infoMap.find (groupID);\r
-\r
-                if (groupInfo == infoMap.end())\r
-                    return groupMap[Vst::kRootUnitId];\r
-\r
-                auto* group = new AudioProcessorParameterGroup (String (groupInfo->first),\r
-                                                                toString (groupInfo->second.name),\r
-                                                                {});\r
-                groupMap[groupInfo->first] = group;\r
-\r
-                auto* parentGroup = findOrCreateGroup (groupInfo->second.parentUnitId);\r
-                parentGroup->addChild (std::unique_ptr<AudioProcessorParameterGroup> (group));\r
-\r
-                return group;\r
-            };\r
-\r
-            auto* group = findOrCreateGroup (paramInfo.unitId);\r
-            group->addChild (std::unique_ptr<AudioProcessorParameter> (param));\r
-        }\r
-\r
-        parameterTree.swapWith (parameterGroups);\r
-    }\r
-\r
     void synchroniseStates()\r
     {\r
         Steinberg::MemoryStream stream;\r
@@ -2607,7 +2642,6 @@ private:
         programListData.loadFrom (holder->component);\r
         unitData.loadFrom (holder->component);\r
         editController2.loadFrom (holder->component);\r
-        midiMapping.loadFrom (holder->component);\r
         componentHandler.loadFrom (holder->component);\r
         componentHandler2.loadFrom (holder->component);\r
         trackInfoListener.loadFrom (holder->component);\r
@@ -2617,7 +2651,6 @@ private:
         if (programListData == nullptr)     programListData.loadFrom (editController);\r
         if (unitData == nullptr)            unitData.loadFrom (editController);\r
         if (editController2 == nullptr)     editController2.loadFrom (editController);\r
-        if (midiMapping == nullptr)         midiMapping.loadFrom (editController);\r
         if (componentHandler == nullptr)    componentHandler.loadFrom (editController);\r
         if (componentHandler2 == nullptr)   componentHandler2.loadFrom (editController);\r
         if (trackInfoListener == nullptr)   trackInfoListener.loadFrom (editController);\r
@@ -2664,8 +2697,10 @@ private:
                 if (component->getBusInfo (Vst::kAudio, dir, (Steinberg::int32) i, info) != kResultOk)\r
                     continue;\r
 \r
-                AudioChannelSet layout = (info.channelCount == 0 ? AudioChannelSet::disabled()\r
-                                                                 : AudioChannelSet::discreteChannels (info.channelCount));\r
+                if (info.channelCount == 0)\r
+                    continue;\r
+\r
+                AudioChannelSet layout = AudioChannelSet::discreteChannels (info.channelCount);\r
 \r
                 Vst::SpeakerArrangement arr;\r
                 if (processor != nullptr && processor->getBusArrangement (dir, i, arr) == kResultOk)\r
@@ -2742,9 +2777,7 @@ private:
         midiInputs->clear();\r
         midiOutputs->clear();\r
 \r
-        MidiEventList::toEventList (*midiInputs, midiBuffer,\r
-                                    destination.inputParameterChanges,\r
-                                    midiMapping);\r
+        MidiEventList::toEventList (*midiInputs, midiBuffer);\r
 \r
         destination.inputEvents = midiInputs;\r
         destination.outputEvents = midiOutputs;\r
@@ -2857,8 +2890,10 @@ private:
  #pragma warning (pop)\r
 #endif\r
 \r
+};\r
+\r
 //==============================================================================\r
-AudioPluginInstance* VST3ComponentHolder::createPluginInstance()\r
+AudioPluginInstance* VST3Classes::VST3ComponentHolder::createPluginInstance()\r
 {\r
     if (! initialise())\r
         return nullptr;\r
@@ -2868,190 +2903,6 @@ AudioPluginInstance* VST3ComponentHolder::createPluginInstance()
     return plugin;\r
 }\r
 \r
-//==============================================================================\r
-tresult VST3HostContext::beginEdit (Vst::ParamID paramID)\r
-{\r
-    if (plugin != nullptr)\r
-    {\r
-        auto index = getIndexOfParamID (paramID);\r
-\r
-        if (index < 0)\r
-            return kResultFalse;\r
-\r
-        if (auto* param = plugin->getParameters()[index])\r
-            param->beginChangeGesture();\r
-        else\r
-            jassertfalse; // Invalid parameter index!\r
-    }\r
-\r
-    return kResultTrue;\r
-}\r
-\r
-tresult VST3HostContext::performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized)\r
-{\r
-    if (plugin != nullptr)\r
-    {\r
-        auto index = getIndexOfParamID (paramID);\r
-\r
-        if (index < 0)\r
-            return kResultFalse;\r
-\r
-        if (auto* param = plugin->getParameters()[index])\r
-            param->sendValueChangedMessageToListeners ((float) valueNormalized);\r
-        else\r
-            jassertfalse; // Invalid parameter index!\r
-\r
-        {\r
-            Steinberg::int32 eventIndex;\r
-            plugin->inputParameterChanges->addParameterData (paramID, eventIndex)->addPoint (0, valueNormalized, eventIndex);\r
-        }\r
-\r
-        // did the plug-in already update the parameter internally\r
-        if (plugin->editController->getParamNormalized (paramID) != (float) valueNormalized)\r
-            return plugin->editController->setParamNormalized (paramID, valueNormalized);\r
-    }\r
-\r
-    return kResultTrue;\r
-}\r
-\r
-tresult VST3HostContext::endEdit (Vst::ParamID paramID)\r
-{\r
-    if (plugin != nullptr)\r
-    {\r
-        auto index = getIndexOfParamID (paramID);\r
-\r
-        if (index < 0)\r
-            return kResultFalse;\r
-\r
-        if (auto* param = plugin->getParameters()[index])\r
-            param->endChangeGesture();\r
-        else\r
-            jassertfalse; // Invalid parameter index!\r
-    }\r
-\r
-    return kResultTrue;\r
-}\r
-\r
-tresult VST3HostContext::restartComponent (Steinberg::int32 flags)\r
-{\r
-    if (plugin != nullptr)\r
-    {\r
-        if (hasFlag (flags, Vst::kReloadComponent))\r
-            plugin->reset();\r
-\r
-        if (hasFlag (flags, Vst::kIoChanged))\r
-        {\r
-            auto sampleRate = plugin->getSampleRate();\r
-            auto blockSize  = plugin->getBlockSize();\r
-\r
-            plugin->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0,\r
-                                   blockSize > 0 ? blockSize : 1024);\r
-        }\r
-\r
-        if (hasFlag (flags, Vst::kLatencyChanged))\r
-            if (plugin->processor != nullptr)\r
-                plugin->setLatencySamples (jmax (0, (int) plugin->processor->getLatencySamples()));\r
-\r
-        plugin->updateHostDisplay();\r
-        return kResultTrue;\r
-    }\r
-\r
-    jassertfalse;\r
-    return kResultFalse;\r
-}\r
-\r
-//==============================================================================\r
-tresult VST3HostContext::ContextMenu::popup (Steinberg::UCoord x, Steinberg::UCoord y)\r
-{\r
-    Array<const Item*> subItemStack;\r
-    OwnedArray<PopupMenu> menuStack;\r
-    PopupMenu* topLevelMenu = menuStack.add (new PopupMenu());\r
-\r
-    for (int i = 0; i < items.size(); ++i)\r
-    {\r
-        auto& item = items.getReference (i).item;\r
-        auto* menuToUse = menuStack.getLast();\r
-\r
-        if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled))\r
-        {\r
-            subItemStack.add (&item);\r
-            menuStack.add (new PopupMenu());\r
-        }\r
-        else if (hasFlag (item.flags, Item::kIsGroupEnd))\r
-        {\r
-            if (auto* subItem = subItemStack.getLast())\r
-            {\r
-                if (auto* m = menuStack [menuStack.size() - 2])\r
-                    m->addSubMenu (toString (subItem->name), *menuToUse,\r
-                                   ! hasFlag (subItem->flags, Item::kIsDisabled),\r
-                                   nullptr,\r
-                                   hasFlag (subItem->flags, Item::kIsChecked));\r
-\r
-                menuStack.removeLast (1);\r
-                subItemStack.removeLast (1);\r
-            }\r
-        }\r
-        else if (hasFlag (item.flags, Item::kIsSeparator))\r
-        {\r
-            menuToUse->addSeparator();\r
-        }\r
-        else\r
-        {\r
-            menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement,\r
-                                toString (item.name),\r
-                                ! hasFlag (item.flags, Item::kIsDisabled),\r
-                                hasFlag (item.flags, Item::kIsChecked));\r
-        }\r
-    }\r
-\r
-    PopupMenu::Options options;\r
-\r
-    if (auto* ed = owner.getActiveEditor())\r
-        options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1));\r
-\r
-   #if JUCE_MODAL_LOOPS_PERMITTED\r
-    // Unfortunately, Steinberg's docs explicitly say this should be modal..\r
-    handleResult (topLevelMenu->showMenu (options));\r
-   #else\r
-    topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, ComSmartPtr<ContextMenu> (this)));\r
-   #endif\r
-\r
-    return kResultOk;\r
-}\r
-\r
-//==============================================================================\r
-tresult VST3HostContext::notifyProgramListChange (Vst::ProgramListID, Steinberg::int32)\r
-{\r
-    if (plugin != nullptr)\r
-        plugin->syncProgramNames();\r
-\r
-    return kResultTrue;\r
-}\r
-\r
-//==============================================================================\r
-int VST3HostContext::getIndexOfParamID (Vst::ParamID paramID)\r
-{\r
-    if (plugin == nullptr || plugin->editController == nullptr)\r
-        return -1;\r
-\r
-    auto result = getMappedParamID (paramID);\r
-\r
-    if (result < 0)\r
-    {\r
-        auto numParams = plugin->editController->getParameterCount();\r
-\r
-        for (int i = 0; i < numParams; ++i)\r
-        {\r
-            Vst::ParameterInfo paramInfo;\r
-            plugin->editController->getParameterInfo (i, paramInfo);\r
-            paramToIndexMap[paramInfo.id] = i;\r
-        }\r
-\r
-        result = getMappedParamID (paramID);\r
-    }\r
-\r
-    return result;\r
-}\r
 \r
 //==============================================================================\r
 VST3PluginFormat::VST3PluginFormat() {}\r
@@ -3059,7 +2910,7 @@ VST3PluginFormat::~VST3PluginFormat() {}
 \r
 bool VST3PluginFormat::setStateFromVSTPresetFile (AudioPluginInstance* api, const MemoryBlock& rawData)\r
 {\r
-    if (auto vst3 = dynamic_cast<VST3PluginInstance*> (api))\r
+    if (auto vst3 = dynamic_cast<VST3Classes::VST3PluginInstance*> (api))\r
         return vst3->setStateFromPresetFile (rawData);\r
 \r
     return false;\r
@@ -3068,13 +2919,13 @@ bool VST3PluginFormat::setStateFromVSTPresetFile (AudioPluginInstance* api, cons
 void VST3PluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& results, const String& fileOrIdentifier)\r
 {\r
     if (fileMightContainThisPluginType (fileOrIdentifier))\r
-        VST3ModuleHandle::getAllDescriptionsForFile (results, fileOrIdentifier);\r
+        VST3Classes::VST3ModuleHandle::getAllDescriptionsForFile (results, fileOrIdentifier);\r
 }\r
 \r
-void VST3PluginFormat::createPluginInstance (const PluginDescription& description, double, int,\r
-                                             void* userData, PluginCreationCallback callback)\r
+void VST3PluginFormat::createPluginInstance (const PluginDescription& description, double, int, void* userData,\r
+                                             void (*callback) (void*, AudioPluginInstance*, const String&))\r
 {\r
-    std::unique_ptr<VST3PluginInstance> result;\r
+    std::unique_ptr<VST3Classes::VST3PluginInstance> result;\r
 \r
     if (fileMightContainThisPluginType (description.fileOrIdentifier))\r
     {\r
@@ -3083,13 +2934,13 @@ void VST3PluginFormat::createPluginInstance (const PluginDescription& descriptio
         auto previousWorkingDirectory = File::getCurrentWorkingDirectory();\r
         file.getParentDirectory().setAsCurrentWorkingDirectory();\r
 \r
-        if (const VST3ModuleHandle::Ptr module = VST3ModuleHandle::findOrCreateModule (file, description))\r
+        if (const VST3Classes::VST3ModuleHandle::Ptr module = VST3Classes::VST3ModuleHandle::findOrCreateModule (file, description))\r
         {\r
-            std::unique_ptr<VST3ComponentHolder> holder (new VST3ComponentHolder (module));\r
+            std::unique_ptr<VST3Classes::VST3ComponentHolder> holder (new VST3Classes::VST3ComponentHolder (module));\r
 \r
             if (holder->initialise())\r
             {\r
-                result.reset (new VST3PluginInstance (holder.release()));\r
+                result.reset (new VST3Classes::VST3PluginInstance (holder.release()));\r
 \r
                 if (! result->initialise())\r
                     result.reset();\r
index f80363ff1c584fa83b28a857d50353201f4580ba..c4f77b638921d1b677b6e3f5660cae4e3ecfab4c 100644 (file)
@@ -63,7 +63,8 @@ public:
 \r
 private:\r
     void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
-                               int initialBufferSize, void* userData, PluginCreationCallback) override;\r
+                               int initialBufferSize, void* userData,\r
+                               void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
 \r
     bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
 \r
index f66876e8bb67285c99dc1e322053a3276e0631e6..4b40443bda797a1dfb1db1e3e45bb118ec4ac7d4 100644 (file)
 namespace juce\r
 {\r
 \r
-//==============================================================================\r
-#if JUCE_BIG_ENDIAN\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24))\r
-#else\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24))\r
-#endif\r
-\r
 //==============================================================================\r
 /** Structure for VST speaker mappings\r
 \r
@@ -66,25 +59,25 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
 \r
     static AudioChannelSet vstArrangementTypeToChannelSet (int32 arr, int fallbackNumChannels)\r
     {\r
-        if      (arr == Vst2::kSpeakerArrEmpty)        return AudioChannelSet::disabled();\r
-        else if (arr == Vst2::kSpeakerArrMono)         return AudioChannelSet::mono();\r
-        else if (arr == Vst2::kSpeakerArrStereo)       return AudioChannelSet::stereo();\r
-        else if (arr == Vst2::kSpeakerArr30Cine)       return AudioChannelSet::createLCR();\r
-        else if (arr == Vst2::kSpeakerArr30Music)      return AudioChannelSet::createLRS();\r
-        else if (arr == Vst2::kSpeakerArr40Cine)       return AudioChannelSet::createLCRS();\r
-        else if (arr == Vst2::kSpeakerArr50)           return AudioChannelSet::create5point0();\r
-        else if (arr == Vst2::kSpeakerArr51)           return AudioChannelSet::create5point1();\r
-        else if (arr == Vst2::kSpeakerArr60Cine)       return AudioChannelSet::create6point0();\r
-        else if (arr == Vst2::kSpeakerArr61Cine)       return AudioChannelSet::create6point1();\r
-        else if (arr == Vst2::kSpeakerArr60Music)      return AudioChannelSet::create6point0Music();\r
-        else if (arr == Vst2::kSpeakerArr61Music)      return AudioChannelSet::create6point1Music();\r
-        else if (arr == Vst2::kSpeakerArr70Music)      return AudioChannelSet::create7point0();\r
-        else if (arr == Vst2::kSpeakerArr70Cine)       return AudioChannelSet::create7point0SDDS();\r
-        else if (arr == Vst2::kSpeakerArr71Music)      return AudioChannelSet::create7point1();\r
-        else if (arr == Vst2::kSpeakerArr71Cine)       return AudioChannelSet::create7point1SDDS();\r
-        else if (arr == Vst2::kSpeakerArr40Music)      return AudioChannelSet::quadraphonic();\r
-\r
-        for (const Mapping* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+        if      (arr == vstSpeakerConfigTypeEmpty)          return AudioChannelSet::disabled();\r
+        else if (arr == vstSpeakerConfigTypeMono)           return AudioChannelSet::mono();\r
+        else if (arr == vstSpeakerConfigTypeLR)             return AudioChannelSet::stereo();\r
+        else if (arr == vstSpeakerConfigTypeLRC)            return AudioChannelSet::createLCR();\r
+        else if (arr == vstSpeakerConfigTypeLRS)            return AudioChannelSet::createLRS();\r
+        else if (arr == vstSpeakerConfigTypeLRCS)           return AudioChannelSet::createLCRS();\r
+        else if (arr == vstSpeakerConfigTypeLRCLsRs)        return AudioChannelSet::create5point0();\r
+        else if (arr == vstSpeakerConfigTypeLRCLfeLsRs)     return AudioChannelSet::create5point1();\r
+        else if (arr == vstSpeakerConfigTypeLRCLsRsCs)      return AudioChannelSet::create6point0();\r
+        else if (arr == vstSpeakerConfigTypeLRCLfeLsRsCs)   return AudioChannelSet::create6point1();\r
+        else if (arr == vstSpeakerConfigTypeLRLsRsSlSr)     return AudioChannelSet::create6point0Music();\r
+        else if (arr == vstSpeakerConfigTypeLRLfeLsRsSlSr)  return AudioChannelSet::create6point1Music();\r
+        else if (arr == vstSpeakerConfigTypeLRCLsRsSlSr)    return AudioChannelSet::create7point0();\r
+        else if (arr == vstSpeakerConfigTypeLRCLsRsLcRc)    return AudioChannelSet::create7point0SDDS();\r
+        else if (arr == vstSpeakerConfigTypeLRCLfeLsRsSlSr) return AudioChannelSet::create7point1();\r
+        else if (arr == vstSpeakerConfigTypeLRCLfeLsRsLcRc) return AudioChannelSet::create7point1SDDS();\r
+        else if (arr == vstSpeakerConfigTypeLRLsRs)         return AudioChannelSet::quadraphonic();\r
+\r
+        for (const Mapping* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
         {\r
             if (m->vst2 == arr)\r
             {\r
@@ -100,41 +93,41 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
         return AudioChannelSet::discreteChannels (fallbackNumChannels);\r
     }\r
 \r
-    static AudioChannelSet vstArrangementTypeToChannelSet (const Vst2::VstSpeakerArrangement& arr)\r
+    static AudioChannelSet vstArrangementTypeToChannelSet (const VstSpeakerConfiguration& arr)\r
     {\r
-        return vstArrangementTypeToChannelSet (arr.type, arr.numChannels);\r
+        return vstArrangementTypeToChannelSet (arr.type, arr.numberOfChannels);\r
     }\r
 \r
     static int32 channelSetToVstArrangementType (AudioChannelSet channels)\r
     {\r
-        if      (channels == AudioChannelSet::disabled())           return Vst2::kSpeakerArrEmpty;\r
-        else if (channels == AudioChannelSet::mono())               return Vst2::kSpeakerArrMono;\r
-        else if (channels == AudioChannelSet::stereo())             return Vst2::kSpeakerArrStereo;\r
-        else if (channels == AudioChannelSet::createLCR())          return Vst2::kSpeakerArr30Cine;\r
-        else if (channels == AudioChannelSet::createLRS())          return Vst2::kSpeakerArr30Music;\r
-        else if (channels == AudioChannelSet::createLCRS())         return Vst2::kSpeakerArr40Cine;\r
-        else if (channels == AudioChannelSet::create5point0())      return Vst2::kSpeakerArr50;\r
-        else if (channels == AudioChannelSet::create5point1())      return Vst2::kSpeakerArr51;\r
-        else if (channels == AudioChannelSet::create6point0())      return Vst2::kSpeakerArr60Cine;\r
-        else if (channels == AudioChannelSet::create6point1())      return Vst2::kSpeakerArr61Cine;\r
-        else if (channels == AudioChannelSet::create6point0Music()) return Vst2::kSpeakerArr60Music;\r
-        else if (channels == AudioChannelSet::create6point1Music()) return Vst2::kSpeakerArr61Music;\r
-        else if (channels == AudioChannelSet::create7point0())      return Vst2::kSpeakerArr70Music;\r
-        else if (channels == AudioChannelSet::create7point0SDDS())  return Vst2::kSpeakerArr70Cine;\r
-        else if (channels == AudioChannelSet::create7point1())      return Vst2::kSpeakerArr71Music;\r
-        else if (channels == AudioChannelSet::create7point1SDDS())  return Vst2::kSpeakerArr71Cine;\r
-        else if (channels == AudioChannelSet::quadraphonic())       return Vst2::kSpeakerArr40Music;\r
+        if      (channels == AudioChannelSet::disabled())           return vstSpeakerConfigTypeEmpty;\r
+        else if (channels == AudioChannelSet::mono())               return vstSpeakerConfigTypeMono;\r
+        else if (channels == AudioChannelSet::stereo())             return vstSpeakerConfigTypeLR;\r
+        else if (channels == AudioChannelSet::createLCR())          return vstSpeakerConfigTypeLRC;\r
+        else if (channels == AudioChannelSet::createLRS())          return vstSpeakerConfigTypeLRS;\r
+        else if (channels == AudioChannelSet::createLCRS())         return vstSpeakerConfigTypeLRCS;\r
+        else if (channels == AudioChannelSet::create5point0())      return vstSpeakerConfigTypeLRCLsRs;\r
+        else if (channels == AudioChannelSet::create5point1())      return vstSpeakerConfigTypeLRCLfeLsRs;\r
+        else if (channels == AudioChannelSet::create6point0())      return vstSpeakerConfigTypeLRCLsRsCs;\r
+        else if (channels == AudioChannelSet::create6point1())      return vstSpeakerConfigTypeLRCLfeLsRsCs;\r
+        else if (channels == AudioChannelSet::create6point0Music()) return vstSpeakerConfigTypeLRLsRsSlSr;\r
+        else if (channels == AudioChannelSet::create6point1Music()) return vstSpeakerConfigTypeLRLfeLsRsSlSr;\r
+        else if (channels == AudioChannelSet::create7point0())      return vstSpeakerConfigTypeLRCLsRsSlSr;\r
+        else if (channels == AudioChannelSet::create7point0SDDS())  return vstSpeakerConfigTypeLRCLsRsLcRc;\r
+        else if (channels == AudioChannelSet::create7point1())      return vstSpeakerConfigTypeLRCLfeLsRsSlSr;\r
+        else if (channels == AudioChannelSet::create7point1SDDS())  return vstSpeakerConfigTypeLRCLfeLsRsLcRc;\r
+        else if (channels == AudioChannelSet::quadraphonic())       return vstSpeakerConfigTypeLRLsRs;\r
 \r
         Array<AudioChannelSet::ChannelType> chans (channels.getChannelTypes());\r
 \r
         if (channels == AudioChannelSet::disabled())\r
-            return Vst2::kSpeakerArrEmpty;\r
+            return vstSpeakerConfigTypeEmpty;\r
 \r
-        for (const Mapping* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+        for (const Mapping* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
             if (m->matches (chans))\r
                 return m->vst2;\r
 \r
-        return Vst2::kSpeakerArrUserDefined;\r
+        return vstSpeakerConfigTypeUser;\r
     }\r
 \r
     /** Class to hold a speaker configuration */\r
@@ -142,37 +135,36 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
     {\r
     public:\r
         VstSpeakerConfigurationHolder()                                            { clear(); }\r
-        VstSpeakerConfigurationHolder (const Vst2::VstSpeakerArrangement& vstConfig)   { operator= (vstConfig); }\r
+        VstSpeakerConfigurationHolder (const VstSpeakerConfiguration& vstConfig)   { operator= (vstConfig); }\r
         VstSpeakerConfigurationHolder (const VstSpeakerConfigurationHolder& other) { operator= (other.get()); }\r
-        VstSpeakerConfigurationHolder (VstSpeakerConfigurationHolder&& other)\r
-            : storage (static_cast<HeapBlock<Vst2::VstSpeakerArrangement>&&> (other.storage)) { other.clear(); }\r
+        VstSpeakerConfigurationHolder (VstSpeakerConfigurationHolder&& other) : storage (static_cast<HeapBlock<VstSpeakerConfiguration>&&> (other.storage)) { other.clear(); }\r
 \r
         VstSpeakerConfigurationHolder (const AudioChannelSet& channels)\r
         {\r
             auto numberOfChannels = channels.size();\r
-            Vst2::VstSpeakerArrangement& dst = *allocate (numberOfChannels);\r
+            VstSpeakerConfiguration& dst = *allocate (numberOfChannels);\r
 \r
             dst.type = channelSetToVstArrangementType (channels);\r
-            dst.numChannels = numberOfChannels;\r
+            dst.numberOfChannels = numberOfChannels;\r
 \r
-            for (int i = 0; i < dst.numChannels; ++i)\r
+            for (int i = 0; i < dst.numberOfChannels; ++i)\r
             {\r
-                Vst2::VstSpeakerProperties& speaker = dst.speakers[i];\r
+                VstIndividualSpeakerInfo& speaker = dst.speakers[i];\r
 \r
-                zeromem (&speaker, sizeof (Vst2::VstSpeakerProperties));\r
+                zeromem (&speaker, sizeof (VstIndividualSpeakerInfo));\r
                 speaker.type = getSpeakerType (channels.getTypeOfChannel (i));\r
             }\r
         }\r
 \r
         VstSpeakerConfigurationHolder& operator= (const VstSpeakerConfigurationHolder& vstConfig) { return operator=(vstConfig.get()); }\r
-        VstSpeakerConfigurationHolder& operator= (const Vst2::VstSpeakerArrangement& vstConfig)\r
+        VstSpeakerConfigurationHolder& operator= (const VstSpeakerConfiguration& vstConfig)\r
         {\r
-            Vst2::VstSpeakerArrangement& dst = *allocate (vstConfig.numChannels);\r
+            VstSpeakerConfiguration& dst = *allocate (vstConfig.numberOfChannels);\r
 \r
             dst.type             = vstConfig.type;\r
-            dst.numChannels      = vstConfig.numChannels;\r
+            dst.numberOfChannels = vstConfig.numberOfChannels;\r
 \r
-            for (int i = 0; i < dst.numChannels; ++i)\r
+            for (int i = 0; i < dst.numberOfChannels; ++i)\r
                 dst.speakers[i] = vstConfig.speakers[i];\r
 \r
             return *this;\r
@@ -180,23 +172,23 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
 \r
         VstSpeakerConfigurationHolder& operator= (VstSpeakerConfigurationHolder && vstConfig)\r
         {\r
-            storage = static_cast<HeapBlock<Vst2::VstSpeakerArrangement>&&> (vstConfig.storage);\r
+            storage = static_cast<HeapBlock<VstSpeakerConfiguration>&&> (vstConfig.storage);\r
             vstConfig.clear();\r
 \r
             return *this;\r
         }\r
 \r
-        const Vst2::VstSpeakerArrangement& get() const { return *storage.get(); }\r
+        const VstSpeakerConfiguration& get() const { return *storage.get(); }\r
 \r
     private:\r
         JUCE_LEAK_DETECTOR (VstSpeakerConfigurationHolder)\r
 \r
-        HeapBlock<Vst2::VstSpeakerArrangement> storage;\r
+        HeapBlock<VstSpeakerConfiguration> storage;\r
 \r
-        Vst2::VstSpeakerArrangement* allocate (int numChannels)\r
+        VstSpeakerConfiguration* allocate (int numChannels)\r
         {\r
-            auto arrangementSize = sizeof (Vst2::VstSpeakerArrangement)\r
-                                     + sizeof (Vst2::VstSpeakerProperties) * static_cast<size_t> (jmax (8, numChannels) - 8);\r
+            auto arrangementSize = sizeof (VstSpeakerConfiguration)\r
+                                     + sizeof (VstIndividualSpeakerInfo) * static_cast<size_t> (jmax (8, numChannels) - 8);\r
 \r
             storage.malloc (1, arrangementSize);\r
             return storage.get();\r
@@ -204,10 +196,10 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
 \r
         void clear()\r
         {\r
-            Vst2::VstSpeakerArrangement& dst = *allocate (0);\r
+            VstSpeakerConfiguration& dst = *allocate (0);\r
 \r
-            dst.type = Vst2::kSpeakerArrEmpty;\r
-            dst.numChannels = 0;\r
+            dst.type = vstSpeakerConfigTypeEmpty;\r
+            dst.numberOfChannels = 0;\r
         }\r
     };\r
 \r
@@ -215,36 +207,36 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
     {\r
         static const Mapping mappings[] =\r
         {\r
-            { Vst2::kSpeakerArrMono,           { centre, unknown } },\r
-            { Vst2::kSpeakerArrStereo,         { left, right, unknown } },\r
-            { Vst2::kSpeakerArrStereoSurround, { leftSurround, rightSurround, unknown } },\r
-            { Vst2::kSpeakerArrStereoCenter,   { leftCentre, rightCentre, unknown } },\r
-            { Vst2::kSpeakerArrStereoSide,     { leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArrStereoCLfe,     { centre, LFE, unknown } },\r
-            { Vst2::kSpeakerArr30Cine,         { left, right, centre, unknown } },\r
-            { Vst2::kSpeakerArr30Music,        { left, right, surround, unknown } },\r
-            { Vst2::kSpeakerArr31Cine,         { left, right, centre, LFE, unknown } },\r
-            { Vst2::kSpeakerArr31Music,        { left, right, LFE, surround, unknown } },\r
-            { Vst2::kSpeakerArr40Cine,         { left, right, centre, surround, unknown } },\r
-            { Vst2::kSpeakerArr40Music,        { left, right, leftSurround, rightSurround, unknown } },\r
-            { Vst2::kSpeakerArr41Cine,         { left, right, centre, LFE, surround, unknown } },\r
-            { Vst2::kSpeakerArr41Music,        { left, right, LFE, leftSurround, rightSurround, unknown } },\r
-            { Vst2::kSpeakerArr50,             { left, right, centre, leftSurround, rightSurround, unknown } },\r
-            { Vst2::kSpeakerArr51,             { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
-            { Vst2::kSpeakerArr60Cine,         { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
-            { Vst2::kSpeakerArr60Music,        { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArr61Cine,         { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
-            { Vst2::kSpeakerArr61Music,        { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArr70Cine,         { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
-            { Vst2::kSpeakerArr70Music,        { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArr71Cine,         { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
-            { Vst2::kSpeakerArr71Music,        { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArr80Cine,         { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
-            { Vst2::kSpeakerArr80Music,        { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArr81Cine,  { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
-            { Vst2::kSpeakerArr81Music, { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
-            { Vst2::kSpeakerArr102,     { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
-            { Vst2::kSpeakerArrEmpty,          { unknown } }\r
+            { vstSpeakerConfigTypeMono,                          { centre, unknown } },\r
+            { vstSpeakerConfigTypeLR,                            { left, right, unknown } },\r
+            { vstSpeakerConfigTypeLsRs,                          { leftSurround, rightSurround, unknown } },\r
+            { vstSpeakerConfigTypeLcRc,                          { leftCentre, rightCentre, unknown } },\r
+            { vstSpeakerConfigTypeSlSr,                          { leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeCLfe,                          { centre, LFE, unknown } },\r
+            { vstSpeakerConfigTypeLRC,                           { left, right, centre, unknown } },\r
+            { vstSpeakerConfigTypeLRS,                           { left, right, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfe,                        { left, right, centre, LFE, unknown } },\r
+            { vstSpeakerConfigTypeLRLfeS,                        { left, right, LFE, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRCS,                          { left, right, centre, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRLsRs,                        { left, right, leftSurround, rightSurround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeS,                       { left, right, centre, LFE, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRLfeLsRs,                     { left, right, LFE, leftSurround, rightSurround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLsRs,                       { left, right, centre, leftSurround, rightSurround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRs,                    { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLsRsCs,                     { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRLsRsSlSr,                    { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRsCs,                  { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRLfeLsRsSlSr,                 { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeLRCLsRsLcRc,                   { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+            { vstSpeakerConfigTypeLRCLsRsSlSr,                   { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRsLcRc,                { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRsSlSr,                { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeLRCLsRsLcRcCs,                 { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLsRsCsSlSr,                 { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRsLcRcCs,              { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRsCsSlSr,              { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+            { vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
+            { vstSpeakerConfigTypeEmpty,                         { unknown } }\r
         };\r
 \r
         return mappings;\r
@@ -254,25 +246,25 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
     {\r
         switch (type)\r
         {\r
-            case AudioChannelSet::left:              return Vst2::kSpeakerL;\r
-            case AudioChannelSet::right:             return Vst2::kSpeakerR;\r
-            case AudioChannelSet::centre:            return Vst2::kSpeakerC;\r
-            case AudioChannelSet::LFE:               return Vst2::kSpeakerLfe;\r
-            case AudioChannelSet::leftSurround:      return Vst2::kSpeakerLs;\r
-            case AudioChannelSet::rightSurround:     return Vst2::kSpeakerRs;\r
-            case AudioChannelSet::leftCentre:        return Vst2::kSpeakerLc;\r
-            case AudioChannelSet::rightCentre:       return Vst2::kSpeakerRc;\r
-            case AudioChannelSet::surround:          return Vst2::kSpeakerS;\r
-            case AudioChannelSet::leftSurroundRear:  return Vst2::kSpeakerSl;\r
-            case AudioChannelSet::rightSurroundRear: return Vst2::kSpeakerSr;\r
-            case AudioChannelSet::topMiddle:         return Vst2::kSpeakerTm;\r
-            case AudioChannelSet::topFrontLeft:      return Vst2::kSpeakerTfl;\r
-            case AudioChannelSet::topFrontCentre:    return Vst2::kSpeakerTfc;\r
-            case AudioChannelSet::topFrontRight:     return Vst2::kSpeakerTfr;\r
-            case AudioChannelSet::topRearLeft:       return Vst2::kSpeakerTrl;\r
-            case AudioChannelSet::topRearCentre:     return Vst2::kSpeakerTrc;\r
-            case AudioChannelSet::topRearRight:      return Vst2::kSpeakerTrr;\r
-            case AudioChannelSet::LFE2:              return Vst2::kSpeakerLfe2;\r
+            case AudioChannelSet::left:              return vstIndividualSpeakerTypeLeft;\r
+            case AudioChannelSet::right:             return vstIndividualSpeakerTypeRight;\r
+            case AudioChannelSet::centre:            return vstIndividualSpeakerTypeCentre;\r
+            case AudioChannelSet::LFE:               return vstIndividualSpeakerTypeLFE;\r
+            case AudioChannelSet::leftSurround:      return vstIndividualSpeakerTypeLeftSurround;\r
+            case AudioChannelSet::rightSurround:     return vstIndividualSpeakerTypeRightSurround;\r
+            case AudioChannelSet::leftCentre:        return vstIndividualSpeakerTypeLeftCentre;\r
+            case AudioChannelSet::rightCentre:       return vstIndividualSpeakerTypeRightCentre;\r
+            case AudioChannelSet::surround:          return vstIndividualSpeakerTypeSurround;\r
+            case AudioChannelSet::leftSurroundRear:  return vstIndividualSpeakerTypeLeftRearSurround;\r
+            case AudioChannelSet::rightSurroundRear: return vstIndividualSpeakerTypeRightRearSurround;\r
+            case AudioChannelSet::topMiddle:         return vstIndividualSpeakerTypeTopMiddle;\r
+            case AudioChannelSet::topFrontLeft:      return vstIndividualSpeakerTypeTopFrontLeft;\r
+            case AudioChannelSet::topFrontCentre:    return vstIndividualSpeakerTypeTopFrontCentre;\r
+            case AudioChannelSet::topFrontRight:     return vstIndividualSpeakerTypeTopFrontRight;\r
+            case AudioChannelSet::topRearLeft:       return vstIndividualSpeakerTypeTopRearLeft;\r
+            case AudioChannelSet::topRearCentre:     return vstIndividualSpeakerTypeTopRearCentre;\r
+            case AudioChannelSet::topRearRight:      return vstIndividualSpeakerTypeTopRearRight;\r
+            case AudioChannelSet::LFE2:              return vstIndividualSpeakerTypeLFE2;\r
             default: break;\r
         }\r
 \r
@@ -283,25 +275,25 @@ struct SpeakerMappings  : private AudioChannelSet // (inheritance only to give e
     {\r
         switch (type)\r
         {\r
-            case Vst2::kSpeakerL:      return AudioChannelSet::left;\r
-            case Vst2::kSpeakerR:      return AudioChannelSet::right;\r
-            case Vst2::kSpeakerC:      return AudioChannelSet::centre;\r
-            case Vst2::kSpeakerLfe:    return AudioChannelSet::LFE;\r
-            case Vst2::kSpeakerLs:     return AudioChannelSet::leftSurround;\r
-            case Vst2::kSpeakerRs:     return AudioChannelSet::rightSurround;\r
-            case Vst2::kSpeakerLc:     return AudioChannelSet::leftCentre;\r
-            case Vst2::kSpeakerRc:     return AudioChannelSet::rightCentre;\r
-            case Vst2::kSpeakerS:      return AudioChannelSet::surround;\r
-            case Vst2::kSpeakerSl:     return AudioChannelSet::leftSurroundRear;\r
-            case Vst2::kSpeakerSr:     return AudioChannelSet::rightSurroundRear;\r
-            case Vst2::kSpeakerTm:     return AudioChannelSet::topMiddle;\r
-            case Vst2::kSpeakerTfl:    return AudioChannelSet::topFrontLeft;\r
-            case Vst2::kSpeakerTfc:    return AudioChannelSet::topFrontCentre;\r
-            case Vst2::kSpeakerTfr:    return AudioChannelSet::topFrontRight;\r
-            case Vst2::kSpeakerTrl:    return AudioChannelSet::topRearLeft;\r
-            case Vst2::kSpeakerTrc:    return AudioChannelSet::topRearCentre;\r
-            case Vst2::kSpeakerTrr:    return AudioChannelSet::topRearRight;\r
-            case Vst2::kSpeakerLfe2:   return AudioChannelSet::LFE2;\r
+            case vstIndividualSpeakerTypeLeft:                 return AudioChannelSet::left;\r
+            case vstIndividualSpeakerTypeRight:                return AudioChannelSet::right;\r
+            case vstIndividualSpeakerTypeCentre:               return AudioChannelSet::centre;\r
+            case vstIndividualSpeakerTypeLFE:                  return AudioChannelSet::LFE;\r
+            case vstIndividualSpeakerTypeLeftSurround:         return AudioChannelSet::leftSurround;\r
+            case vstIndividualSpeakerTypeRightSurround:        return AudioChannelSet::rightSurround;\r
+            case vstIndividualSpeakerTypeLeftCentre:           return AudioChannelSet::leftCentre;\r
+            case vstIndividualSpeakerTypeRightCentre:          return AudioChannelSet::rightCentre;\r
+            case vstIndividualSpeakerTypeSurround:             return AudioChannelSet::surround;\r
+            case vstIndividualSpeakerTypeLeftRearSurround:     return AudioChannelSet::leftSurroundRear;\r
+            case vstIndividualSpeakerTypeRightRearSurround:    return AudioChannelSet::rightSurroundRear;\r
+            case vstIndividualSpeakerTypeTopMiddle:            return AudioChannelSet::topMiddle;\r
+            case vstIndividualSpeakerTypeTopFrontLeft:         return AudioChannelSet::topFrontLeft;\r
+            case vstIndividualSpeakerTypeTopFrontCentre:       return AudioChannelSet::topFrontCentre;\r
+            case vstIndividualSpeakerTypeTopFrontRight:        return AudioChannelSet::topFrontRight;\r
+            case vstIndividualSpeakerTypeTopRearLeft:          return AudioChannelSet::topRearLeft;\r
+            case vstIndividualSpeakerTypeTopRearCentre:        return AudioChannelSet::topRearCentre;\r
+            case vstIndividualSpeakerTypeTopRearRight:         return AudioChannelSet::topRearRight;\r
+            case vstIndividualSpeakerTypeLFE2:                 return AudioChannelSet::LFE2;\r
             default: break;\r
         }\r
 \r
diff --git a/modules/juce_audio_processors/format_types/juce_VSTInterface.h b/modules/juce_audio_processors/format_types/juce_VSTInterface.h
new file mode 100644 (file)
index 0000000..a2f09aa
--- /dev/null
@@ -0,0 +1,529 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2017 - ROLI Ltd.\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+   27th April 2017).\r
+\r
+   End User License Agreement: www.juce.com/juce-5-licence\r
+   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#define JUCE_VSTINTERFACE_H_INCLUDED\r
+\r
+using namespace juce;\r
+\r
+#if JUCE_MSVC\r
+ #define VSTINTERFACECALL __cdecl\r
+ #pragma pack(push)\r
+ #pragma pack(8)\r
+#elif JUCE_MAC || JUCE_IOS\r
+ #define VSTINTERFACECALL\r
+ #if JUCE_64BIT\r
+  #pragma options align=power\r
+ #else\r
+  #pragma options align=mac68k\r
+ #endif\r
+#else\r
+ #define VSTINTERFACECALL\r
+ #pragma pack(push, 8)\r
+#endif\r
+\r
+const int32 juceVstInterfaceVersion = 2400;\r
+const int32 juceVstInterfaceIdentifier = 0x56737450;    // The "magic" identifier in the SDK is 'VstP'.\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstEffectInterface\r
+{\r
+    int32 interfaceIdentifier;\r
+    pointer_sized_int (VSTINTERFACECALL* dispatchFunction)          (VstEffectInterface*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt);\r
+    void              (VSTINTERFACECALL* processAudioFunction)      (VstEffectInterface*, float** inputs, float** outputs, int32 numSamples);\r
+    void              (VSTINTERFACECALL* setParameterValueFunction) (VstEffectInterface*, int32 parameterIndex, float value);\r
+    float             (VSTINTERFACECALL* getParameterValueFunction) (VstEffectInterface*, int32 parameterIndex);\r
+    int32 numPrograms;\r
+    int32 numParameters;\r
+    int32 numInputChannels;\r
+    int32 numOutputChannels;\r
+    int32 flags;\r
+    pointer_sized_int hostSpace1;\r
+    pointer_sized_int hostSpace2;\r
+    int32 latency;\r
+    int32 deprecated1;\r
+    int32 deprecated2;\r
+    float deprecated3;\r
+    void* effectPointer;\r
+    void* userPointer;\r
+    int32 plugInIdentifier;\r
+    int32 plugInVersion;\r
+    void (VSTINTERFACECALL* processAudioInplaceFunction)       (VstEffectInterface*, float**  inputs, float**  outputs, int32 numSamples);\r
+    void (VSTINTERFACECALL* processDoubleAudioInplaceFunction) (VstEffectInterface*, double** inputs, double** outputs, int32 numSamples);\r
+    char emptySpace[56];\r
+};\r
+\r
+typedef pointer_sized_int (VSTINTERFACECALL* VstHostCallback) (VstEffectInterface*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt);\r
+\r
+enum VstEffectInterfaceFlags\r
+{\r
+    vstEffectFlagHasEditor          = 1,\r
+    vstEffectFlagInplaceAudio       = 16,\r
+    vstEffectFlagDataInChunks       = 32,\r
+    vstEffectFlagIsSynth            = 256,\r
+    vstEffectFlagInplaceDoubleAudio = 4096\r
+};\r
+\r
+//==============================================================================\r
+enum VstHostToPlugInOpcodes\r
+{\r
+    plugInOpcodeOpen,\r
+    plugInOpcodeClose,\r
+    plugInOpcodeSetCurrentProgram,\r
+    plugInOpcodeGetCurrentProgram,\r
+    plugInOpcodeSetCurrentProgramName,\r
+    plugInOpcodeGetCurrentProgramName,\r
+    plugInOpcodeGetParameterLabel,\r
+    plugInOpcodeGetParameterText,\r
+    plugInOpcodeGetParameterName,\r
+    plugInOpcodeSetSampleRate = plugInOpcodeGetParameterName + 2,\r
+    plugInOpcodeSetBlockSize,\r
+    plugInOpcodeResumeSuspend,\r
+    plugInOpcodeGetEditorBounds,\r
+    plugInOpcodeOpenEditor,\r
+    plugInOpcodeCloseEditor,\r
+    plugInOpcodeDrawEditor,\r
+    plugInOpcodeGetMouse,\r
+    plugInOpcodeEditorIdle = plugInOpcodeGetMouse + 2,\r
+    plugInOpcodeeffEditorTop,\r
+    plugInOpcodeSleepEditor,\r
+    plugInOpcodeIdentify,\r
+    plugInOpcodeGetData,\r
+    plugInOpcodeSetData,\r
+    plugInOpcodePreAudioProcessingEvents,\r
+    plugInOpcodeIsParameterAutomatable,\r
+    plugInOpcodeParameterValueForText,\r
+    plugInOpcodeGetProgramName = plugInOpcodeParameterValueForText + 2,\r
+    plugInOpcodeConnectInput = plugInOpcodeGetProgramName + 2,\r
+    plugInOpcodeConnectOutput,\r
+    plugInOpcodeGetInputPinProperties,\r
+    plugInOpcodeGetOutputPinProperties,\r
+    plugInOpcodeGetPlugInCategory,\r
+    plugInOpcodeSetSpeakerConfiguration = plugInOpcodeGetPlugInCategory + 7,\r
+    plugInOpcodeSetBypass = plugInOpcodeSetSpeakerConfiguration + 2,\r
+    plugInOpcodeGetPlugInName,\r
+    plugInOpcodeGetManufacturerName = plugInOpcodeGetPlugInName + 2,\r
+    plugInOpcodeGetManufacturerProductName,\r
+    plugInOpcodeGetManufacturerVersion,\r
+    plugInOpcodeManufacturerSpecific,\r
+    plugInOpcodeCanPlugInDo,\r
+    plugInOpcodeGetTailSize,\r
+    plugInOpcodeIdle,\r
+    plugInOpcodeKeyboardFocusRequired = plugInOpcodeIdle + 4,\r
+    plugInOpcodeGetVstInterfaceVersion,\r
+    plugInOpcodeGetCurrentMidiProgram = plugInOpcodeGetVstInterfaceVersion + 5,\r
+    plugInOpcodeGetSpeakerArrangement = plugInOpcodeGetCurrentMidiProgram + 6,\r
+    plugInOpcodeNextPlugInUniqueID,\r
+    plugInOpcodeStartProcess,\r
+    plugInOpcodeStopProcess,\r
+    plugInOpcodeSetNumberOfSamplesToProcess,\r
+    plugInOpcodeSetSampleFloatType = plugInOpcodeSetNumberOfSamplesToProcess + 4,\r
+    pluginOpcodeGetNumMidiInputChannels,\r
+    pluginOpcodeGetNumMidiOutputChannels,\r
+    plugInOpcodeMaximum = pluginOpcodeGetNumMidiOutputChannels\r
+};\r
+\r
+\r
+enum VstPlugInToHostOpcodes\r
+{\r
+    hostOpcodeParameterChanged,\r
+    hostOpcodeVstVersion,\r
+    hostOpcodeCurrentId,\r
+    hostOpcodeIdle,\r
+    hostOpcodePinConnected,\r
+    hostOpcodePlugInWantsMidi = hostOpcodePinConnected + 2,\r
+    hostOpcodeGetTimingInfo,\r
+    hostOpcodePreAudioProcessingEvents,\r
+    hostOpcodeSetTime,\r
+    hostOpcodeTempoAt,\r
+    hostOpcodeGetNumberOfAutomatableParameters,\r
+    hostOpcodeGetParameterInterval,\r
+    hostOpcodeIOModified,\r
+    hostOpcodeNeedsIdle,\r
+    hostOpcodeWindowSize,\r
+    hostOpcodeGetSampleRate,\r
+    hostOpcodeGetBlockSize,\r
+    hostOpcodeGetInputLatency,\r
+    hostOpcodeGetOutputLatency,\r
+    hostOpcodeGetPreviousPlugIn,\r
+    hostOpcodeGetNextPlugIn,\r
+    hostOpcodeWillReplace,\r
+    hostOpcodeGetCurrentAudioProcessingLevel,\r
+    hostOpcodeGetAutomationState,\r
+    hostOpcodeOfflineStart,\r
+    hostOpcodeOfflineReadSource,\r
+    hostOpcodeOfflineWrite,\r
+    hostOpcodeOfflineGetCurrentPass,\r
+    hostOpcodeOfflineGetCurrentMetaPass,\r
+    hostOpcodeSetOutputSampleRate,\r
+    hostOpcodeGetOutputSpeakerConfiguration,\r
+    hostOpcodeGetManufacturerName,\r
+    hostOpcodeGetProductName,\r
+    hostOpcodeGetManufacturerVersion,\r
+    hostOpcodeManufacturerSpecific,\r
+    hostOpcodeSetIcon,\r
+    hostOpcodeCanHostDo,\r
+    hostOpcodeGetLanguage,\r
+    hostOpcodeOpenEditorWindow,\r
+    hostOpcodeCloseEditorWindow,\r
+    hostOpcodeGetDirectory,\r
+    hostOpcodeUpdateView,\r
+    hostOpcodeParameterChangeGestureBegin,\r
+    hostOpcodeParameterChangeGestureEnd,\r
+};\r
+\r
+//==============================================================================\r
+enum VstProcessingSampleType\r
+{\r
+    vstProcessingSampleTypeFloat,\r
+    vstProcessingSampleTypeDouble\r
+};\r
+\r
+//==============================================================================\r
+// These names must be identical to the Steinberg SDK so JUCE users can set\r
+// exactly what they want.\r
+enum VstPlugInCategory\r
+{\r
+    kPlugCategUnknown,\r
+    kPlugCategEffect,\r
+    kPlugCategSynth,\r
+    kPlugCategAnalysis,\r
+    kPlugCategMastering,\r
+    kPlugCategSpacializer,\r
+    kPlugCategRoomFx,\r
+    kPlugSurroundFx,\r
+    kPlugCategRestoration,\r
+    kPlugCategOfflineProcess,\r
+    kPlugCategShell,\r
+    kPlugCategGenerator\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstEditorBounds\r
+{\r
+    int16 upper;\r
+    int16 leftmost;\r
+    int16 lower;\r
+    int16 rightmost;\r
+};\r
+\r
+//==============================================================================\r
+enum VstMaxStringLengths\r
+{\r
+    vstMaxNameLength                     = 64,\r
+    vstMaxParameterOrPinLabelLength      = 64,\r
+    vstMaxParameterOrPinShortLabelLength = 8,\r
+    vstMaxCategoryLength                 = 24,\r
+    vstMaxManufacturerStringLength       = 64,\r
+    vstMaxPlugInNameStringLength         = 64\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstPinInfo\r
+{\r
+    char text[vstMaxParameterOrPinLabelLength];\r
+    int32 flags;\r
+    int32 configurationType;\r
+    char shortText[vstMaxParameterOrPinShortLabelLength];\r
+    char unused[48];\r
+};\r
+\r
+enum VstPinInfoFlags\r
+{\r
+    vstPinInfoFlagIsActive = 1,\r
+    vstPinInfoFlagIsStereo = 2,\r
+    vstPinInfoFlagValid    = 4\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstEvent\r
+{\r
+    int32 type;\r
+    int32 size;\r
+    int32 sampleOffset;\r
+    int32 flags;\r
+    char content[16];\r
+};\r
+\r
+enum VstEventTypes\r
+{\r
+    vstMidiEventType  = 1,\r
+    vstSysExEventType = 6\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstEventBlock\r
+{\r
+    int32 numberOfEvents;\r
+    pointer_sized_int future;\r
+    VstEvent* events[2];\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstMidiEvent\r
+{\r
+    int32 type;\r
+    int32 size;\r
+    int32 sampleOffset;\r
+    int32 flags;\r
+    int32 noteSampleLength;\r
+    int32 noteSampleOffset;\r
+    char midiData[4];\r
+    char tuning;\r
+    char noteVelocityOff;\r
+    char future1;\r
+    char future2;\r
+};\r
+\r
+enum VstMidiEventFlags\r
+{\r
+    vstMidiEventIsRealtime = 1\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstSysExEvent\r
+{\r
+    int32 type;\r
+    int32 size;\r
+    int32 offsetSamples;\r
+    int32 flags;\r
+    int32 sysExDumpSize;\r
+    pointer_sized_int future1;\r
+    char* sysExDump;\r
+    pointer_sized_int future2;\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstTimingInformation\r
+{\r
+    double samplePosition;\r
+    double sampleRate;\r
+    double systemTimeNanoseconds;\r
+    double musicalPosition;\r
+    double tempoBPM;\r
+    double lastBarPosition;\r
+    double loopStartPosition;\r
+    double loopEndPosition;\r
+    int32 timeSignatureNumerator;\r
+    int32 timeSignatureDenominator;\r
+    int32 smpteOffset;\r
+    int32 smpteRate;\r
+    int32 samplesToNearestClock;\r
+    int32 flags;\r
+};\r
+\r
+enum VstTimingInformationFlags\r
+{\r
+    vstTimingInfoFlagTransportChanged          = 1,\r
+    vstTimingInfoFlagCurrentlyPlaying          = 2,\r
+    vstTimingInfoFlagLoopActive                = 4,\r
+    vstTimingInfoFlagCurrentlyRecording        = 8,\r
+    vstTimingInfoFlagAutomationWriteModeActive = 64,\r
+    vstTimingInfoFlagAutomationReadModeActive  = 128,\r
+    vstTimingInfoFlagNanosecondsValid          = 256,\r
+    vstTimingInfoFlagMusicalPositionValid      = 512,\r
+    vstTimingInfoFlagTempoValid                = 1024,\r
+    vstTimingInfoFlagLastBarPositionValid      = 2048,\r
+    vstTimingInfoFlagLoopPositionValid         = 4096,\r
+    vstTimingInfoFlagTimeSignatureValid        = 8192,\r
+    vstTimingInfoFlagSmpteValid                = 16384,\r
+    vstTimingInfoFlagNearestClockValid         = 32768\r
+};\r
+\r
+//==============================================================================\r
+enum VstSmpteRates\r
+{\r
+    vstSmpteRateFps24,\r
+    vstSmpteRateFps25,\r
+    vstSmpteRateFps2997,\r
+    vstSmpteRateFps30,\r
+    vstSmpteRateFps2997drop,\r
+    vstSmpteRateFps30drop,\r
+\r
+    vstSmpteRate16mmFilm,\r
+    vstSmpteRate35mmFilm,\r
+\r
+    vstSmpteRateFps239 = vstSmpteRate35mmFilm + 3,\r
+    vstSmpteRateFps249 ,\r
+    vstSmpteRateFps599,\r
+    vstSmpteRateFps60\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstIndividualSpeakerInfo\r
+{\r
+    float azimuthalAngle;\r
+    float elevationAngle;\r
+    float radius;\r
+    float reserved;\r
+    char label[vstMaxNameLength];\r
+    int32 type;\r
+    char unused[28];\r
+};\r
+\r
+enum VstIndividualSpeakerType\r
+{\r
+    vstIndividualSpeakerTypeUndefined = 0x7fffffff,\r
+    vstIndividualSpeakerTypeMono = 0,\r
+    vstIndividualSpeakerTypeLeft,\r
+    vstIndividualSpeakerTypeRight,\r
+    vstIndividualSpeakerTypeCentre,\r
+    vstIndividualSpeakerTypeLFE,\r
+    vstIndividualSpeakerTypeLeftSurround,\r
+    vstIndividualSpeakerTypeRightSurround,\r
+    vstIndividualSpeakerTypeLeftCentre,\r
+    vstIndividualSpeakerTypeRightCentre,\r
+    vstIndividualSpeakerTypeSurround,\r
+    vstIndividualSpeakerTypeCentreSurround = vstIndividualSpeakerTypeSurround,\r
+    vstIndividualSpeakerTypeLeftRearSurround,\r
+    vstIndividualSpeakerTypeRightRearSurround,\r
+    vstIndividualSpeakerTypeTopMiddle,\r
+    vstIndividualSpeakerTypeTopFrontLeft,\r
+    vstIndividualSpeakerTypeTopFrontCentre,\r
+    vstIndividualSpeakerTypeTopFrontRight,\r
+    vstIndividualSpeakerTypeTopRearLeft,\r
+    vstIndividualSpeakerTypeTopRearCentre,\r
+    vstIndividualSpeakerTypeTopRearRight,\r
+    vstIndividualSpeakerTypeLFE2\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct VstSpeakerConfiguration\r
+{\r
+    int32 type;\r
+    int32 numberOfChannels;\r
+    VstIndividualSpeakerInfo speakers[8];\r
+};\r
+\r
+enum VstSpeakerConfigurationType\r
+{\r
+    vstSpeakerConfigTypeUser  = -2,\r
+    vstSpeakerConfigTypeEmpty = -1,\r
+    vstSpeakerConfigTypeMono  = 0,\r
+    vstSpeakerConfigTypeLR,\r
+    vstSpeakerConfigTypeLsRs,\r
+    vstSpeakerConfigTypeLcRc,\r
+    vstSpeakerConfigTypeSlSr,\r
+    vstSpeakerConfigTypeCLfe,\r
+    vstSpeakerConfigTypeLRC,\r
+    vstSpeakerConfigTypeLRS,\r
+    vstSpeakerConfigTypeLRCLfe,\r
+    vstSpeakerConfigTypeLRLfeS,\r
+    vstSpeakerConfigTypeLRCS,\r
+    vstSpeakerConfigTypeLRLsRs,\r
+    vstSpeakerConfigTypeLRCLfeS,\r
+    vstSpeakerConfigTypeLRLfeLsRs,\r
+    vstSpeakerConfigTypeLRCLsRs,\r
+    vstSpeakerConfigTypeLRCLfeLsRs,\r
+    vstSpeakerConfigTypeLRCLsRsCs,\r
+    vstSpeakerConfigTypeLRLsRsSlSr,\r
+    vstSpeakerConfigTypeLRCLfeLsRsCs,\r
+    vstSpeakerConfigTypeLRLfeLsRsSlSr,\r
+    vstSpeakerConfigTypeLRCLsRsLcRc,\r
+    vstSpeakerConfigTypeLRCLsRsSlSr,\r
+    vstSpeakerConfigTypeLRCLfeLsRsLcRc,\r
+    vstSpeakerConfigTypeLRCLfeLsRsSlSr,\r
+    vstSpeakerConfigTypeLRCLsRsLcRcCs,\r
+    vstSpeakerConfigTypeLRCLsRsCsSlSr,\r
+    vstSpeakerConfigTypeLRCLfeLsRsLcRcCs,\r
+    vstSpeakerConfigTypeLRCLfeLsRsCsSlSr,\r
+    vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2\r
+};\r
+\r
+#if JUCE_BIG_ENDIAN\r
+ #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24))\r
+#else\r
+ #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24))\r
+#endif\r
+\r
+enum PresonusExtensionConstants\r
+{\r
+    presonusVendorID                = JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S'),\r
+    presonusSetContentScaleFactor   = JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's')\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+    @tags{Audio}\r
+*/\r
+struct vst2FxBank\r
+{\r
+    int32 magic1;\r
+    int32 size;\r
+    int32 magic2;\r
+    int32 version1;\r
+    int32 fxID;\r
+    int32 version2;\r
+    int32 elements;\r
+    int32 current;\r
+    char shouldBeZero[124];\r
+    int32 chunkSize;\r
+    char chunk[1];\r
+};\r
+\r
+#if JUCE_MSVC\r
+ #pragma pack(pop)\r
+#elif JUCE_MAC || JUCE_IOS\r
+ #pragma options align=reset\r
+#else\r
+ #pragma pack(pop)\r
+#endif\r
index d18c83c31e61955c3eb013cd56d93ea517c37a0f..84c73d4d337aee8b2a97e4af3acc54c5c3f54f49 100644 (file)
@@ -58,73 +58,73 @@ public:
         numEventsUsed = 0;\r
 \r
         if (events != nullptr)\r
-            events->numEvents = 0;\r
+            events->numberOfEvents = 0;\r
     }\r
 \r
     void addEvent (const void* const midiData, const int numBytes, const int frameOffset)\r
     {\r
         ensureSize (numEventsUsed + 1);\r
 \r
-        Vst2::VstMidiEvent* const e = (Vst2::VstMidiEvent*) (events->events [numEventsUsed]);\r
-        events->numEvents = ++numEventsUsed;\r
+        VstMidiEvent* const e = (VstMidiEvent*) (events->events [numEventsUsed]);\r
+        events->numberOfEvents = ++numEventsUsed;\r
 \r
         if (numBytes <= 4)\r
         {\r
-            if (e->type == Vst2::kVstSysExType)\r
+            if (e->type == vstSysExEventType)\r
             {\r
-                delete[] (((Vst2::VstMidiSysexEvent*) e)->sysexDump);\r
-                e->type = Vst2::kVstMidiType;\r
-                e->byteSize = sizeof (Vst2::VstMidiEvent);\r
-                e->noteLength = 0;\r
-                e->noteOffset = 0;\r
-                e->detune = 0;\r
-                e->noteOffVelocity = 0;\r
+                delete[] (((VstSysExEvent*) e)->sysExDump);\r
+                e->type = vstMidiEventType;\r
+                e->size = sizeof (VstMidiEvent);\r
+                e->noteSampleLength = 0;\r
+                e->noteSampleOffset = 0;\r
+                e->tuning = 0;\r
+                e->noteVelocityOff = 0;\r
             }\r
 \r
-            e->deltaFrames = frameOffset;\r
+            e->sampleOffset = frameOffset;\r
             memcpy (e->midiData, midiData, (size_t) numBytes);\r
         }\r
         else\r
         {\r
-            Vst2::VstMidiSysexEvent* const se = (Vst2::VstMidiSysexEvent*) e;\r
+            VstSysExEvent* const se = (VstSysExEvent*) e;\r
 \r
-            if (se->type == Vst2::kVstSysExType)\r
-                delete[] se->sysexDump;\r
+            if (se->type == vstSysExEventType)\r
+                delete[] se->sysExDump;\r
 \r
-            se->sysexDump = new char [(size_t) numBytes];\r
-            memcpy (se->sysexDump, midiData, (size_t) numBytes);\r
+            se->sysExDump = new char [(size_t) numBytes];\r
+            memcpy (se->sysExDump, midiData, (size_t) numBytes);\r
 \r
-            se->type = Vst2::kVstSysExType;\r
-            se->byteSize = sizeof (Vst2::VstMidiSysexEvent);\r
-            se->deltaFrames = frameOffset;\r
+            se->type = vstSysExEventType;\r
+            se->size = sizeof (VstSysExEvent);\r
+            se->offsetSamples = frameOffset;\r
             se->flags = 0;\r
-            se->dumpBytes = numBytes;\r
-            se->resvd1 = 0;\r
-            se->resvd2 = 0;\r
+            se->sysExDumpSize = numBytes;\r
+            se->future1 = 0;\r
+            se->future2 = 0;\r
         }\r
     }\r
 \r
     //==============================================================================\r
     // Handy method to pull the events out of an event buffer supplied by the host\r
     // or plugin.\r
-    static void addEventsToMidiBuffer (const Vst2::VstEvents* events, MidiBuffer& dest)\r
+    static void addEventsToMidiBuffer (const VstEventBlock* events, MidiBuffer& dest)\r
     {\r
-        for (int i = 0; i < events->numEvents; ++i)\r
+        for (int i = 0; i < events->numberOfEvents; ++i)\r
         {\r
-            const Vst2::VstEvent* const e = events->events[i];\r
+            const VstEvent* const e = events->events[i];\r
 \r
             if (e != nullptr)\r
             {\r
-                if (e->type == Vst2::kVstMidiType)\r
+                if (e->type == vstMidiEventType)\r
                 {\r
-                    dest.addEvent ((const juce::uint8*) ((const Vst2::VstMidiEvent*) e)->midiData,\r
-                                   4, e->deltaFrames);\r
+                    dest.addEvent ((const juce::uint8*) ((const VstMidiEvent*) e)->midiData,\r
+                                   4, e->sampleOffset);\r
                 }\r
-                else if (e->type == Vst2::kVstSysExType)\r
+                else if (e->type == vstSysExEventType)\r
                 {\r
-                    dest.addEvent ((const juce::uint8*) ((const Vst2::VstMidiSysexEvent*) e)->sysexDump,\r
-                                   (int) ((const Vst2::VstMidiSysexEvent*) e)->dumpBytes,\r
-                                   e->deltaFrames);\r
+                    dest.addEvent ((const juce::uint8*) ((const VstSysExEvent*) e)->sysExDump,\r
+                                   (int) ((const VstSysExEvent*) e)->sysExDumpSize,\r
+                                   e->sampleOffset);\r
                 }\r
             }\r
         }\r
@@ -137,7 +137,7 @@ public:
         {\r
             numEventsNeeded = (numEventsNeeded + 32) & ~31;\r
 \r
-            const size_t size = 20 + sizeof (Vst2::VstEvent*) * (size_t) numEventsNeeded;\r
+            const size_t size = 20 + sizeof (VstEvent*) * (size_t) numEventsNeeded;\r
 \r
             if (events == nullptr)\r
                 events.calloc (size, 1);\r
@@ -165,24 +165,24 @@ public:
     }\r
 \r
     //==============================================================================\r
-    HeapBlock<Vst2::VstEvents> events;\r
+    HeapBlock<VstEventBlock> events;\r
 \r
 private:\r
     int numEventsUsed, numEventsAllocated;\r
 \r
-    static Vst2::VstEvent* allocateVSTEvent()\r
+    static VstEvent* allocateVSTEvent()\r
     {\r
-        auto e = (Vst2::VstEvent*) std::calloc (1, sizeof (Vst2::VstMidiEvent) > sizeof (Vst2::VstMidiSysexEvent) ? sizeof (Vst2::VstMidiEvent)\r
-                                                                                            : sizeof (Vst2::VstMidiSysexEvent));\r
-        e->type = Vst2::kVstMidiType;\r
-        e->byteSize = sizeof (Vst2::VstMidiEvent);\r
+        auto e = (VstEvent*) std::calloc (1, sizeof (VstMidiEvent) > sizeof (VstSysExEvent) ? sizeof (VstMidiEvent)\r
+                                                                                            : sizeof (VstSysExEvent));\r
+        e->type = vstMidiEventType;\r
+        e->size = sizeof (VstMidiEvent);\r
         return e;\r
     }\r
 \r
-    static void freeVSTEvent (Vst2::VstEvent* e)\r
+    static void freeVSTEvent (VstEvent* e)\r
     {\r
-        if (e->type == Vst2::kVstSysExType)\r
-            delete[] (((Vst2::VstMidiSysexEvent*) e)->sysexDump);\r
+        if (e->type == vstSysExEventType)\r
+            delete[] (((VstSysExEvent*) e)->sysExDump);\r
 \r
         std::free (e);\r
     }\r
index c00cf98995da4237e57bf4ffb6b7e612e752a277..a52f2f8aaf3d82725de32e741e407d9b9f2997cc 100644 (file)
  #define __cdecl\r
 #endif\r
 \r
-#define VST_FORCE_DEPRECATED 0\r
-#define JUCE_VSTINTERFACE_H_INCLUDED 1\r
-\r
 namespace Vst2\r
 {\r
-// If the following files cannot be found then you are probably trying to host\r
-// VST2 plug-ins. To do this you must have a VST2 SDK in your header search\r
-// paths or use the "VST (Legacy) SDK Folder" field in the Projucer. The VST2\r
-// SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3\r
-// SDK or JUCE version 5.3.2.\r
-#include <pluginterfaces/vst2.x/aeffect.h>\r
-#include <pluginterfaces/vst2.x/aeffectx.h>\r
+ #include "juce_VSTInterface.h"\r
 }\r
 \r
+using namespace Vst2;\r
+\r
 #include "juce_VSTCommon.h"\r
 \r
 #if JUCE_MSVC\r
@@ -76,7 +69,7 @@ namespace Vst2
 #endif\r
 \r
 #ifndef JUCE_VST_WRAPPER_INVOKE_MAIN\r
-#define JUCE_VST_WRAPPER_INVOKE_MAIN  effect = module->moduleMain ((Vst2::audioMasterCallback) &audioMaster);\r
+ #define JUCE_VST_WRAPPER_INVOKE_MAIN  effect = module->moduleMain (&audioMaster);\r
 #endif\r
 \r
 //==============================================================================\r
@@ -213,8 +206,8 @@ namespace
 }\r
 \r
 //==============================================================================\r
-typedef Vst2::AEffect* (VSTCALLBACK *MainCall) (Vst2::audioMasterCallback);\r
-static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect*, int32, int32, pointer_sized_int, void*, float);\r
+typedef VstEffectInterface* (VSTINTERFACECALL *MainCall) (VstHostCallback);\r
+static pointer_sized_int VSTINTERFACECALL audioMaster (VstEffectInterface*, int32, int32, pointer_sized_int, void*, float);\r
 \r
 //==============================================================================\r
 // Change this to disable logging of various VST activities\r
@@ -233,7 +226,7 @@ static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect*, int32, int32,
 \r
 namespace\r
 {\r
-    using EventProcPtr = void (*)(XEvent*);\r
+    typedef void (*EventProcPtr) (XEvent* ev);\r
 \r
     Window getChildWindow (Window windowToCheck)\r
     {\r
@@ -666,11 +659,11 @@ struct ModuleHandle    : public ReferenceCountedObject
 \r
         if (moduleMain != nullptr)\r
         {\r
-            vstXml = parseXML (file.withFileExtension ("vstxml"));\r
+            vstXml.reset (XmlDocument::parse (file.withFileExtension ("vstxml")));\r
 \r
            #if JUCE_WINDOWS\r
             if (vstXml == nullptr)\r
-                vstXml = parseXML (getDLLResource (file, "VSTXML", 1));\r
+                vstXml.reset (XmlDocument::parse (getDLLResource (file, "VSTXML", 1)));\r
            #endif\r
         }\r
 \r
@@ -684,9 +677,9 @@ struct ModuleHandle    : public ReferenceCountedObject
         module.close();\r
     }\r
 \r
-    void closeEffect (Vst2::AEffect* eff)\r
+    void closeEffect (VstEffectInterface* eff)\r
     {\r
-        eff->dispatcher (eff, Vst2::effClose, 0, 0, 0, 0);\r
+        eff->dispatchFunction (eff, plugInOpcodeClose, 0, 0, 0, 0);\r
     }\r
 \r
    #if JUCE_WINDOWS\r
@@ -777,7 +770,7 @@ struct ModuleHandle    : public ReferenceCountedObject
                                                     .findChildFiles (File::findFiles, false, "*.vstxml");\r
 \r
                             if (! vstXmlFiles.isEmpty())\r
-                                vstXml = parseXML (vstXmlFiles.getReference(0));\r
+                                vstXml.reset (XmlDocument::parse (vstXmlFiles.getReference(0)));\r
                         }\r
                     }\r
 \r
@@ -810,9 +803,9 @@ struct ModuleHandle    : public ReferenceCountedObject
         }\r
     }\r
 \r
-    void closeEffect (Vst2::AEffect* eff)\r
+    void closeEffect (VstEffectInterface* eff)\r
     {\r
-        eff->dispatcher (eff, Vst2::effClose, 0, 0, 0, 0);\r
+        eff->dispatchFunction (eff, plugInOpcodeClose, 0, 0, 0, 0);\r
     }\r
 \r
   #endif\r
@@ -867,7 +860,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             {\r
                 const ScopedLock sl (pluginInstance.lock);\r
 \r
-                return effect->getParameter (effect, getParameterIndex());\r
+                return effect->getParameterValueFunction (effect, getParameterIndex());\r
             }\r
 \r
             return 0.0f;\r
@@ -879,8 +872,8 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             {\r
                 const ScopedLock sl (pluginInstance.lock);\r
 \r
-                if (effect->getParameter (effect, getParameterIndex()) != newValue)\r
-                    effect->setParameter (effect, getParameterIndex(), newValue);\r
+                if (effect->getParameterValueFunction (effect, getParameterIndex()) != newValue)\r
+                    effect->setParameterValueFunction (effect, getParameterIndex(), newValue);\r
             }\r
         }\r
 \r
@@ -913,7 +906,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             if (valueType != nullptr || ! vstValueStrings.isEmpty())\r
                 return getText (getValue(), 1024);\r
 \r
-            return pluginInstance.getTextForOpcode (getParameterIndex(), Vst2::effGetParamDisplay);\r
+            return pluginInstance.getTextForOpcode (getParameterIndex(), plugInOpcodeGetParameterText);\r
         }\r
 \r
         float getDefaultValue() const override\r
@@ -925,7 +918,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         {\r
             if (name.isEmpty())\r
                 return pluginInstance.getTextForOpcode (getParameterIndex(),\r
-                                                        Vst2::effGetParamName);\r
+                                                        plugInOpcodeGetParameterName);\r
 \r
             if (name.length() <= maximumStringLength)\r
                 return name;\r
@@ -945,7 +938,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         String getLabel() const override\r
         {\r
             return label.isEmpty() ? pluginInstance.getTextForOpcode (getParameterIndex(),\r
-                                                                      Vst2::effGetParamLabel)\r
+                                                                      plugInOpcodeGetParameterLabel)\r
                                    : label;\r
         }\r
 \r
@@ -987,7 +980,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         const VSTXMLInfo::ValueType* const valueType;\r
     };\r
 \r
-    VSTPluginInstance (const ModuleHandle::Ptr& mh, const BusesProperties& ioConfig, Vst2::AEffect* effect,\r
+    VSTPluginInstance (const ModuleHandle::Ptr& mh, const BusesProperties& ioConfig, VstEffectInterface* effect,\r
                        double sampleRateToUse, int blockSizeToUse)\r
         : AudioPluginInstance (ioConfig),\r
           vstEffect (effect),\r
@@ -1000,13 +993,13 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         if (auto* xml = vstModule->vstXml.get())\r
             xmlInfo.reset (VSTXMLInfo::createFor (*xml));\r
 \r
-        for (int i = 0; i < vstEffect->numParams; ++i)\r
+        for (int i = 0; i < vstEffect->numParameters; ++i)\r
         {\r
             String paramName;\r
             Array<String> shortParamNames;\r
             float defaultValue = 0;\r
             String label;\r
-            bool isAutomatable = dispatch (Vst2::effCanBeAutomated, i, 0, 0, 0) != 0;\r
+            bool isAutomatable = dispatch (plugInOpcodeIsParameterAutomatable, i, 0, 0, 0) != 0;\r
             bool isDiscrete = false;\r
             int numSteps = AudioProcessor::getDefaultNumParameterSteps();\r
             bool isBoolSwitch = false;\r
@@ -1083,7 +1076,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
     ~VSTPluginInstance()\r
     {\r
-        if (vstEffect != nullptr && vstEffect->magic == 0x56737450 /* 'VstP' */)\r
+        if (vstEffect != nullptr && vstEffect->interfaceIdentifier == juceVstInterfaceIdentifier)\r
         {\r
             struct VSTDeleter : public CallbackMessage\r
             {\r
@@ -1116,7 +1109,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
     void cleanup()\r
     {\r
-        if (vstEffect != nullptr && vstEffect->magic == 0x56737450 /* 'VstP' */)\r
+        if (vstEffect != nullptr && vstEffect->interfaceIdentifier == juceVstInterfaceIdentifier)\r
         {\r
            #if JUCE_MAC\r
             if (vstModule->resFileId != 0)\r
@@ -1126,7 +1119,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             // Must delete any editors before deleting the plugin instance!\r
             jassert (getActiveEditor() == 0);\r
 \r
-            _fpreset(); // some dodgy plug-ins mess around with this\r
+            _fpreset(); // some dodgy plugs fuck around with this\r
 \r
             vstModule->closeEffect (vstEffect);\r
         }\r
@@ -1141,16 +1134,16 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         if (auto* newEffect = constructEffect (newModule))\r
         {\r
-            newEffect->resvd2 = 0;\r
+            newEffect->hostSpace2 = 0;\r
 \r
-            newEffect->dispatcher (newEffect, Vst2::effIdentify, 0, 0, 0, 0);\r
+            newEffect->dispatchFunction (newEffect, plugInOpcodeIdentify, 0, 0, 0, 0);\r
 \r
             auto blockSize = jmax (32, initialBlockSize);\r
 \r
-            newEffect->dispatcher (newEffect, Vst2::effSetSampleRate, 0, 0, 0, static_cast<float> (initialSampleRate));\r
-            newEffect->dispatcher (newEffect, Vst2::effSetBlockSize,  0, blockSize, 0, 0);\r
+            newEffect->dispatchFunction (newEffect, plugInOpcodeSetSampleRate, 0, 0, 0, static_cast<float> (initialSampleRate));\r
+            newEffect->dispatchFunction (newEffect, plugInOpcodeSetBlockSize,  0, blockSize, 0, 0);\r
 \r
-            newEffect->dispatcher (newEffect, Vst2::effOpen, 0, 0, 0, 0);\r
+            newEffect->dispatchFunction (newEffect, plugInOpcodeOpen, 0, 0, 0, 0);\r
             BusesProperties ioConfig = queryBusIO (newEffect);\r
 \r
             return new VSTPluginInstance (newModule, ioConfig, newEffect, initialSampleRate, blockSize);\r
@@ -1166,7 +1159,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
         {\r
             char buffer[512] = { 0 };\r
-            dispatch (Vst2::effGetEffectName, 0, 0, buffer, 0);\r
+            dispatch (plugInOpcodeGetPlugInName, 0, 0, buffer, 0);\r
 \r
             desc.descriptiveName = String::createStringFromData (buffer, (int) sizeof (buffer)).trim();\r
 \r
@@ -1183,21 +1176,21 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
         {\r
             char buffer[512] = { 0 };\r
-            dispatch (Vst2::effGetVendorString, 0, 0, buffer, 0);\r
+            dispatch (plugInOpcodeGetManufacturerName, 0, 0, buffer, 0);\r
             desc.manufacturerName = String::createStringFromData (buffer, (int) sizeof (buffer)).trim();\r
         }\r
 \r
         desc.version = getVersion();\r
         desc.numInputChannels = getTotalNumInputChannels();\r
         desc.numOutputChannels = getTotalNumOutputChannels();\r
-        desc.isInstrument = (vstEffect != nullptr && (vstEffect->flags & Vst2::effFlagsIsSynth) != 0);\r
+        desc.isInstrument = (vstEffect != nullptr && (vstEffect->flags & vstEffectFlagIsSynth) != 0);\r
     }\r
 \r
     bool initialiseEffect (double initialSampleRate, int initialBlockSize)\r
     {\r
         if (vstEffect != nullptr)\r
         {\r
-            vstEffect->resvd2 = (pointer_sized_int) (pointer_sized_int) this;\r
+            vstEffect->hostSpace2 = (pointer_sized_int) (pointer_sized_int) this;\r
             initialise (initialSampleRate, initialBlockSize);\r
             return true;\r
         }\r
@@ -1215,7 +1208,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         // because many plugins need a chance to create HWNDs that will get their\r
         // messages delivered by the main message thread, and that's not possible from\r
         // a background thread.\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
        #endif\r
 \r
         JUCE_VST_LOG ("Initialising VST: " + vstModule->pluginName + " (" + getVersion() + ")");\r
@@ -1223,27 +1216,27 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
         setRateAndBufferSizeDetails (initialSampleRate, initialBlockSize);\r
 \r
-        dispatch (Vst2::effIdentify, 0, 0, 0, 0);\r
+        dispatch (plugInOpcodeIdentify, 0, 0, 0, 0);\r
 \r
         if (getSampleRate() > 0)\r
-            dispatch (Vst2::effSetSampleRate, 0, 0, 0, (float) getSampleRate());\r
+            dispatch (plugInOpcodeSetSampleRate, 0, 0, 0, (float) getSampleRate());\r
 \r
         if (getBlockSize() > 0)\r
-            dispatch (Vst2::effSetBlockSize, 0, jmax (32, getBlockSize()), 0, 0);\r
+            dispatch (plugInOpcodeSetBlockSize, 0, jmax (32, getBlockSize()), 0, 0);\r
 \r
-        dispatch (Vst2::effOpen, 0, 0, 0, 0);\r
+        dispatch (plugInOpcodeOpen, 0, 0, 0, 0);\r
 \r
         setRateAndBufferSizeDetails (getSampleRate(), getBlockSize());\r
 \r
         if (getNumPrograms() > 1)\r
             setCurrentProgram (0);\r
         else\r
-            dispatch (Vst2::effSetProgram, 0, 0, 0, 0);\r
+            dispatch (plugInOpcodeSetCurrentProgram, 0, 0, 0, 0);\r
 \r
-        for (int i = vstEffect->numInputs;  --i >= 0;)  dispatch (Vst2::effConnectInput,  i, 1, 0, 0);\r
-        for (int i = vstEffect->numOutputs; --i >= 0;)  dispatch (Vst2::effConnectOutput, i, 1, 0, 0);\r
+        for (int i = vstEffect->numInputChannels;  --i >= 0;)  dispatch (plugInOpcodeConnectInput,  i, 1, 0, 0);\r
+        for (int i = vstEffect->numOutputChannels; --i >= 0;)  dispatch (plugInOpcodeConnectOutput, i, 1, 0, 0);\r
 \r
-        if (getVstCategory() != Vst2::kPlugCategShell) // (workaround for Waves 5 plugins which crash during this call)\r
+        if (getVstCategory() != kPlugCategShell) // (workaround for Waves 5 plugins which crash during this call)\r
             updateStoredProgramNames();\r
 \r
         wantsMidiMessages = pluginCanDo ("receiveVstMidiEvent") > 0;\r
@@ -1252,7 +1245,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         usesCocoaNSView = ((unsigned int) pluginCanDo ("hasCockosViewAsConfig") & 0xffff0000ul) == 0xbeef0000ul;\r
        #endif\r
 \r
-        setLatencySamples (vstEffect->initialDelay);\r
+        setLatencySamples (vstEffect->latency);\r
     }\r
 \r
     void* getPlatformSpecificData() override    { return vstEffect; }\r
@@ -1263,7 +1256,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         {\r
             char buffer[512] = { 0 };\r
 \r
-            if (dispatch (Vst2::effGetProductString, 0, 0, buffer, 0) != 0)\r
+            if (dispatch (plugInOpcodeGetManufacturerProductName, 0, 0, buffer, 0) != 0)\r
             {\r
                 String productName = String::createStringFromData (buffer, (int) sizeof (buffer));\r
 \r
@@ -1277,7 +1270,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
     int getUID() const\r
     {\r
-        int uid = vstEffect != nullptr ? vstEffect->uniqueID : 0;\r
+        int uid = vstEffect != nullptr ? vstEffect->plugInIdentifier : 0;\r
 \r
         if (uid == 0)\r
             uid = vstModule->file.hashCode();\r
@@ -1290,32 +1283,21 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         if (vstEffect == nullptr)\r
             return 0.0;\r
 \r
-        if ((vstEffect->flags & Vst2::effFlagsNoSoundInStop) != 0)\r
-            return 0.0;\r
-\r
-        auto tailSize = dispatch (Vst2::effGetTailSize, 0, 0, 0, 0);\r
         auto sampleRate = getSampleRate();\r
 \r
-        // remain backward compatible with old JUCE plug-ins: anything larger\r
-        // than INT32_MAX is an invalid tail time but old JUCE 64-bit plug-ins\r
-        // would return INT64_MAX for infinite tail time. So treat anything\r
-        // equal or greater than INT32_MAX as infinite tail time.\r
-        if (tailSize >= std::numeric_limits<int32>::max())\r
-            return std::numeric_limits<double>::infinity();\r
-\r
-        if (tailSize >= 0 && sampleRate > 0)\r
-            return static_cast<double> (tailSize) / sampleRate;\r
+        if (sampleRate <= 0)\r
+            return 0.0;\r
 \r
-        return 0.0;\r
+        return dispatch (plugInOpcodeGetTailSize, 0, 0, 0, 0) / sampleRate;\r
     }\r
 \r
     bool acceptsMidi() const override    { return wantsMidiMessages; }\r
     bool producesMidi() const override   { return pluginCanDo ("sendVstMidiEvent") > 0; }\r
     bool supportsMPE() const override    { return pluginCanDo ("MPE") > 0; }\r
 \r
-    Vst2::VstPlugCategory getVstCategory() const noexcept     { return (Vst2::VstPlugCategory) dispatch (Vst2::effGetPlugCategory, 0, 0, 0, 0); }\r
+    VstPlugInCategory getVstCategory() const noexcept     { return (VstPlugInCategory) dispatch (plugInOpcodeGetPlugInCategory, 0, 0, 0, 0); }\r
 \r
-    int pluginCanDo (const char* text) const     { return (int) dispatch (Vst2::effCanDo, 0, 0, (void*) text,  0); }\r
+    int pluginCanDo (const char* text) const     { return (int) dispatch (plugInOpcodeCanPlugInDo, 0, 0, (void*) text,  0); }\r
 \r
     //==============================================================================\r
     void prepareToPlay (double rate, int samplesPerBlockExpected) override\r
@@ -1330,17 +1312,17 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             SpeakerMappings::VstSpeakerConfigurationHolder inArr  (getChannelLayoutOfBus (true,  0));\r
             SpeakerMappings::VstSpeakerConfigurationHolder outArr (getChannelLayoutOfBus (false, 0));\r
 \r
-            dispatch (Vst2::effSetSpeakerArrangement, 0, (pointer_sized_int) &inArr.get(), (void*) &outArr.get(), 0.0f);\r
+            dispatch (plugInOpcodeSetSpeakerConfiguration, 0, (pointer_sized_int) &inArr.get(), (void*) &outArr.get(), 0.0f);\r
         }\r
 \r
-        vstHostTime.tempo = 120.0;\r
-        vstHostTime.timeSigNumerator = 4;\r
-        vstHostTime.timeSigDenominator = 4;\r
+        vstHostTime.tempoBPM = 120.0;\r
+        vstHostTime.timeSignatureNumerator = 4;\r
+        vstHostTime.timeSignatureDenominator = 4;\r
         vstHostTime.sampleRate = rate;\r
-        vstHostTime.samplePos = 0;\r
-        vstHostTime.flags = Vst2::kVstNanosValid\r
-                              | Vst2::kVstAutomationWriting\r
-                              | Vst2::kVstAutomationReading;\r
+        vstHostTime.samplePosition = 0;\r
+        vstHostTime.flags = vstTimingInfoFlagNanosecondsValid\r
+                              | vstTimingInfoFlagAutomationWriteModeActive\r
+                              | vstTimingInfoFlagAutomationReadModeActive;\r
 \r
         initialise (rate, samplesPerBlockExpected);\r
 \r
@@ -1355,18 +1337,18 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
             incomingMidi.clear();\r
 \r
-            dispatch (Vst2::effSetSampleRate, 0, 0, 0, (float) rate);\r
-            dispatch (Vst2::effSetBlockSize, 0, jmax (16, samplesPerBlockExpected), 0, 0);\r
+            dispatch (plugInOpcodeSetSampleRate, 0, 0, 0, (float) rate);\r
+            dispatch (plugInOpcodeSetBlockSize, 0, jmax (16, samplesPerBlockExpected), 0, 0);\r
 \r
             if (supportsDoublePrecisionProcessing())\r
             {\r
-                int32 vstPrecision = isUsingDoublePrecision() ? Vst2::kVstProcessPrecision64\r
-                                                              : Vst2::kVstProcessPrecision32;\r
+                int32 vstPrecision = isUsingDoublePrecision() ? vstProcessingSampleTypeDouble\r
+                                                              : vstProcessingSampleTypeFloat;\r
 \r
-                dispatch (Vst2::effSetProcessPrecision, 0, (pointer_sized_int) vstPrecision, 0, 0);\r
+                dispatch (plugInOpcodeSetSampleFloatType, 0, (pointer_sized_int) vstPrecision, 0, 0);\r
             }\r
 \r
-            auto maxChannels = jmax (1, jmax (vstEffect->numInputs, vstEffect->numOutputs));\r
+            auto maxChannels = jmax (1, jmax (vstEffect->numInputChannels, vstEffect->numOutputChannels));\r
 \r
             tmpBufferFloat .setSize (maxChannels, samplesPerBlockExpected);\r
             tmpBufferDouble.setSize (maxChannels, samplesPerBlockExpected);\r
@@ -1374,7 +1356,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             channelBufferFloat .calloc (static_cast<size_t> (maxChannels));\r
             channelBufferDouble.calloc (static_cast<size_t> (maxChannels));\r
 \r
-            outOfPlaceBuffer.setSize (jmax (1, vstEffect->numOutputs), samplesPerBlockExpected);\r
+            outOfPlaceBuffer.setSize (jmax (1, vstEffect->numOutputChannels), samplesPerBlockExpected);\r
 \r
             if (! isPowerOn)\r
                 setPower (true);\r
@@ -1390,9 +1372,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
                 }\r
             }\r
 \r
-            dispatch (Vst2::effStartProcess, 0, 0, 0, 0);\r
+            dispatch (plugInOpcodeStartProcess, 0, 0, 0, 0);\r
 \r
-            setLatencySamples (vstEffect->initialDelay);\r
+            setLatencySamples (vstEffect->latency);\r
         }\r
     }\r
 \r
@@ -1400,7 +1382,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         if (initialised)\r
         {\r
-            dispatch (Vst2::effStopProcess, 0, 0, 0, 0);\r
+            dispatch (plugInOpcodeStopProcess, 0, 0, 0, 0);\r
             setPower (false);\r
         }\r
 \r
@@ -1453,8 +1435,8 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     //==============================================================================\r
     bool supportsDoublePrecisionProcessing() const override\r
     {\r
-        return ((vstEffect->flags & Vst2::effFlagsCanReplacing) != 0\r
-             && (vstEffect->flags & Vst2::effFlagsCanDoubleReplacing) != 0);\r
+        return ((vstEffect->flags & vstEffectFlagInplaceAudio) != 0\r
+             && (vstEffect->flags & vstEffectFlagInplaceDoubleAudio) != 0);\r
     }\r
 \r
     AudioProcessorParameter* getBypassParameter() const override               { return vstSupportsBypass ? bypassParam.get() : nullptr; }\r
@@ -1472,15 +1454,15 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         if (numInputBuses > 1 || numOutputBuses > 1)\r
             return (layouts == getBusesLayout());\r
 \r
-        return (layouts.getNumChannels (true,  0) <= vstEffect->numInputs\r
-             && layouts.getNumChannels (false, 0) <= vstEffect->numOutputs);\r
+        return (layouts.getNumChannels (true,  0) <= vstEffect->numInputChannels\r
+             && layouts.getNumChannels (false, 0) <= vstEffect->numOutputChannels);\r
     }\r
 \r
     //==============================================================================\r
    #if JUCE_IOS || JUCE_ANDROID\r
     bool hasEditor() const override                  { return false; }\r
    #else\r
-    bool hasEditor() const override                  { return vstEffect != nullptr && (vstEffect->flags & Vst2::effFlagsHasEditor) != 0; }\r
+    bool hasEditor() const override                  { return vstEffect != nullptr && (vstEffect->flags & vstEffectFlagHasEditor) != 0; }\r
    #endif\r
 \r
     AudioProcessorEditor* createEditor() override;\r
@@ -1490,9 +1472,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         if (isValidChannel (index, true))\r
         {\r
-            Vst2::VstPinProperties pinProps;\r
-            if (dispatch (Vst2::effGetInputProperties, index, 0, &pinProps, 0.0f) != 0)\r
-                return String (pinProps.label, sizeof (pinProps.label));\r
+            VstPinInfo pinProps;\r
+            if (dispatch (plugInOpcodeGetInputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+                return String (pinProps.text, sizeof (pinProps.text));\r
         }\r
 \r
         return {};\r
@@ -1503,9 +1485,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         if (! isValidChannel (index, true))\r
             return false;\r
 \r
-        Vst2::VstPinProperties pinProps;\r
-        if (dispatch (Vst2::effGetInputProperties, index, 0, &pinProps, 0.0f) != 0)\r
-            return (pinProps.flags & Vst2::kVstPinIsStereo) != 0;\r
+        VstPinInfo pinProps;\r
+        if (dispatch (plugInOpcodeGetInputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+            return (pinProps.flags & vstPinInfoFlagIsStereo) != 0;\r
 \r
         return true;\r
     }\r
@@ -1514,9 +1496,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         if (isValidChannel (index, false))\r
         {\r
-            Vst2::VstPinProperties pinProps;\r
-            if (dispatch (Vst2::effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0)\r
-                return String (pinProps.label, sizeof (pinProps.label));\r
+            VstPinInfo pinProps;\r
+            if (dispatch (plugInOpcodeGetOutputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+                return String (pinProps.text, sizeof (pinProps.text));\r
         }\r
 \r
         return {};\r
@@ -1527,9 +1509,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         if (! isValidChannel (index, false))\r
             return false;\r
 \r
-        Vst2::VstPinProperties pinProps;\r
-        if (dispatch (Vst2::effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0)\r
-            return (pinProps.flags & Vst2::kVstPinIsStereo) != 0;\r
+        VstPinInfo pinProps;\r
+        if (dispatch (plugInOpcodeGetOutputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+            return (pinProps.flags & vstPinInfoFlagIsStereo) != 0;\r
 \r
         return true;\r
     }\r
@@ -1544,12 +1526,12 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     int getNumPrograms() override          { return vstEffect != nullptr ? jmax (0, vstEffect->numPrograms) : 0; }\r
 \r
     // NB: some plugs return negative numbers from this function.\r
-    int getCurrentProgram() override       { return (int) dispatch (Vst2::effGetProgram, 0, 0, 0, 0); }\r
+    int getCurrentProgram() override       { return (int) dispatch (plugInOpcodeGetCurrentProgram, 0, 0, 0, 0); }\r
 \r
     void setCurrentProgram (int newIndex) override\r
     {\r
         if (getNumPrograms() > 0 && newIndex != getCurrentProgram())\r
-            dispatch (Vst2::effSetProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0);\r
+            dispatch (plugInOpcodeSetCurrentProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0);\r
     }\r
 \r
     const String getProgramName (int index) override\r
@@ -1563,7 +1545,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
             {\r
                 char nm[264] = { 0 };\r
 \r
-                if (dispatch (Vst2::effGetProgramNameIndexed, jlimit (0, getNumPrograms(), index), -1, nm, 0) != 0)\r
+                if (dispatch (plugInOpcodeGetProgramName, jlimit (0, getNumPrograms(), index), -1, nm, 0) != 0)\r
                     return String::fromUTF8 (nm).trim();\r
             }\r
         }\r
@@ -1576,7 +1558,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         if (index >= 0 && index == getCurrentProgram())\r
         {\r
             if (getNumPrograms() > 0 && newName != getCurrentProgramName())\r
-                dispatch (Vst2::effSetProgramName, 0, 0, (void*) newName.substring (0, 24).toRawUTF8(), 0.0f);\r
+                dispatch (plugInOpcodeSetCurrentProgramName, 0, 0, (void*) newName.substring (0, 24).toRawUTF8(), 0.0f);\r
         }\r
         else\r
         {\r
@@ -1594,7 +1576,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     //==============================================================================\r
     void timerCallback() override\r
     {\r
-        if (dispatch (Vst2::effIdle, 0, 0, 0, 0) == 0)\r
+        if (dispatch (plugInOpcodeIdle, 0, 0, 0, 0) == 0)\r
             stopTimer();\r
     }\r
 \r
@@ -1608,7 +1590,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         switch (opcode)\r
         {\r
-            case Vst2::audioMasterAutomate:\r
+            case hostOpcodeParameterChanged:\r
                 if (auto* param = getParameters()[index])\r
                     param->sendValueChangedMessageToListeners (opt);\r
                 else\r
@@ -1616,23 +1598,23 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
                 break;\r
 \r
-            case Vst2::audioMasterProcessEvents:            handleMidiFromPlugin ((const Vst2::VstEvents*) ptr); break;\r
-            case Vst2::audioMasterGetTime:                  return getVSTTime();\r
-            case Vst2::audioMasterIdle:                     handleIdle(); break;\r
-            case Vst2::audioMasterSizeWindow:               setWindowSize (index, (int) value); return 1;\r
-            case Vst2::audioMasterUpdateDisplay:            triggerAsyncUpdate(); break;\r
-            case Vst2::audioMasterIOChanged:                setLatencySamples (vstEffect->initialDelay); break;\r
-            case Vst2::audioMasterNeedIdle:                 startTimer (50); break;\r
+            case hostOpcodePreAudioProcessingEvents:    handleMidiFromPlugin ((const VstEventBlock*) ptr); break;\r
+            case hostOpcodeGetTimingInfo:               return getVSTTime();\r
+            case hostOpcodeIdle:                        handleIdle(); break;\r
+            case hostOpcodeWindowSize:                  setWindowSize (index, (int) value); return 1;\r
+            case hostOpcodeUpdateView:                  triggerAsyncUpdate(); break;\r
+            case hostOpcodeIOModified:                  setLatencySamples (vstEffect->latency); break;\r
+            case hostOpcodeNeedsIdle:                   startTimer (50); break;\r
 \r
-            case Vst2::audioMasterGetSampleRate:            return (pointer_sized_int) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue);\r
-            case Vst2::audioMasterGetBlockSize:             return (pointer_sized_int) (getBlockSize() > 0  ? getBlockSize()  : defaultVSTBlockSizeValue);\r
-            case Vst2::audioMasterWantMidi:                 wantsMidiMessages = true; break;\r
-            case Vst2::audioMasterGetDirectory:             return getVstDirectory();\r
+            case hostOpcodeGetSampleRate:               return (pointer_sized_int) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue);\r
+            case hostOpcodeGetBlockSize:                return (pointer_sized_int) (getBlockSize() > 0  ? getBlockSize()  : defaultVSTBlockSizeValue);\r
+            case hostOpcodePlugInWantsMidi:             wantsMidiMessages = true; break;\r
+            case hostOpcodeGetDirectory:                return getVstDirectory();\r
 \r
-            case Vst2::audioMasterTempoAt:                  return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getTempoAt ((int64) value) : 0);\r
-            case Vst2::audioMasterGetAutomationState:       return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getAutomationState() : 0);\r
+            case hostOpcodeTempoAt:                     return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getTempoAt ((int64) value) : 0);\r
+            case hostOpcodeGetAutomationState:          return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getAutomationState() : 0);\r
 \r
-            case Vst2::audioMasterBeginEdit:\r
+            case hostOpcodeParameterChangeGestureBegin:\r
                 if (auto* param = getParameters()[index])\r
                     param->beginChangeGesture();\r
                 else\r
@@ -1640,7 +1622,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
                 break;\r
 \r
-            case Vst2::audioMasterEndEdit:\r
+            case hostOpcodeParameterChangeGestureEnd:\r
                 if (auto* param = getParameters()[index])\r
                     param->endChangeGesture();\r
                 else\r
@@ -1648,28 +1630,28 @@ struct VSTPluginInstance     : public AudioPluginInstance,
 \r
                 break;\r
 \r
-            case Vst2::audioMasterPinConnected:             return isValidChannel (index, value == 0) ? 0 : 1; // (yes, 0 = true)\r
-            case Vst2::audioMasterGetCurrentProcessLevel:   return isNonRealtime() ? 4 : 0;\r
+            case hostOpcodePinConnected:                    return isValidChannel (index, value == 0) ? 0 : 1; // (yes, 0 = true)\r
+            case hostOpcodeGetCurrentAudioProcessingLevel:  return isNonRealtime() ? 4 : 0;\r
 \r
             // none of these are handled (yet)...\r
-            case Vst2::audioMasterSetTime:\r
-            case Vst2::audioMasterGetParameterQuantization:\r
-            case Vst2::audioMasterGetInputLatency:\r
-            case Vst2::audioMasterGetOutputLatency:\r
-            case Vst2::audioMasterGetPreviousPlug:\r
-            case Vst2::audioMasterGetNextPlug:\r
-            case Vst2::audioMasterWillReplaceOrAccumulate:\r
-            case Vst2::audioMasterOfflineStart:\r
-            case Vst2::audioMasterOfflineRead:\r
-            case Vst2::audioMasterOfflineWrite:\r
-            case Vst2::audioMasterOfflineGetCurrentPass:\r
-            case Vst2::audioMasterOfflineGetCurrentMetaPass:\r
-            case Vst2::audioMasterGetOutputSpeakerArrangement:\r
-            case Vst2::audioMasterVendorSpecific:\r
-            case Vst2::audioMasterSetIcon:\r
-            case Vst2::audioMasterGetLanguage:\r
-            case Vst2::audioMasterOpenWindow:\r
-            case Vst2::audioMasterCloseWindow:\r
+            case hostOpcodeSetTime:\r
+            case hostOpcodeGetParameterInterval:\r
+            case hostOpcodeGetInputLatency:\r
+            case hostOpcodeGetOutputLatency:\r
+            case hostOpcodeGetPreviousPlugIn:\r
+            case hostOpcodeGetNextPlugIn:\r
+            case hostOpcodeWillReplace:\r
+            case hostOpcodeOfflineStart:\r
+            case hostOpcodeOfflineReadSource:\r
+            case hostOpcodeOfflineWrite:\r
+            case hostOpcodeOfflineGetCurrentPass:\r
+            case hostOpcodeOfflineGetCurrentMetaPass:\r
+            case hostOpcodeGetOutputSpeakerConfiguration:\r
+            case hostOpcodeManufacturerSpecific:\r
+            case hostOpcodeSetIcon:\r
+            case hostOpcodeGetLanguage:\r
+            case hostOpcodeOpenEditorWindow:\r
+            case hostOpcodeCloseEditorWindow:\r
                 break;\r
 \r
             default:\r
@@ -1684,19 +1666,19 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         switch (opcode)\r
         {\r
-            case Vst2::audioMasterCanDo:                        return handleCanDo ((const char*) ptr);\r
-            case Vst2::audioMasterVersion:                      return 2400;\r
-            case Vst2::audioMasterCurrentId:                    return shellUIDToCreate;\r
-            case Vst2::audioMasterGetNumAutomatableParameters:  return 0;\r
-            case Vst2::audioMasterGetAutomationState:           return 1;\r
-            case Vst2::audioMasterGetVendorVersion:             return 0x0101;\r
+            case hostOpcodeCanHostDo:                         return handleCanDo ((const char*) ptr);\r
+            case hostOpcodeVstVersion:                        return 2400;\r
+            case hostOpcodeCurrentId:                         return shellUIDToCreate;\r
+            case hostOpcodeGetNumberOfAutomatableParameters:  return 0;\r
+            case hostOpcodeGetAutomationState:                return 1;\r
+            case hostOpcodeGetManufacturerVersion:            return 0x0101;\r
 \r
-            case Vst2::audioMasterGetVendorString:\r
-            case Vst2::audioMasterGetProductString:             return getHostName ((char*) ptr);\r
+            case hostOpcodeGetManufacturerName:\r
+            case hostOpcodeGetProductName:                    return getHostName ((char*) ptr);\r
 \r
-            case Vst2::audioMasterGetSampleRate:                return (pointer_sized_int) defaultVSTSampleRateValue;\r
-            case Vst2::audioMasterGetBlockSize:                 return (pointer_sized_int) defaultVSTBlockSizeValue;\r
-            case Vst2::audioMasterSetOutputSampleRate:          return 0;\r
+            case hostOpcodeGetSampleRate:                     return (pointer_sized_int) defaultVSTSampleRateValue;\r
+            case hostOpcodeGetBlockSize:                      return (pointer_sized_int) defaultVSTBlockSizeValue;\r
+            case hostOpcodeSetOutputSampleRate:               return 0;\r
 \r
             default:\r
                 DBG ("*** Unhandled VST Callback: " + String ((int) opcode));\r
@@ -1725,7 +1707,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
                     UseResFile (vstModule->resFileId);\r
                #endif\r
 \r
-                result = vstEffect->dispatcher (vstEffect, opcode, index, value, ptr, opt);\r
+                result = vstEffect->dispatchFunction (vstEffect, opcode, index, value, ptr, opt);\r
 \r
                #if JUCE_MAC\r
                 auto newResFile = CurResFile();\r
@@ -1931,14 +1913,14 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         return true;\r
     }\r
 \r
-    bool usesChunks() const noexcept        { return vstEffect != nullptr && (vstEffect->flags & Vst2::effFlagsProgramChunks) != 0; }\r
+    bool usesChunks() const noexcept        { return vstEffect != nullptr && (vstEffect->flags & vstEffectFlagDataInChunks) != 0; }\r
 \r
     bool getChunkData (MemoryBlock& mb, bool isPreset, int maxSizeMB) const\r
     {\r
         if (usesChunks())\r
         {\r
             void* data = nullptr;\r
-            auto bytes = (size_t) dispatch (Vst2::effGetChunk, isPreset ? 1 : 0, 0, &data, 0.0f);\r
+            auto bytes = (size_t) dispatch (plugInOpcodeGetData, isPreset ? 1 : 0, 0, &data, 0.0f);\r
 \r
             if (data != nullptr && bytes <= (size_t) maxSizeMB * 1024 * 1024)\r
             {\r
@@ -1956,7 +1938,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
     {\r
         if (size > 0 && usesChunks())\r
         {\r
-            dispatch (Vst2::effSetChunk, isPreset ? 1 : 0, size, (void*) data, 0.0f);\r
+            dispatch (plugInOpcodeSetData, isPreset ? 1 : 0, size, (void*) data, 0.0f);\r
 \r
             if (! isPreset)\r
                 updateStoredProgramNames();\r
@@ -1967,7 +1949,7 @@ struct VSTPluginInstance     : public AudioPluginInstance,
         return false;\r
     }\r
 \r
-    Vst2::AEffect* vstEffect;\r
+    VstEffectInterface* vstEffect;\r
     ModuleHandle::Ptr vstModule;\r
 \r
     std::unique_ptr<VSTPluginFormat::ExtraFunctions> extraFunctions;\r
@@ -1990,7 +1972,7 @@ private:
             currentValue = (newValue != 0.0f);\r
 \r
             if (parent.vstSupportsBypass)\r
-                parent.dispatch (Vst2::effSetBypass, 0, currentValue ? 1 : 0, nullptr, 0.0f);\r
+                parent.dispatch (plugInOpcodeSetBypass, 0, currentValue ? 1 : 0, nullptr, 0.0f);\r
         }\r
 \r
         float getValueForText (const String& text) const override\r
@@ -2035,7 +2017,7 @@ private:
     CriticalSection midiInLock;\r
     MidiBuffer incomingMidi;\r
     VSTMidiEventList midiEventsToSend;\r
-    Vst2::VstTimeInfo vstHostTime;\r
+    VstTimingInformation vstHostTime;\r
 \r
     AudioBuffer<float> tmpBufferFloat;\r
     HeapBlock<float*> channelBufferFloat;\r
@@ -2072,7 +2054,7 @@ private:
         if (auto* app = JUCEApplicationBase::getInstance())\r
             hostName = app->getApplicationName();\r
 \r
-        hostName.copyToUTF8 (name, (size_t) jmin (Vst2::kVstMaxVendorStrLen, Vst2::kVstMaxProductStrLen) - 1);\r
+        hostName.copyToUTF8 (name, (size_t) jmin (vstMaxManufacturerStringLength, vstMaxPlugInNameStringLength) - 1);\r
         return 1;\r
     }\r
 \r
@@ -2098,7 +2080,7 @@ private:
 \r
            #if JUCE_MAC\r
             if (getActiveEditor() != nullptr)\r
-                dispatch (Vst2::effEditIdle, 0, 0, 0, 0);\r
+                dispatch (plugInOpcodeEditorIdle, 0, 0, 0, 0);\r
            #endif\r
 \r
             Timer::callPendingTimersSynchronously();\r
@@ -2117,25 +2099,14 @@ private:
            #if JUCE_LINUX\r
             const MessageManagerLock mmLock;\r
            #endif\r
-\r
-           #if ! JUCE_MAC\r
-            if (auto* peer = ed->getTopLevelComponent()->getPeer())\r
-            {\r
-                auto scale = peer->getPlatformScaleFactor();\r
-                ed->setSize (roundToInt (width / scale), roundToInt (height / scale));\r
-\r
-                return;\r
-            }\r
-           #endif\r
-\r
             ed->setSize (width, height);\r
         }\r
     }\r
 \r
     //==============================================================================\r
-    static Vst2::AEffect* constructEffect (const ModuleHandle::Ptr& module)\r
+    static VstEffectInterface* constructEffect (const ModuleHandle::Ptr& module)\r
     {\r
-        Vst2::AEffect* effect = nullptr;\r
+        VstEffectInterface* effect = nullptr;\r
         try\r
         {\r
             const IdleCallRecursionPreventer icrp;\r
@@ -2152,10 +2123,10 @@ private:
                 JUCE_VST_WRAPPER_INVOKE_MAIN\r
             }\r
 \r
-            if (effect != nullptr && effect->magic == 0x56737450 /* 'VstP' */)\r
+            if (effect != nullptr && effect->interfaceIdentifier == juceVstInterfaceIdentifier)\r
             {\r
-                jassert (effect->resvd2 == 0);\r
-                jassert (effect->object != 0);\r
+                jassert (effect->hostSpace2 == 0);\r
+                jassert (effect->effectPointer != 0);\r
 \r
                 _fpreset(); // some dodgy plugs mess around with this\r
             }\r
@@ -2170,11 +2141,11 @@ private:
         return effect;\r
     }\r
 \r
-    static BusesProperties queryBusIO (Vst2::AEffect* effect)\r
+    static BusesProperties queryBusIO (VstEffectInterface* effect)\r
     {\r
         BusesProperties returnValue;\r
 \r
-        if (effect->numInputs == 0 && effect->numOutputs == 0)\r
+        if (effect->numInputChannels == 0 && effect->numOutputChannels == 0)\r
             return returnValue;\r
 \r
         // Workaround for old broken JUCE plug-ins which would return an invalid\r
@@ -2185,14 +2156,14 @@ private:
         // plug-in is reporting.\r
         if (! pluginHasDefaultChannelLayouts (effect))\r
         {\r
-            SpeakerMappings::VstSpeakerConfigurationHolder canonicalIn  (AudioChannelSet::canonicalChannelSet (effect->numInputs));\r
-            SpeakerMappings::VstSpeakerConfigurationHolder canonicalOut (AudioChannelSet::canonicalChannelSet (effect->numOutputs));\r
+            SpeakerMappings::VstSpeakerConfigurationHolder canonicalIn  (AudioChannelSet::canonicalChannelSet (effect->numInputChannels));\r
+            SpeakerMappings::VstSpeakerConfigurationHolder canonicalOut (AudioChannelSet::canonicalChannelSet (effect->numOutputChannels));\r
 \r
-            effect->dispatcher (effect, Vst2::effSetSpeakerArrangement, 0,\r
+            effect->dispatchFunction (effect, plugInOpcodeSetSpeakerConfiguration, 0,\r
                                       (pointer_sized_int) &canonicalIn.get(), (void*) &canonicalOut.get(), 0.0f);\r
         }\r
 \r
-        HeapBlock<Vst2::VstSpeakerArrangement> inArrBlock (1, true), outArrBlock (1, true);\r
+        HeapBlock<VstSpeakerConfiguration> inArrBlock (1, true), outArrBlock (1, true);\r
 \r
         auto* inArr  = inArrBlock.get();\r
         auto* outArr = outArrBlock.get();\r
@@ -2203,35 +2174,35 @@ private:
         for (int dir = 0; dir < 2; ++dir)\r
         {\r
             const bool isInput = (dir == 0);\r
-            const int opcode = (isInput ? Vst2::effGetInputProperties : Vst2::effGetOutputProperties);\r
-            const int maxChannels = (isInput ? effect->numInputs : effect->numOutputs);\r
-            const Vst2::VstSpeakerArrangement* arr = (isInput ? inArr : outArr);\r
+            const int opcode = (isInput ? plugInOpcodeGetInputPinProperties : plugInOpcodeGetOutputPinProperties);\r
+            const int maxChannels = (isInput ? effect->numInputChannels : effect->numOutputChannels);\r
+            const VstSpeakerConfiguration* arr = (isInput ? inArr : outArr);\r
             bool busAdded = false;\r
 \r
-            Vst2::VstPinProperties pinProps;\r
+            VstPinInfo pinProps;\r
             AudioChannelSet layout;\r
 \r
             for (int ch = 0; ch < maxChannels; ch += layout.size())\r
             {\r
-                if (effect->dispatcher (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
+                if (effect->dispatchFunction (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
                     break;\r
 \r
-                if ((pinProps.flags & Vst2::kVstPinUseSpeaker) != 0)\r
+                if ((pinProps.flags & vstPinInfoFlagValid) != 0)\r
                 {\r
-                    layout = SpeakerMappings::vstArrangementTypeToChannelSet (pinProps.arrangementType, 0);\r
+                    layout = SpeakerMappings::vstArrangementTypeToChannelSet (pinProps.configurationType, 0);\r
 \r
                     if (layout.isDisabled())\r
                         break;\r
                 }\r
                 else if (arr == nullptr)\r
                 {\r
-                    layout = ((pinProps.flags & Vst2::kVstPinIsStereo) != 0 ? AudioChannelSet::stereo() : AudioChannelSet::mono());\r
+                    layout = ((pinProps.flags & vstPinInfoFlagIsStereo) != 0 ? AudioChannelSet::stereo() : AudioChannelSet::mono());\r
                 }\r
                 else\r
                     break;\r
 \r
                 busAdded = true;\r
-                returnValue.addBus (isInput, pinProps.label, layout, true);\r
+                returnValue.addBus (isInput, pinProps.text, layout, true);\r
             }\r
 \r
             // no buses?\r
@@ -2239,8 +2210,8 @@ private:
             {\r
                 String busName = (isInput ? "Input" : "Output");\r
 \r
-                if (effect->dispatcher (effect, opcode, 0, 0, &pinProps, 0.0f) != 0)\r
-                    busName = pinProps.label;\r
+                if (effect->dispatchFunction (effect, opcode, 0, 0, &pinProps, 0.0f) != 0)\r
+                    busName = pinProps.text;\r
 \r
                 if (arr != nullptr)\r
                     layout = SpeakerMappings::vstArrangementTypeToChannelSet (*arr);\r
@@ -2254,9 +2225,9 @@ private:
         return returnValue;\r
     }\r
 \r
-    static bool pluginHasDefaultChannelLayouts (Vst2::AEffect* effect)\r
+    static bool pluginHasDefaultChannelLayouts (VstEffectInterface* effect)\r
     {\r
-        HeapBlock<Vst2::VstSpeakerArrangement> inArrBlock (1, true), outArrBlock (1, true);\r
+        HeapBlock<VstSpeakerConfiguration> inArrBlock (1, true), outArrBlock (1, true);\r
 \r
         auto* inArr  = inArrBlock.get();\r
         auto* outArr = outArrBlock.get();\r
@@ -2267,40 +2238,40 @@ private:
         for (int dir = 0; dir < 2; ++dir)\r
         {\r
             const bool isInput = (dir == 0);\r
-            const int opcode = (isInput ? Vst2::effGetInputProperties : Vst2::effGetOutputProperties);\r
-            const int maxChannels = (isInput ? effect->numInputs : effect->numOutputs);\r
+            const int opcode = (isInput ? plugInOpcodeGetInputPinProperties : plugInOpcodeGetOutputPinProperties);\r
+            const int maxChannels = (isInput ? effect->numInputChannels : effect->numOutputChannels);\r
 \r
             int channels = 1;\r
 \r
             for (int ch = 0; ch < maxChannels; ch += channels)\r
             {\r
-                Vst2::VstPinProperties pinProps;\r
+                VstPinInfo pinProps;\r
 \r
-                if (effect->dispatcher (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
+                if (effect->dispatchFunction (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
                     return false;\r
 \r
-                if ((pinProps.flags & Vst2::kVstPinUseSpeaker) != 0)\r
+                if ((pinProps.flags & vstPinInfoFlagValid) != 0)\r
                     return true;\r
 \r
-                channels = (pinProps.flags & Vst2::kVstPinIsStereo) != 0 ? 2 : 1;\r
+                channels = (pinProps.flags & vstPinInfoFlagIsStereo) != 0 ? 2 : 1;\r
             }\r
         }\r
 \r
         return false;\r
     }\r
 \r
-    static bool getSpeakerArrangementWrapper (Vst2::AEffect* effect,\r
-                                              Vst2::VstSpeakerArrangement* inArr,\r
-                                              Vst2::VstSpeakerArrangement* outArr)\r
+    static bool getSpeakerArrangementWrapper (VstEffectInterface* effect,\r
+                                              VstSpeakerConfiguration* inArr,\r
+                                              VstSpeakerConfiguration* outArr)\r
     {\r
         // Workaround: unfortunately old JUCE VST-2 plug-ins had a bug and would crash if\r
         // you try to get the speaker arrangement when there are no input channels present.\r
         // Hopefully, one day (when there are no more old JUCE plug-ins around), we can\r
         // commment out the next two lines.\r
-        if (effect->numInputs == 0)\r
+        if (effect->numInputChannels == 0)\r
             return false;\r
 \r
-        return (effect->dispatcher (effect, Vst2::effGetSpeakerArrangement, 0,\r
+        return (effect->dispatchFunction (effect, plugInOpcodeGetSpeakerArrangement, 0,\r
                                           reinterpret_cast<pointer_sized_int> (&inArr), &outArr, 0.0f) != 0);\r
     }\r
 \r
@@ -2334,56 +2305,56 @@ private:
                 if (currentPlayHead->getCurrentPosition (position))\r
                 {\r
 \r
-                    vstHostTime.samplePos           = (double) position.timeInSamples;\r
-                    vstHostTime.tempo                 = position.bpm;\r
-                    vstHostTime.timeSigNumerator   = position.timeSigNumerator;\r
-                    vstHostTime.timeSigDenominator = position.timeSigDenominator;\r
-                    vstHostTime.ppqPos          = position.ppqPosition;\r
-                    vstHostTime.barStartPos          = position.ppqPositionOfLastBarStart;\r
-                    vstHostTime.flags |= Vst2::kVstTempoValid\r
-                                           | Vst2::kVstTimeSigValid\r
-                                           | Vst2::kVstPpqPosValid\r
-                                           | Vst2::kVstBarsValid;\r
+                    vstHostTime.samplePosition           = (double) position.timeInSamples;\r
+                    vstHostTime.tempoBPM                 = position.bpm;\r
+                    vstHostTime.timeSignatureNumerator   = position.timeSigNumerator;\r
+                    vstHostTime.timeSignatureDenominator = position.timeSigDenominator;\r
+                    vstHostTime.musicalPosition          = position.ppqPosition;\r
+                    vstHostTime.lastBarPosition          = position.ppqPositionOfLastBarStart;\r
+                    vstHostTime.flags |= vstTimingInfoFlagTempoValid\r
+                                           | vstTimingInfoFlagTimeSignatureValid\r
+                                           | vstTimingInfoFlagMusicalPositionValid\r
+                                           | vstTimingInfoFlagLastBarPositionValid;\r
 \r
                     int32 newTransportFlags = 0;\r
-                    if (position.isPlaying)     newTransportFlags |= Vst2::kVstTransportPlaying;\r
-                    if (position.isRecording)   newTransportFlags |= Vst2::kVstTransportRecording;\r
+                    if (position.isPlaying)     newTransportFlags |= vstTimingInfoFlagCurrentlyPlaying;\r
+                    if (position.isRecording)   newTransportFlags |= vstTimingInfoFlagCurrentlyRecording;\r
 \r
-                    if (newTransportFlags != (vstHostTime.flags & (Vst2::kVstTransportPlaying\r
-                                                                   | Vst2::kVstTransportRecording)))\r
-                        vstHostTime.flags = (vstHostTime.flags & ~(Vst2::kVstTransportPlaying | Vst2::kVstTransportRecording)) | newTransportFlags | Vst2::kVstTransportChanged;\r
+                    if (newTransportFlags != (vstHostTime.flags & (vstTimingInfoFlagCurrentlyPlaying\r
+                                                                   | vstTimingInfoFlagCurrentlyRecording)))\r
+                        vstHostTime.flags = (vstHostTime.flags & ~(vstTimingInfoFlagCurrentlyPlaying | vstTimingInfoFlagCurrentlyRecording)) | newTransportFlags | vstTimingInfoFlagTransportChanged;\r
                     else\r
-                        vstHostTime.flags &= ~Vst2::kVstTransportChanged;\r
+                        vstHostTime.flags &= ~vstTimingInfoFlagTransportChanged;\r
 \r
                     switch (position.frameRate)\r
                     {\r
-                        case AudioPlayHead::fps24:       setHostTimeFrameRate (Vst2::kVstSmpte24fps, 24.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps25:       setHostTimeFrameRate (Vst2::kVstSmpte25fps, 25.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps30:       setHostTimeFrameRate (Vst2::kVstSmpte30fps, 30.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps60:       setHostTimeFrameRate (Vst2::kVstSmpte60fps, 60.0, position.timeInSeconds); break;\r
-\r
-                        case AudioPlayHead::fps23976:    setHostTimeFrameRateDrop (Vst2::kVstSmpte239fps,      24.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps2997:     setHostTimeFrameRateDrop (Vst2::kVstSmpte2997fps,     30.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps2997drop: setHostTimeFrameRateDrop (Vst2::kVstSmpte2997dfps, 30.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps30drop:   setHostTimeFrameRateDrop (Vst2::kVstSmpte30dfps,   30.0, position.timeInSeconds); break;\r
-                        case AudioPlayHead::fps60drop:   setHostTimeFrameRateDrop (Vst2::kVstSmpte599fps,      60.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps24:       setHostTimeFrameRate (vstSmpteRateFps24, 24.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps25:       setHostTimeFrameRate (vstSmpteRateFps25, 25.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps30:       setHostTimeFrameRate (vstSmpteRateFps30, 30.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps60:       setHostTimeFrameRate (vstSmpteRateFps60, 60.0, position.timeInSeconds); break;\r
+\r
+                        case AudioPlayHead::fps23976:    setHostTimeFrameRateDrop (vstSmpteRateFps239,      24.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps2997:     setHostTimeFrameRateDrop (vstSmpteRateFps2997,     30.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps2997drop: setHostTimeFrameRateDrop (vstSmpteRateFps2997drop, 30.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps30drop:   setHostTimeFrameRateDrop (vstSmpteRateFps30drop,   30.0, position.timeInSeconds); break;\r
+                        case AudioPlayHead::fps60drop:   setHostTimeFrameRateDrop (vstSmpteRateFps599,      60.0, position.timeInSeconds); break;\r
                         default: break;\r
                     }\r
 \r
                     if (position.isLooping)\r
                     {\r
-                        vstHostTime.cycleStartPos = position.ppqLoopStart;\r
-                        vstHostTime.cycleEndPos   = position.ppqLoopEnd;\r
-                        vstHostTime.flags |= (Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive);\r
+                        vstHostTime.loopStartPosition = position.ppqLoopStart;\r
+                        vstHostTime.loopEndPosition   = position.ppqLoopEnd;\r
+                        vstHostTime.flags |= (vstTimingInfoFlagLoopPositionValid | vstTimingInfoFlagLoopActive);\r
                     }\r
                     else\r
                     {\r
-                        vstHostTime.flags &= ~(Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive);\r
+                        vstHostTime.flags &= ~(vstTimingInfoFlagLoopPositionValid | vstTimingInfoFlagLoopActive);\r
                     }\r
                 }\r
             }\r
 \r
-            vstHostTime.nanoSeconds = getVSTHostTimeNanoseconds();\r
+            vstHostTime.systemTimeNanoseconds = getVSTHostTimeNanoseconds();\r
 \r
             if (wantsMidiMessages)\r
             {\r
@@ -2398,13 +2369,13 @@ private:
                     midiEventsToSend.addEvent (midiData, numBytesOfMidiData,\r
                                                jlimit (0, numSamples - 1, samplePosition));\r
 \r
-                vstEffect->dispatcher (vstEffect, Vst2::effProcessEvents, 0, 0, midiEventsToSend.events, 0);\r
+                vstEffect->dispatchFunction (vstEffect, plugInOpcodePreAudioProcessingEvents, 0, 0, midiEventsToSend.events, 0);\r
             }\r
 \r
             _clearfp();\r
 \r
             // always ensure that the buffer is at least as large as the maximum number of channels\r
-            auto maxChannels = jmax (vstEffect->numInputs, vstEffect->numOutputs);\r
+            auto maxChannels = jmax (vstEffect->numInputChannels, vstEffect->numOutputChannels);\r
             auto channels = channelBuffer.get();\r
 \r
             if (numChannels < maxChannels)\r
@@ -2443,35 +2414,35 @@ private:
     //==============================================================================\r
     inline void invokeProcessFunction (AudioBuffer<float>& buffer, int32 sampleFrames)\r
     {\r
-        if ((vstEffect->flags & Vst2::effFlagsCanReplacing) != 0)\r
+        if ((vstEffect->flags & vstEffectFlagInplaceAudio) != 0)\r
         {\r
-            vstEffect->processReplacing (vstEffect, buffer.getArrayOfWritePointers(),\r
+            vstEffect->processAudioInplaceFunction (vstEffect, buffer.getArrayOfWritePointers(),\r
                                                     buffer.getArrayOfWritePointers(), sampleFrames);\r
         }\r
         else\r
         {\r
-            outOfPlaceBuffer.setSize (vstEffect->numOutputs, sampleFrames);\r
+            outOfPlaceBuffer.setSize (vstEffect->numOutputChannels, sampleFrames);\r
             outOfPlaceBuffer.clear();\r
 \r
-            vstEffect->process (vstEffect, buffer.getArrayOfWritePointers(),\r
+            vstEffect->processAudioFunction (vstEffect, buffer.getArrayOfWritePointers(),\r
                                              outOfPlaceBuffer.getArrayOfWritePointers(), sampleFrames);\r
 \r
-            for (int i = vstEffect->numOutputs; --i >= 0;)\r
+            for (int i = vstEffect->numOutputChannels; --i >= 0;)\r
                 buffer.copyFrom (i, 0, outOfPlaceBuffer.getReadPointer (i), sampleFrames);\r
         }\r
     }\r
 \r
     inline void invokeProcessFunction (AudioBuffer<double>& buffer, int32 sampleFrames)\r
     {\r
-        vstEffect->processDoubleReplacing (vstEffect, buffer.getArrayOfWritePointers(),\r
+        vstEffect->processDoubleAudioInplaceFunction (vstEffect, buffer.getArrayOfWritePointers(),\r
                                                       buffer.getArrayOfWritePointers(), sampleFrames);\r
     }\r
 \r
     //==============================================================================\r
     void setHostTimeFrameRate (long frameRateIndex, double frameRate, double currentTime) noexcept\r
     {\r
-        vstHostTime.flags |= Vst2::kVstSmpteValid;\r
-        vstHostTime.smpteFrameRate   = (int32) frameRateIndex;\r
+        vstHostTime.flags |= vstTimingInfoFlagSmpteValid;\r
+        vstHostTime.smpteRate   = (int32) frameRateIndex;\r
         vstHostTime.smpteOffset = (int32) (currentTime * 80.0 * frameRate + 0.5);\r
     }\r
 \r
@@ -2497,12 +2468,12 @@ private:
         return false;\r
     }\r
 \r
-    String getTextForOpcode (const int index, const int opcode) const\r
+    String getTextForOpcode (const int index, const VstHostToPlugInOpcodes opcode) const\r
     {\r
         if (vstEffect == nullptr)\r
             return {};\r
 \r
-        jassert (index >= 0 && index < vstEffect->numParams);\r
+        jassert (index >= 0 && index < vstEffect->numParameters);\r
         char nm[256] = { 0 };\r
         dispatch (opcode, index, 0, nm, 0);\r
         return String::createStringFromData (nm, (int) sizeof (nm)).trim();\r
@@ -2516,7 +2487,7 @@ private:
         {\r
             {\r
                 char nm[256] = { 0 };\r
-                dispatch (Vst2::effGetProgramName, 0, 0, nm, 0);\r
+                dispatch (plugInOpcodeGetCurrentProgramName, 0, 0, nm, 0);\r
                 progName = String::createStringFromData (nm, (int) sizeof (nm)).trim();\r
             }\r
 \r
@@ -2560,7 +2531,7 @@ private:
             char nm[256] = { 0 };\r
 \r
             // only do this if the plugin can't use indexed names..\r
-            if (dispatch (Vst2::effGetProgramNameIndexed, 0, -1, nm, 0) == 0)\r
+            if (dispatch (plugInOpcodeGetProgramName, 0, -1, nm, 0) == 0)\r
             {\r
                 auto oldProgram = getCurrentProgram();\r
                 MemoryBlock oldSettings;\r
@@ -2578,7 +2549,7 @@ private:
         }\r
     }\r
 \r
-    void handleMidiFromPlugin (const Vst2::VstEvents* events)\r
+    void handleMidiFromPlugin (const VstEventBlock* events)\r
     {\r
         if (events != nullptr)\r
         {\r
@@ -2625,11 +2596,11 @@ private:
     }\r
 \r
     //==============================================================================\r
-    int getVersionNumber() const noexcept   { return vstEffect != nullptr ? vstEffect->version : 0; }\r
+    int getVersionNumber() const noexcept   { return vstEffect != nullptr ? vstEffect->plugInVersion : 0; }\r
 \r
     String getVersion() const\r
     {\r
-        auto v = (unsigned int) dispatch (Vst2::effGetVendorVersion, 0, 0, 0, 0);\r
+        auto v = (unsigned int) dispatch (plugInOpcodeGetManufacturerVersion, 0, 0, 0, 0);\r
 \r
         String s;\r
 \r
@@ -2685,15 +2656,15 @@ private:
     {\r
         switch (getVstCategory())\r
         {\r
-            case Vst2::kPlugCategEffect:       return "Effect";\r
-            case Vst2::kPlugCategSynth:        return "Synth";\r
-            case Vst2::kPlugCategAnalysis:     return "Analysis";\r
-            case Vst2::kPlugCategMastering:    return "Mastering";\r
-            case Vst2::kPlugCategSpacializer:  return "Spacial";\r
-            case Vst2::kPlugCategRoomFx:       return "Reverb";\r
-            case Vst2::kPlugSurroundFx:        return "Surround";\r
-            case Vst2::kPlugCategRestoration:  return "Restoration";\r
-            case Vst2::kPlugCategGenerator:    return "Tone generation";\r
+            case kPlugCategEffect:       return "Effect";\r
+            case kPlugCategSynth:        return "Synth";\r
+            case kPlugCategAnalysis:     return "Analysis";\r
+            case kPlugCategMastering:    return "Mastering";\r
+            case kPlugCategSpacializer:  return "Spacial";\r
+            case kPlugCategRoomFx:       return "Reverb";\r
+            case kPlugSurroundFx:        return "Surround";\r
+            case kPlugCategRestoration:  return "Restoration";\r
+            case kPlugCategGenerator:    return "Tone generation";\r
             default:                     break;\r
         }\r
 \r
@@ -2702,7 +2673,7 @@ private:
 \r
     void setPower (const bool on)\r
     {\r
-        dispatch (Vst2::effMainsChanged, 0, on ? 1 : 0, 0, 0);\r
+        dispatch (plugInOpcodeResumeSuspend, 0, on ? 1 : 0, 0, 0);\r
         isPowerOn = on;\r
     }\r
 \r
@@ -2735,7 +2706,6 @@ static Array<VSTPluginWindow*> activeVSTWindows;
 struct VSTPluginWindow   : public AudioProcessorEditor,\r
                           #if ! JUCE_MAC\r
                            private ComponentMovementWatcher,\r
-                           private ComponentPeer::ScaleFactorListener,\r
                           #endif\r
                            private Timer\r
 {\r
@@ -2790,64 +2760,10 @@ public:
 \r
         activeVSTWindows.removeFirstMatchingValue (this);\r
         plugin.editorBeingDeleted (this);\r
-\r
-       #if ! JUCE_MAC\r
-        for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
-            if (auto* peer = ComponentPeer::getPeer (i))\r
-                peer->removeScaleFactorListener (this);\r
-       #endif\r
     }\r
 \r
     //==============================================================================\r
-   #if JUCE_MAC\r
-    void paint (Graphics& g) override\r
-    {\r
-        g.fillAll (Colours::black);\r
-    }\r
-\r
-    void visibilityChanged() override\r
-    {\r
-        if (cocoaWrapper != nullptr)\r
-        {\r
-            if (isVisible())\r
-                openPluginWindow ((NSView*)cocoaWrapper->getView());\r
-            else\r
-                closePluginWindow();\r
-        }\r
-    }\r
-\r
-    void childBoundsChanged (Component*) override\r
-    {\r
-        if (cocoaWrapper != nullptr)\r
-        {\r
-            auto w = cocoaWrapper->getWidth();\r
-            auto h = cocoaWrapper->getHeight();\r
-\r
-            if (w != getWidth() || h != getHeight())\r
-                setSize (w, h);\r
-        }\r
-    }\r
-   #else\r
-    void paint (Graphics& g) override\r
-    {\r
-        if (isOpen)\r
-        {\r
-           #if JUCE_LINUX\r
-            if (pluginWindow != 0)\r
-            {\r
-                auto clip = g.getClipBounds();\r
-\r
-                XClearArea (display, pluginWindow, clip.getX(), clip.getY(),\r
-                            static_cast<unsigned int> (clip.getWidth()), static_cast<unsigned int> (clip.getHeight()), True);\r
-            }\r
-           #endif\r
-        }\r
-        else\r
-        {\r
-            g.fillAll (Colours::black);\r
-        }\r
-    }\r
-\r
+   #if ! JUCE_MAC\r
     void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override\r
     {\r
         if (recursiveResize)\r
@@ -2857,20 +2773,20 @@ public:
 \r
         if (topComp->getPeer() != nullptr)\r
         {\r
-            auto pos = (topComp->getLocalPoint (this, Point<int>()) * nativeScaleFactor).roundToInt();\r
+            auto pos = topComp->getLocalPoint (this, Point<int>());\r
 \r
             recursiveResize = true;\r
 \r
            #if JUCE_WINDOWS\r
             if (pluginHWND != 0)\r
-                MoveWindow (pluginHWND, pos.getX(), pos.getY(), roundToInt (getWidth() * nativeScaleFactor), roundToInt (getHeight() * nativeScaleFactor), TRUE);\r
+                MoveWindow (pluginHWND, pos.getX(), pos.getY(), getWidth(), getHeight(), TRUE);\r
            #elif JUCE_LINUX\r
             if (pluginWindow != 0)\r
             {\r
                 XMoveResizeWindow (display, pluginWindow,\r
                                    pos.getX(), pos.getY(),\r
-                                   static_cast<unsigned int> (roundToInt (getWidth()  * nativeScaleFactor)),\r
-                                   static_cast<unsigned int> (roundToInt (getHeight() * nativeScaleFactor)));\r
+                                   (unsigned int) getWidth(),\r
+                                   (unsigned int) getHeight());\r
 \r
                 XMapRaised (display, pluginWindow);\r
                 XFlush (display);\r
@@ -2888,9 +2804,6 @@ public:
         else if (! shouldAvoidDeletingWindow())\r
             closePluginWindow();\r
 \r
-        if (auto* peer = getTopLevelComponent()->getPeer())\r
-            setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor());\r
-\r
         componentMovedOrResized (true, true);\r
     }\r
 \r
@@ -2899,40 +2812,34 @@ public:
         closePluginWindow();\r
         openPluginWindow();\r
 \r
-        if (auto* peer = getTopLevelComponent()->getPeer())\r
-            peer->addScaleFactorListener (this);\r
-\r
+       #if JUCE_LINUX\r
         componentMovedOrResized (true, true);\r
+       #endif\r
     }\r
+   #endif\r
 \r
-    void nativeScaleFactorChanged (double newScaleFactor) override\r
+   #if JUCE_MAC\r
+    void visibilityChanged() override\r
     {\r
-        setScaleFactorAndDispatchMessage (newScaleFactor);\r
-\r
-       #if JUCE_WINDOWS\r
-        Vst2::ERect* rect = nullptr;\r
-        dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-\r
-        if (! isWindowSizeCorrectForPlugin (roundToInt ((rect->right - rect->left) / nativeScaleFactor),\r
-                                            roundToInt ((rect->bottom - rect->top) / nativeScaleFactor)))\r
-            return;\r
-       #endif\r
-\r
-        componentMovedOrResized (true, true);\r
+        if (cocoaWrapper != nullptr)\r
+        {\r
+            if (isVisible())\r
+                openPluginWindow ((NSView*) cocoaWrapper->getView());\r
+            else\r
+                closePluginWindow();\r
+        }\r
     }\r
 \r
-    void setScaleFactorAndDispatchMessage (double newScaleFactor)\r
+    void childBoundsChanged (Component*) override\r
     {\r
-        if (approximatelyEqual ((float) newScaleFactor, nativeScaleFactor))\r
-            return;\r
-\r
-        nativeScaleFactor = (float) newScaleFactor;\r
+        if (cocoaWrapper != nullptr)\r
+        {\r
+            auto w = cocoaWrapper->getWidth();\r
+            auto h = cocoaWrapper->getHeight();\r
 \r
-        if (pluginRespondsToDPIChanges)\r
-            dispatch (Vst2::effVendorSpecific,\r
-                      JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S'),\r
-                      JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's'),\r
-                      nullptr, nativeScaleFactor);\r
+            if (w != getWidth() || h != getHeight())\r
+                setSize (w, h);\r
+        }\r
     }\r
    #endif\r
 \r
@@ -2940,6 +2847,37 @@ public:
     bool keyStateChanged (bool) override                 { return pluginWantsKeys; }\r
     bool keyPressed (const juce::KeyPress&) override     { return pluginWantsKeys; }\r
 \r
+    //==============================================================================\r
+   #if JUCE_MAC\r
+    void paint (Graphics& g) override\r
+    {\r
+        g.fillAll (Colours::black);\r
+    }\r
+   #else\r
+    void paint (Graphics& g) override\r
+    {\r
+        if (isOpen)\r
+        {\r
+           #if JUCE_LINUX\r
+            if (pluginWindow != 0)\r
+            {\r
+                auto clip = g.getClipBounds();\r
+\r
+                XClearArea (display, pluginWindow,\r
+                            clip.getX(), clip.getY(),\r
+                            static_cast<unsigned int> (clip.getWidth()),\r
+                            static_cast<unsigned int> (clip.getHeight()),\r
+                            True);\r
+            }\r
+           #endif\r
+        }\r
+        else\r
+        {\r
+            g.fillAll (Colours::black);\r
+        }\r
+    }\r
+   #endif\r
+\r
     //==============================================================================\r
     void timerCallback() override\r
     {\r
@@ -2958,7 +2896,7 @@ public:
             if (! reentrantGuard)\r
             {\r
                 reentrantGuard = true;\r
-                plugin.dispatch (Vst2::effEditIdle, 0, 0, 0, 0);\r
+                plugin.dispatch (plugInOpcodeEditorIdle, 0, 0, 0, 0);\r
                 reentrantGuard = false;\r
             }\r
 \r
@@ -2990,29 +2928,37 @@ public:
         activeVSTWindows.add (this);\r
 \r
        #if JUCE_MAC\r
-        dispatch (Vst2::effEditTop, 0, 0, 0, 0);\r
+        dispatch (plugInOpcodeeffEditorTop, 0, 0, 0, 0);\r
        #endif\r
     }\r
 \r
+    void setScaleFactor (float newScale) override\r
+    {\r
+        scaleFactor = newScale;\r
+        dispatch (plugInOpcodeManufacturerSpecific, presonusVendorID,\r
+                  presonusSetContentScaleFactor, nullptr, newScale);\r
+    }\r
+\r
+    void sendScaleFactorIfNotUnity()\r
+    {\r
+        if (scaleFactor != 1.0f)\r
+            setScaleFactor (scaleFactor);\r
+    }\r
+\r
+    //==============================================================================\r
 private:\r
     VSTPluginInstance& plugin;\r
+    float scaleFactor = 1.0f;\r
     bool isOpen = false, recursiveResize = false;\r
     bool pluginWantsKeys = false, pluginRefusesToResize = false, alreadyInside = false;\r
 \r
-   #if ! JUCE_MAC\r
-    bool pluginRespondsToDPIChanges = false;\r
-   #endif\r
-\r
-   #if ! JUCE_MAC\r
-    float nativeScaleFactor = 1.0f;\r
-    #if JUCE_WINDOWS\r
-     HWND pluginHWND = {};\r
-     void* originalWndProc = {};\r
-     int sizeCheckCount = 0;\r
-    #elif JUCE_LINUX\r
-     ::Display* display;\r
-     Window pluginWindow;\r
-    #endif\r
+   #if JUCE_WINDOWS\r
+    HWND pluginHWND = {};\r
+    void* originalWndProc = {};\r
+    int sizeCheckCount = 0;\r
+   #elif JUCE_LINUX\r
+    ::Display* display;\r
+    Window pluginWindow;\r
    #endif\r
 \r
     // This is a workaround for old Mackie plugins that crash if their\r
@@ -3031,7 +2977,7 @@ private:
     }\r
 \r
     //==============================================================================\r
-   #if JUCE_MAC\r
+#if JUCE_MAC\r
     void openPluginWindow (void* parentWindow)\r
     {\r
         if (isOpen || parentWindow == 0)\r
@@ -3039,24 +2985,25 @@ private:
 \r
         isOpen = true;\r
 \r
-        Vst2::ERect* rect = nullptr;\r
-        dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-        dispatch (Vst2::effEditOpen, 0, 0, parentWindow, 0);\r
+        VstEditorBounds* rect = nullptr;\r
+        dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+        dispatch (plugInOpcodeOpenEditor, 0, 0, parentWindow, 0);\r
+        sendScaleFactorIfNotUnity();\r
 \r
         // do this before and after like in the steinberg example\r
-        dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-        dispatch (Vst2::effGetProgram, 0, 0, 0, 0); // also in steinberg code\r
+        dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+        dispatch (plugInOpcodeGetCurrentProgram, 0, 0, 0, 0); // also in steinberg code\r
 \r
         // Install keyboard hooks\r
-        pluginWantsKeys = (dispatch (Vst2::effKeysRequired, 0, 0, 0, 0) == 0);\r
+        pluginWantsKeys = (dispatch (plugInOpcodeKeyboardFocusRequired, 0, 0, 0, 0) == 0);\r
 \r
         // double-check it's not too tiny\r
         int w = 250, h = 150;\r
 \r
         if (rect != nullptr)\r
         {\r
-            w = rect->right - rect->left;\r
-            h = rect->bottom - rect->top;\r
+            w = rect->rightmost - rect->leftmost;\r
+            h = rect->lower - rect->upper;\r
 \r
             if (w == 0 || h == 0)\r
             {\r
@@ -3073,7 +3020,8 @@ private:
         startTimer (18 + juce::Random::getSystemRandom().nextInt (5));\r
         repaint();\r
     }\r
-   #else\r
+\r
+#else\r
     void openPluginWindow()\r
     {\r
         if (isOpen || getWindowHandle() == 0)\r
@@ -3082,40 +3030,17 @@ private:
         JUCE_VST_LOG ("Opening VST UI: " + plugin.getName());\r
         isOpen = true;\r
 \r
-        pluginRespondsToDPIChanges = plugin.pluginCanDo ("supportsViewDpiScaling") > 0;\r
-\r
-        if (pluginRespondsToDPIChanges)\r
-            if (auto* peer = getTopLevelComponent()->getPeer())\r
-                setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor());\r
-\r
-       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        std::unique_ptr<ScopedDPIAwarenessDisabler> dpiDisabler;\r
-\r
-        if (! pluginRespondsToDPIChanges)\r
-            dpiDisabler.reset (new ScopedDPIAwarenessDisabler());\r
-       #endif\r
-\r
-        Vst2::ERect* rect = nullptr;\r
-        dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-\r
-       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        // some plug-ins are fussy about this\r
-        dpiDisabler.reset (nullptr);\r
-       #endif\r
-\r
-        dispatch (Vst2::effEditOpen, 0, 0, getWindowHandle(), 0);\r
-\r
-       #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (! pluginRespondsToDPIChanges)\r
-            dpiDisabler.reset (new ScopedDPIAwarenessDisabler());\r
-       #endif\r
+        VstEditorBounds* rect = nullptr;\r
+        dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+        dispatch (plugInOpcodeOpenEditor, 0, 0, getWindowHandle(), 0);\r
+        sendScaleFactorIfNotUnity();\r
 \r
         // do this before and after like in the steinberg example\r
-        dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-        dispatch (Vst2::effGetProgram, 0, 0, 0, 0); // also in steinberg code\r
+        dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+        dispatch (plugInOpcodeGetCurrentProgram, 0, 0, 0, 0); // also in steinberg code\r
 \r
         // Install keyboard hooks\r
-        pluginWantsKeys = (dispatch (Vst2::effKeysRequired, 0, 0, 0, 0) == 0);\r
+        pluginWantsKeys = (dispatch (plugInOpcodeKeyboardFocusRequired, 0, 0, 0, 0) == 0);\r
 \r
        #if JUCE_WINDOWS\r
         originalWndProc = 0;\r
@@ -3139,28 +3064,24 @@ private:
 \r
         #pragma warning (pop)\r
 \r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        dpiDisabler.reset (nullptr);\r
-       #endif\r
-\r
         RECT r;\r
         GetWindowRect (pluginHWND, &r);\r
-        auto w = (int) (r.right - r.left);\r
-        auto h = (int) (r.bottom - r.top);\r
+        int w = r.right - r.left;\r
+        int h = r.bottom - r.top;\r
 \r
         if (rect != nullptr)\r
         {\r
-            auto rw = rect->right - rect->left;\r
-            auto rh = rect->bottom - rect->top;\r
+            const int rw = rect->rightmost - rect->leftmost;\r
+            const int rh = rect->lower - rect->upper;\r
 \r
-            if ((rw > 50 && rh > 50 && rw < 2000 && rh < 2000 && (! isWithin (w, rw, 2) || ! isWithin (h, rh, 2)))\r
+            if ((rw > 50 && rh > 50 && rw < 2000 && rh < 2000 && rw != w && rh != h)\r
                 || ((w == 0 && rw > 0) || (h == 0 && rh > 0)))\r
             {\r
                 // very dodgy logic to decide which size is right.\r
                 if (std::abs (rw - w) > 350 || std::abs (rh - h) > 350)\r
                 {\r
                     SetWindowPos (pluginHWND, 0,\r
-                                  0, 0, roundToInt (rw * nativeScaleFactor), roundToInt (rh * nativeScaleFactor),\r
+                                  0, 0, rw, rh,\r
                                   SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);\r
 \r
                     GetWindowRect (pluginHWND, &r);\r
@@ -3175,6 +3096,7 @@ private:
                 }\r
             }\r
         }\r
+\r
        #elif JUCE_LINUX\r
         updatePluginWindowHandle();\r
 \r
@@ -3182,8 +3104,8 @@ private:
 \r
         if (rect != nullptr)\r
         {\r
-            w = rect->right - rect->left;\r
-            h = rect->bottom - rect->top;\r
+            w = rect->rightmost - rect->leftmost;\r
+            h = rect->lower - rect->upper;\r
 \r
             if (w == 0 || h == 0)\r
             {\r
@@ -3196,9 +3118,6 @@ private:
             XMapRaised (display, pluginWindow);\r
        #endif\r
 \r
-        w = roundToInt (w / nativeScaleFactor);\r
-        h = roundToInt (h / nativeScaleFactor);\r
-\r
         // double-check it's not too tiny\r
         w = jmax (w, 32);\r
         h = jmax (h, 32);\r
@@ -3212,7 +3131,7 @@ private:
         startTimer (18 + juce::Random::getSystemRandom().nextInt (5));\r
         repaint();\r
     }\r
-   #endif\r
+#endif\r
 \r
     //==============================================================================\r
     void closePluginWindow()\r
@@ -3221,11 +3140,11 @@ private:
         {\r
             // You shouldn't end up hitting this assertion unless the host is trying to do GUI\r
             // cleanup on a non-GUI thread.. If it does that, bad things could happen in here..\r
-            JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+            jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
             JUCE_VST_LOG ("Closing VST UI: " + plugin.getName());\r
             isOpen = false;\r
-            dispatch (Vst2::effEditClose, 0, 0, 0, 0);\r
+            dispatch (plugInOpcodeCloseEditor, 0, 0, 0, 0);\r
             stopTimer();\r
 \r
            #if JUCE_WINDOWS\r
@@ -3251,59 +3170,20 @@ private:
 \r
     //==============================================================================\r
    #if JUCE_WINDOWS\r
-    bool willCauseRecursiveResize (int w, int h)\r
-    {\r
-        auto newScreenBounds = Rectangle<int> (w, h).withPosition (getScreenPosition());\r
-\r
-        return Desktop::getInstance().getDisplays().findDisplayForRect (newScreenBounds).scale != nativeScaleFactor;\r
-    }\r
-\r
-    bool isWindowSizeCorrectForPlugin (int w, int h)\r
-    {\r
-        if (! isShowing() || pluginRefusesToResize)\r
-            return true;\r
-\r
-        return (isWithin (w, getWidth(), 5) && isWithin (h, getHeight(), 5));\r
-    }\r
-\r
     void checkPluginWindowSize()\r
     {\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (! pluginRespondsToDPIChanges)\r
-        {\r
-            Vst2::ERect* rect = nullptr;\r
-            dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-\r
-            auto w = roundToInt ((rect->right - rect->left) / nativeScaleFactor);\r
-            auto h = roundToInt ((rect->bottom - rect->top) / nativeScaleFactor);\r
-\r
-            if (! isWindowSizeCorrectForPlugin (w, h))\r
-            {\r
-                // If plug-in isn't DPI aware then we need to resize our window, but this may cause a recursive resize\r
-                // so add a check\r
-                if (! willCauseRecursiveResize (w, h))\r
-                    setSize (w, h);\r
+        RECT r;\r
+        GetWindowRect (pluginHWND, &r);\r
+        auto w = r.right - r.left;\r
+        auto h = r.bottom - r.top;\r
 \r
-                sizeCheckCount = 0;\r
-            }\r
-        }\r
-       #else\r
+        if (isShowing() && w > 0 && h > 0\r
+             && (w != getWidth() || h != getHeight())\r
+             && ! pluginRefusesToResize)\r
         {\r
-            RECT r;\r
-            GetWindowRect (pluginHWND, &r);\r
-\r
-            auto w = r.right - r.left;\r
-            auto h = r.bottom - r.top;\r
-\r
-            if (isShowing() && w > 0 && h > 0\r
-                && (w != getWidth() || h != getHeight())\r
-                && !pluginRefusesToResize)\r
-            {\r
-                setSize (w, h);\r
-                sizeCheckCount = 0;\r
-            }\r
+            setSize (w, h);\r
+            sizeCheckCount = 0;\r
         }\r
-       #endif\r
     }\r
 \r
     // hooks to get keyboard events from VST windows..\r
@@ -3345,7 +3225,7 @@ private:
    #endif\r
 \r
     //==============================================================================\r
-  #if JUCE_MAC\r
+#if JUCE_MAC\r
    #if JUCE_SUPPORT_CARBON\r
     struct CarbonWrapperComponent   : public CarbonViewWrapperComponent\r
     {\r
@@ -3371,17 +3251,17 @@ private:
             if (owner.isOpen)\r
             {\r
                 owner.isOpen = false;\r
-                owner.dispatch (Vst2::effEditClose, 0, 0, 0, 0);\r
-                owner.dispatch (Vst2::effEditSleep, 0, 0, 0, 0);\r
+                owner.dispatch (plugInOpcodeCloseEditor, 0, 0, 0, 0);\r
+                owner.dispatch (plugInOpcodeSleepEditor, 0, 0, 0, 0);\r
             }\r
         }\r
 \r
         bool getEmbeddedViewSize (int& w, int& h) override\r
         {\r
-            Vst2::ERect* rect = nullptr;\r
-            owner.dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-            w = rect->right - rect->left;\r
-            h = rect->bottom - rect->top;\r
+            VstEditorBounds* rect = nullptr;\r
+            owner.dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+            w = rect->rightmost - rect->leftmost;\r
+            h = rect->lower - rect->upper;\r
             return true;\r
         }\r
 \r
@@ -3391,7 +3271,7 @@ private:
             {\r
                 alreadyInside = true;\r
                 getTopLevelComponent()->toFront (true);\r
-                owner.dispatch (Vst2::effEditMouse, x, y, 0, 0);\r
+                owner.dispatch (plugInOpcodeGetMouse, x, y, 0, 0);\r
                 alreadyInside = false;\r
             }\r
             else\r
@@ -3405,13 +3285,13 @@ private:
             if (auto* peer = getPeer())\r
             {\r
                 auto pos = peer->globalToLocal (getScreenPosition());\r
-                Vst2::ERect r;\r
-                r.left   = (int16) pos.getX();\r
-                r.top    = (int16) pos.getY();\r
-                r.right  = (int16) (r.left + getWidth());\r
-                r.bottom = (int16) (r.top + getHeight());\r
+                VstEditorBounds r;\r
+                r.leftmost  = (int16) pos.getX();\r
+                r.upper     = (int16) pos.getY();\r
+                r.rightmost = (int16) (r.leftmost + getWidth());\r
+                r.lower     = (int16) (r.upper + getHeight());\r
 \r
-                owner.dispatch (Vst2::effEditDraw, 0, 0, &r, 0);\r
+                owner.dispatch (plugInOpcodeDrawEditor, 0, 0, &r, 0);\r
             }\r
         }\r
 \r
@@ -3438,7 +3318,7 @@ private:
         if (cocoaWrapper != nullptr)\r
             cocoaWrapper->setSize (getWidth(), getHeight());\r
     }\r
-  #endif\r
+#endif\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow)\r
 };\r
@@ -3460,10 +3340,10 @@ AudioProcessorEditor* VSTPluginInstance::createEditor()
 \r
 //==============================================================================\r
 // entry point for all callbacks from the plugin\r
-static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect* effect, int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt)\r
+static pointer_sized_int VSTINTERFACECALL audioMaster (VstEffectInterface* effect, int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt)\r
 {\r
     if (effect != nullptr)\r
-        if (auto* instance = (VSTPluginInstance*) (effect->resvd2))\r
+        if (auto* instance = (VSTPluginInstance*) (effect->hostSpace2))\r
             return instance->handleCallback (opcode, index, value, ptr, opt);\r
 \r
     return VSTPluginInstance::handleGeneralCallback (opcode, index, value, ptr, opt);\r
@@ -3509,12 +3389,12 @@ void VSTPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& result
     if (instance == nullptr)\r
         return;\r
 \r
-    if (instance->getVstCategory() != Vst2::kPlugCategShell)\r
+    if (instance->getVstCategory() != kPlugCategShell)\r
     {\r
         // Normal plugin...\r
         results.add (new PluginDescription (desc));\r
 \r
-        instance->dispatch (Vst2::effOpen, 0, 0, 0, 0);\r
+        instance->dispatch (plugInOpcodeOpen, 0, 0, 0, 0);\r
     }\r
     else\r
     {\r
@@ -3522,7 +3402,7 @@ void VSTPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& result
         for (;;)\r
         {\r
             char shellEffectName [256] = { 0 };\r
-            auto uid = (int) instance->dispatch (Vst2::effShellGetNextPlugin, 0, 0, shellEffectName, 0);\r
+            auto uid = (int) instance->dispatch (plugInOpcodeNextPlugInUniqueID, 0, 0, shellEffectName, 0);\r
 \r
             if (uid == 0)\r
                 break;\r
@@ -3548,8 +3428,10 @@ void VSTPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& result
 }\r
 \r
 void VSTPluginFormat::createPluginInstance (const PluginDescription& desc,\r
-                                            double sampleRate, int blockSize,\r
-                                            void* userData, PluginCreationCallback callback)\r
+                                            double sampleRate,\r
+                                            int blockSize,\r
+                                            void* userData,\r
+                                            void (*callback) (void*, AudioPluginInstance*, const String&))\r
 {\r
     std::unique_ptr<VSTPluginInstance> result;\r
 \r
@@ -3748,8 +3630,8 @@ void VSTPluginFormat::setExtraFunctions (AudioPluginInstance* plugin, ExtraFunct
 \r
 AudioPluginInstance* VSTPluginFormat::getPluginInstanceFromVstEffectInterface (void* aEffect)\r
 {\r
-    if (auto* vstAEffect = reinterpret_cast<Vst2::AEffect*> (aEffect))\r
-        if (auto* instanceVST = reinterpret_cast<VSTPluginInstance*> (vstAEffect->resvd2))\r
+    if (auto* vstAEffect = reinterpret_cast<VstEffectInterface*> (aEffect))\r
+        if (auto* instanceVST = reinterpret_cast<VSTPluginInstance*> (vstAEffect->hostSpace2))\r
             return dynamic_cast<AudioPluginInstance*> (instanceVST);\r
 \r
     return nullptr;\r
index 2c6684c869cc8b860156849228dc98e58dfcf12e..5298dc835d79b224424b242dc53d8a99cb8df91e 100644 (file)
@@ -118,7 +118,8 @@ public:
 private:\r
     //==============================================================================\r
     void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
-                               int initialBufferSize, void* userData, PluginCreationCallback) override;\r
+                               int initialBufferSize, void* userData,\r
+                               void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
 \r
     bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
 \r
index 06e56ee0f205b3390da527d183bba671938f499e..8c6f416a7bd6a81b81637804f4808ef73290a827 100644 (file)
@@ -62,7 +62,6 @@
 \r
 #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS)\r
  #include <AudioUnit/AudioUnit.h>\r
- #include <map>\r
 #endif\r
 \r
 //==============================================================================\r
@@ -93,6 +92,8 @@ static inline bool arrayContainsPlugin (const OwnedArray<PluginDescription>& lis
 struct AutoResizingNSViewComponent  : public ViewComponentBaseClass,\r
                                       private AsyncUpdater\r
 {\r
+    AutoResizingNSViewComponent() : recursive (false) {}\r
+\r
     void childBoundsChanged (Component*) override\r
     {\r
         if (recursive)\r
@@ -103,13 +104,13 @@ struct AutoResizingNSViewComponent  : public ViewComponentBaseClass,
         {\r
             recursive = true;\r
             resizeToFitView();\r
-            recursive = false;\r
+            recursive = true;\r
         }\r
     }\r
 \r
-    void handleAsyncUpdate() override  { resizeToFitView(); }\r
+    void handleAsyncUpdate() override               { resizeToFitView(); }\r
 \r
-    bool recursive = false;\r
+    bool recursive;\r
 };\r
 \r
 //==============================================================================\r
@@ -168,5 +169,4 @@ struct AutoResizingNSViewComponentWithParent  : public AutoResizingNSViewCompone
 #include "scanning/juce_PluginDirectoryScanner.cpp"\r
 #include "scanning/juce_PluginListComponent.cpp"\r
 #include "utilities/juce_AudioProcessorParameters.cpp"\r
-#include "processors/juce_AudioProcessorParameterGroup.cpp"\r
 #include "utilities/juce_AudioProcessorValueTreeState.cpp"\r
index 48ad4cae642825af9f8fa7b32b2c37085688b98b..59ada712a14677597a27656a2fda01253c128865 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_audio_processors\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE audio processor classes\r
   description:      Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors.\r
   website:          http://www.juce.com/juce\r
@@ -58,7 +58,7 @@
 \r
 //==============================================================================\r
 /** Config: JUCE_PLUGINHOST_VST\r
-    Enables the VST audio plugin hosting classes. You will need to have the VST2 SDK files in your header search paths. You can obtain the VST2 SDK files from on older version of the VST3 SDK.\r
+    Enables the VST audio plugin hosting classes.\r
 \r
     @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3, JUCE_PLUGINHOST_LADSPA\r
 */\r
@@ -67,7 +67,8 @@
 #endif\r
 \r
 /** Config: JUCE_PLUGINHOST_VST3\r
-    Enables the VST3 audio plugin hosting classes.\r
+    Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be\r
+    installed on your machine.\r
 \r
     @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_LADSPA\r
 */\r
 #include "processors/juce_AudioProcessorEditor.h"\r
 #include "processors/juce_AudioProcessorListener.h"\r
 #include "processors/juce_AudioProcessorParameter.h"\r
-#include "processors/juce_AudioProcessorParameterGroup.h"\r
 #include "processors/juce_AudioProcessor.h"\r
 #include "processors/juce_PluginDescription.h"\r
 #include "processors/juce_AudioPluginInstance.h"\r
 #include "scanning/juce_PluginDirectoryScanner.h"\r
 #include "scanning/juce_PluginListComponent.h"\r
 #include "utilities/juce_AudioProcessorParameterWithID.h"\r
-#include "utilities/juce_RangedAudioParameter.h"\r
 #include "utilities/juce_AudioParameterFloat.h"\r
 #include "utilities/juce_AudioParameterInt.h"\r
 #include "utilities/juce_AudioParameterBool.h"\r
index ca03292eb8e2c382fa657f730c19c05335032521..a228766bd57f5507360e00cc71399acc36978d50 100644 (file)
@@ -41,7 +41,7 @@ String AudioPluginInstance::getParameterID (int parameterIndex)
     // Currently there is no corresponding method available in the\r
     // AudioProcessorParameter class, and the previous behaviour of JUCE's\r
     // plug-in hosting code simply returns a string version of the index; to\r
-    // maintain backwards compatibility you should perform the operation below\r
+    // maintain backwards compatibilty you should perform the operation below\r
     // this comment. However the caveat is that for plug-ins which change their\r
     // number of parameters dynamically at runtime you cannot rely upon the\r
     // returned parameter ID mapping to the correct parameter. A comprehensive\r
@@ -175,7 +175,7 @@ bool AudioPluginInstance::isMetaParameter (int parameterIndex) const
     if (auto* param = getParameters()[parameterIndex])\r
         return param->isMetaParameter();\r
 \r
-    return false;\r
+        return false;\r
 }\r
 \r
 AudioProcessorParameter::Category AudioPluginInstance::getParameterCategory (int parameterIndex) const\r
index 48a1bbd4eeeb536fd3b272802db967f6b187f206..c0f2bd12a52b3f9947540ffa933c62d152e23fd4 100644 (file)
@@ -60,11 +60,6 @@ AudioProcessor::~AudioProcessor()
     // or more parameters without having made a corresponding call to endParameterChangeGesture...\r
     jassert (changingParams.countNumberOfSetBits() == 0);\r
    #endif\r
-\r
-    // The parameters are owned by an AudioProcessorParameterGroup, but we need\r
-    // to keep the managedParameters array populated to maintain backwards\r
-    // compatibility.\r
-    managedParameters.clearQuick (false);\r
 }\r
 \r
 //==============================================================================\r
@@ -696,36 +691,17 @@ AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const noexc
     return p;\r
 }\r
 \r
-void AudioProcessor::addParameterInternal (AudioProcessorParameter* param)\r
+void AudioProcessor::addParameter (AudioProcessorParameter* p)\r
 {\r
-    param->processor = this;\r
-    param->parameterIndex = managedParameters.size();\r
-    managedParameters.add (param);\r
+    p->processor = this;\r
+    p->parameterIndex = managedParameters.size();\r
+    managedParameters.add (p);\r
 \r
    #ifdef JUCE_DEBUG\r
     shouldCheckParamsForDupeIDs = true;\r
    #endif\r
 }\r
 \r
-void AudioProcessor::addParameter (AudioProcessorParameter* param)\r
-{\r
-    addParameterInternal (param);\r
-    parameterTree.addChild (std::unique_ptr<AudioProcessorParameter> (param));\r
-}\r
-\r
-void AudioProcessor::addParameterGroup (std::unique_ptr<AudioProcessorParameterGroup> group)\r
-{\r
-    for (auto* param : group->getParameters (true))\r
-        addParameterInternal (param);\r
-\r
-    parameterTree.addChild (std::move (group));\r
-}\r
-\r
-const AudioProcessorParameterGroup& AudioProcessor::getParameterTree()\r
-{\r
-    return parameterTree;\r
-}\r
-\r
 #ifdef JUCE_DEBUG\r
 void AudioProcessor::checkForDupedParamIDs()\r
 {\r
@@ -1398,23 +1374,6 @@ int32 AudioProcessor::getAAXPluginIDForMainBusConfig (const AudioChannelSet& mai
     return (idForAudioSuite ? 0x6a796161 /* 'jyaa' */ : 0x6a636161 /* 'jcaa' */) + uniqueFormatId;\r
 }\r
 \r
-//==============================================================================\r
-const char* AudioProcessor::getWrapperTypeDescription (AudioProcessor::WrapperType type) noexcept\r
-{\r
-    switch (type)\r
-    {\r
-        case AudioProcessor::wrapperType_Undefined:     return "Undefined";\r
-        case AudioProcessor::wrapperType_VST:           return "VST";\r
-        case AudioProcessor::wrapperType_VST3:          return "VST3";\r
-        case AudioProcessor::wrapperType_AudioUnit:     return "AU";\r
-        case AudioProcessor::wrapperType_AudioUnitv3:   return "AUv3";\r
-        case AudioProcessor::wrapperType_RTAS:          return "RTAS";\r
-        case AudioProcessor::wrapperType_AAX:           return "AAX";\r
-        case AudioProcessor::wrapperType_Standalone:    return "Standalone";\r
-        default:                                        jassertfalse; return {};\r
-    }\r
-}\r
-\r
 //==============================================================================\r
 void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {}\r
 void AudioProcessorListener::audioProcessorParameterChangeGestureEnd   (AudioProcessor*, int) {}\r
index 4c0366b468e0e600dab3a46aff1c78ccf470fda3..201f3b363644a32bdca3947fb355436f921cb445 100644 (file)
@@ -412,8 +412,8 @@ public:
             @param currentLayout If non-null, pretend that the current layout of the AudioProcessor is\r
                                  currentLayout. On exit, currentLayout will be modified to\r
                                  to represent the buses layouts of the AudioProcessor as if the layout\r
-                                 of the receiver had been successfully changed. This is useful as changing\r
-                                 the layout of the receiver may change the bus layout of other buses.\r
+                                 of the reciever had been succesfully changed. This is useful as changing\r
+                                 the layout of the reciever may change the bus layout of other buses.\r
 \r
             @see AudioChannelSet\r
         */\r
@@ -898,7 +898,7 @@ public:
     /** Returns the parameter that controls the AudioProcessor's bypass state.\r
 \r
         If this method returns a nullptr then you can still control the bypass by\r
-        calling processBlockBypassed instead of processBlock. On the other hand,\r
+        calling processBlockBypassed instaed of processBlock. On the other hand,\r
         if this method returns a non-null value, you should never call\r
         processBlockBypassed but use the returned parameter to conrol the bypass\r
         state instead.\r
@@ -1205,25 +1205,12 @@ public:
     void updateHostDisplay();\r
 \r
     //==============================================================================\r
-    /** Adds a parameter to the AudioProcessor.\r
-\r
-        The parameter object will be managed and deleted automatically by the\r
-        AudioProcessor when no longer needed.\r
+    /** Adds a parameter to the list.\r
+        The parameter object will be managed and deleted automatically by the list\r
+        when no longer needed.\r
     */\r
     void addParameter (AudioProcessorParameter*);\r
 \r
-    /** Adds a group of parameters to the AudioProcessor.\r
-\r
-        All the parameter objects contained within the group will be managed and\r
-        deleted automatically by the AudioProcessor when no longer needed.\r
-\r
-        @see addParameter\r
-     */\r
-    void addParameterGroup (std::unique_ptr<AudioProcessorParameterGroup>);\r
-\r
-    /** Returns the group of parameters managed by this AudioProcessor. */\r
-    const AudioProcessorParameterGroup& getParameterTree();\r
-\r
     /** Returns the current list of parameters. */\r
     const OwnedArray<AudioProcessorParameter>& getParameters() const noexcept;\r
 \r
@@ -1351,34 +1338,6 @@ public:
                                                   const AudioChannelSet& mainOutputLayout,\r
                                                   bool idForAudioSuite) const;\r
 \r
-    //==============================================================================\r
-    /** Some plug-ins support sharing response curve data with the host so that it can\r
-        display this curve on a console or in the mixer panel. For example, ProTools\r
-        allows you to see the total EQ curve of a track. It does this by interrogating\r
-        each plug-in for their internal EQ curve. */\r
-    struct CurveData\r
-    {\r
-        enum class Type  : int\r
-        {\r
-            EQ,             // an EQ curve - input is in Hz, output is in dB\r
-            Dynamics,       // a dynamics curve - input and output is in dB\r
-            GainReduction,  // a gain reduction curve - input and output is in dB\r
-\r
-            Unknown = -1\r
-        };\r
-\r
-        std::function<float (float)> curve;    // a function which represents your curve (such as an eq)\r
-        Range<float> xRange, yRange;           // the data range of your curve\r
-\r
-        // For some curve types, your plug-in may already measure the current input and output values.\r
-        // An host can use to indicate where on the curve the current signal is (for example\r
-        // by putting a dot on the curve). Simply leave these strings empty if you do not want to\r
-        // support this.\r
-        String xMeterID, yMeterID;\r
-    };\r
-\r
-    virtual CurveData getResponseCurve (CurveData::Type /*curveType*/) const      { return {}; }\r
-\r
     //==============================================================================\r
     /** Not for public use - this is called before deleting an editor component. */\r
     void editorBeingDeleted (AudioProcessorEditor*) noexcept;\r
@@ -1393,8 +1352,7 @@ public:
         wrapperType_AudioUnitv3,\r
         wrapperType_RTAS,\r
         wrapperType_AAX,\r
-        wrapperType_Standalone,\r
-        wrapperType_Unity\r
+        wrapperType_Standalone\r
     };\r
 \r
     /** When loaded by a plugin wrapper, this flag will be set to indicate the type\r
@@ -1402,10 +1360,6 @@ public:
     */\r
     WrapperType wrapperType;\r
 \r
-    /** Returns a textual description of a WrapperType value */\r
-    static const char* getWrapperTypeDescription (AudioProcessor::WrapperType) noexcept;\r
-\r
-\r
     /** A struct containing information about the DAW track inside which your\r
         AudioProcessor is loaded. */\r
     struct TrackProperties\r
@@ -1572,7 +1526,7 @@ protected:
 \r
         When adding a bus, isAddingBuses will be true and the plug-in is\r
         expected to fill out outNewBusProperties with the properties of the\r
-        bus which will be created just after the successful return of this callback.\r
+        bus which will be created just after the succesful return of this callback.\r
 \r
         Implementations of AudioProcessor will rarely need to override this\r
         method. Only override this method if your processor supports adding\r
@@ -1597,23 +1551,22 @@ protected:
     void sendParamChangeMessageToListeners (int parameterIndex, float newValue);\r
 \r
 private:\r
-    //==============================================================================\r
-    void addParameterInternal (AudioProcessorParameter*);\r
-\r
     //==============================================================================\r
     struct InOutChannelPair\r
     {\r
-        InOutChannelPair() = default;\r
+        int16 inChannels = 0, outChannels = 0;\r
 \r
+        InOutChannelPair() noexcept {}\r
+        InOutChannelPair (const InOutChannelPair& o) noexcept  : inChannels (o.inChannels), outChannels (o.outChannels) {}\r
         InOutChannelPair (int16 inCh, int16 outCh) noexcept    : inChannels (inCh), outChannels (outCh) {}\r
         InOutChannelPair (const int16 (&config)[2]) noexcept   : inChannels (config[0]), outChannels (config[1]) {}\r
 \r
+        InOutChannelPair& operator= (const InOutChannelPair& o) noexcept    { inChannels = o.inChannels; outChannels = o.outChannels; return *this; }\r
+\r
         bool operator== (const InOutChannelPair& other) const noexcept\r
         {\r
             return other.inChannels == inChannels && other.outChannels == outChannels;\r
         }\r
-\r
-        int16 inChannels = 0, outChannels = 0;\r
     };\r
 \r
     template <int numLayouts>\r
@@ -1664,8 +1617,6 @@ private:
     OwnedArray<AudioProcessorParameter> managedParameters;\r
     AudioProcessorParameter* getParamChecked (int) const noexcept;\r
 \r
-    AudioProcessorParameterGroup parameterTree { {}, {}, {} };\r
-\r
    #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING\r
     BigInteger changingParams;\r
    #endif\r
@@ -1689,7 +1640,6 @@ private:
 \r
     friend class JuceVST3EditController;\r
     friend class JuceVST3Component;\r
-    friend class VST3PluginInstance;\r
     friend class AudioUnitPluginInstance;\r
     friend class LADSPAPluginInstance;\r
 \r
index 8e44bb29e9055db54f3cfecc6de350b37c36c279..22d82baf804bb6027a89ba744a976575819c9829 100644 (file)
@@ -88,13 +88,18 @@ void AudioProcessorEditor::setResizable (const bool shouldBeResizable, const boo
     {\r
         resizable = shouldBeResizable;\r
 \r
-        if (! resizable && constrainer == &defaultConstrainer)\r
+        if (! resizable)\r
         {\r
-            auto width = getWidth();\r
-            auto height = getHeight();\r
+            setConstrainer (&defaultConstrainer);\r
 \r
-            if (width > 0 && height > 0)\r
-                defaultConstrainer.setSizeLimits (width, height, width, height);\r
+            if (auto w = getWidth())\r
+            {\r
+                if (auto h = getHeight())\r
+                {\r
+                    defaultConstrainer.setSizeLimits (w, h, w, h);\r
+                    resized();\r
+                }\r
+            }\r
         }\r
     }\r
 \r
@@ -141,10 +146,7 @@ void AudioProcessorEditor::setConstrainer (ComponentBoundsConstrainer* newConstr
 {\r
     if (constrainer != newConstrainer)\r
     {\r
-        if (newConstrainer != nullptr)\r
-            resizable = (newConstrainer->getMinimumWidth()  != newConstrainer->getMaximumWidth()\r
-                      || newConstrainer->getMinimumHeight() != newConstrainer->getMaximumHeight());\r
-\r
+        resizable = true;\r
         attachConstrainer (newConstrainer);\r
     }\r
 }\r
@@ -205,23 +207,4 @@ void AudioProcessorEditor::setScaleFactor (float newScale)
     editorResized (true);\r
 }\r
 \r
-//==============================================================================\r
-#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
- typedef ComponentPeer* (*createUnityPeerFunctionType) (Component&);\r
- createUnityPeerFunctionType juce_createUnityPeerFn = nullptr;\r
-#endif\r
-\r
-ComponentPeer* AudioProcessorEditor::createNewPeer (int styleFlags, void* nativeWindow)\r
-{\r
-   #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
-    if (juce_createUnityPeerFn != nullptr)\r
-    {\r
-        ignoreUnused (styleFlags, nativeWindow);\r
-        return juce_createUnityPeerFn (*this);\r
-    }\r
-   #endif\r
-\r
-    return Component::createNewPeer (styleFlags, nativeWindow);\r
-}\r
-\r
 } // namespace juce\r
index 603dc7f1ac4ed4fd7f2e9c41b106bcd5f2e7be5e..76dffc48cd6c62a440650afd1ebf10bc3e2cc5f9 100644 (file)
@@ -193,8 +193,6 @@ private:
         JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditorListener)\r
     };\r
 \r
-    ComponentPeer* createNewPeer (int styleFlags, void*) override;\r
-\r
     //==============================================================================\r
     void initialise();\r
     void editorResized (bool wasResized);\r
index 6f5232b83143cebc66e9286db4d489cb7f8951ba..8c6b32763dc42a6198bf1d631136ba44a8840ee8 100644 (file)
@@ -359,20 +359,23 @@ struct RenderSequenceBuilder
     {\r
         AudioProcessorGraph::NodeAndChannel channel;\r
 \r
-        static AssignedBuffer createReadOnlyEmpty() noexcept    { return { { zeroNodeID(), 0 } }; }\r
-        static AssignedBuffer createFree() noexcept             { return { { freeNodeID(), 0 } }; }\r
+        static AssignedBuffer createReadOnlyEmpty() noexcept    { return { { (NodeID) zeroNodeID, 0 } }; }\r
+        static AssignedBuffer createFree() noexcept             { return { { (NodeID) freeNodeID, 0 } }; }\r
 \r
-        bool isReadOnlyEmpty() const noexcept                   { return channel.nodeID == zeroNodeID(); }\r
-        bool isFree() const noexcept                            { return channel.nodeID == freeNodeID(); }\r
+        bool isReadOnlyEmpty() const noexcept                   { return channel.nodeID == (NodeID) zeroNodeID; }\r
+        bool isFree() const noexcept                            { return channel.nodeID == (NodeID) freeNodeID; }\r
         bool isAssigned() const noexcept                        { return ! (isReadOnlyEmpty() || isFree()); }\r
 \r
-        void setFree() noexcept                                 { channel = { freeNodeID(), 0 }; }\r
-        void setAssignedToNonExistentNode() noexcept            { channel = { anonNodeID(), 0 }; }\r
+        void setFree() noexcept                                 { channel = { (NodeID) freeNodeID, 0 }; }\r
+        void setAssignedToNonExistentNode() noexcept            { channel = { (NodeID) anonNodeID, 0 }; }\r
 \r
     private:\r
-        static NodeID anonNodeID() { return NodeID (0x7ffffffd); }\r
-        static NodeID zeroNodeID() { return NodeID (0x7ffffffe); }\r
-        static NodeID freeNodeID() { return NodeID (0x7fffffff); }\r
+        enum\r
+        {\r
+            anonNodeID = 0x7ffffffd,\r
+            zeroNodeID = 0x7ffffffe,\r
+            freeNodeID = 0x7fffffff\r
+        };\r
     };\r
 \r
     Array<AssignedBuffer> audioBuffers, midiBuffers;\r
@@ -385,12 +388,12 @@ struct RenderSequenceBuilder
         int delay;\r
     };\r
 \r
-    HashMap<uint32, int> delays;\r
+    HashMap<NodeID, int> delays;\r
     int totalLatency = 0;\r
 \r
     int getNodeDelay (NodeID nodeID) const noexcept\r
     {\r
-        return delays[nodeID.uid];\r
+        return delays[nodeID];\r
     }\r
 \r
     int getInputLatencyForNode (NodeID nodeID) const\r
@@ -678,12 +681,12 @@ struct RenderSequenceBuilder
         if (processor.producesMidi())\r
             midiBuffers.getReference (midiBufferToUse).channel = { node.nodeID, AudioProcessorGraph::midiChannelIndex };\r
 \r
-        delays.set (node.nodeID.uid, maxLatency + processor.getLatencySamples());\r
+        delays.set (node.nodeID, maxLatency + processor.getLatencySamples());\r
 \r
         if (numOuts == 0)\r
             totalLatency = maxLatency;\r
 \r
-        sequence.addProcessOp (node, audioChannelsToUse, totalChans, midiBufferToUse);\r
+        sequence.addProcessOp (&node, audioChannelsToUse, totalChans, midiBufferToUse);\r
     }\r
 \r
     //==============================================================================\r
@@ -893,8 +896,6 @@ void AudioProcessorGraph::topologyChanged()
 \r
 void AudioProcessorGraph::clear()\r
 {\r
-    const ScopedLock sl (getCallbackLock());\r
-\r
     if (nodes.isEmpty())\r
         return;\r
 \r
@@ -919,8 +920,8 @@ AudioProcessorGraph::Node::Ptr AudioProcessorGraph::addNode (AudioProcessor* new
         return {};\r
     }\r
 \r
-    if (nodeID == NodeID())\r
-        nodeID.uid = ++(lastNodeID.uid);\r
+    if (nodeID == 0)\r
+        nodeID = ++lastNodeID;\r
 \r
     for (auto* n : nodes)\r
     {\r
@@ -931,13 +932,13 @@ AudioProcessorGraph::Node::Ptr AudioProcessorGraph::addNode (AudioProcessor* new
         }\r
     }\r
 \r
-    if (lastNodeID < nodeID)\r
+    if (nodeID > lastNodeID)\r
         lastNodeID = nodeID;\r
 \r
     newProcessor->setPlayHead (getPlayHead());\r
 \r
     Node::Ptr n (new Node (nodeID, newProcessor));\r
-    nodes.add (n.get());\r
+    nodes.add (n);\r
     n->setParentGraph (this);\r
     topologyChanged();\r
     return n;\r
@@ -1241,9 +1242,14 @@ void AudioProcessorGraph::handleAsyncUpdate()
 }\r
 \r
 //==============================================================================\r
-void AudioProcessorGraph::prepareToPlay (double sampleRate, int estimatedSamplesPerBlock)\r
+void AudioProcessorGraph::prepareToPlay (double /*sampleRate*/, int estimatedSamplesPerBlock)\r
 {\r
-    setRateAndBufferSizeDetails (sampleRate, estimatedSamplesPerBlock);\r
+    if (renderSequenceFloat != nullptr)\r
+        renderSequenceFloat->prepareBuffers (estimatedSamplesPerBlock);\r
+\r
+    if (renderSequenceDouble != nullptr)\r
+        renderSequenceDouble->prepareBuffers (estimatedSamplesPerBlock);\r
+\r
     clearRenderingSequence();\r
     triggerAsyncUpdate();\r
 }\r
@@ -1255,8 +1261,6 @@ bool AudioProcessorGraph::supportsDoublePrecisionProcessing() const
 \r
 void AudioProcessorGraph::releaseResources()\r
 {\r
-    const ScopedLock sl (getCallbackLock());\r
-\r
     isPrepared = 0;\r
 \r
     for (auto* n : nodes)\r
index ff4337457ec3db6cfb8cc4236988e0cada70e4e7..a752149d5d019148f9524b112df3480fec45570d 100644 (file)
@@ -58,17 +58,7 @@ public:
     ~AudioProcessorGraph();\r
 \r
     /** Each node in the graph has a UID of this type. */\r
-    struct NodeID\r
-    {\r
-        NodeID() {}\r
-        explicit NodeID (uint32 i) : uid (i) {}\r
-\r
-        uint32 uid = 0;\r
-\r
-        bool operator== (const NodeID& other) const noexcept    { return uid == other.uid; }\r
-        bool operator!= (const NodeID& other) const noexcept    { return uid != other.uid; }\r
-        bool operator<  (const NodeID& other) const noexcept    { return uid <  other.uid; }\r
-    };\r
+    using NodeID = uint32;\r
 \r
     //==============================================================================\r
     /** A special index that represents the midi channel of a node.\r
@@ -195,7 +185,7 @@ public:
         This will return nullptr if the index is out of range.\r
         @see getNodeForId\r
     */\r
-    Node::Ptr getNode (int index) const noexcept                    { return nodes[index]; }\r
+    Node* getNode (int index) const noexcept                        { return nodes [index]; }\r
 \r
     /** Searches the graph for a node with the given ID number and returns it.\r
         If no such node was found, this returns nullptr.\r
index aac241c14185c80ed3f8da65221266859abfe8a7..9116a4403589500faabff618f7eb018b6345cf18 100644 (file)
@@ -47,7 +47,7 @@ public:
     //==============================================================================\r
     /** Receives a callback when a parameter is changed.\r
 \r
-        IMPORTANT NOTE: This will be called synchronously when a parameter changes, and\r
+        IMPORTANT NOTE: this will be called synchronously when a parameter changes, and\r
         many audio processors will change their parameter during their audio callback.\r
         This means that not only has your handler code got to be completely thread-safe,\r
         but it's also got to be VERY fast, and avoid blocking. If you need to handle\r
@@ -61,7 +61,7 @@ public:
     /** Called to indicate that something else in the plugin has changed, like its\r
         program, number of parameters, etc.\r
 \r
-        IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+        IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
         call it during their audio callback. This means that not only has your handler code\r
         got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
         blocking. If you need to handle this event on your message thread, use this callback\r
@@ -76,7 +76,7 @@ public:
         press the mouse button, and audioProcessorParameterChangeGestureEnd would be\r
         called when they release it.\r
 \r
-        IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+        IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
         call it during their audio callback. This means that not only has your handler code\r
         got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
         blocking. If you need to handle this event on your message thread, use this callback\r
@@ -93,7 +93,7 @@ public:
         E.g. if the user is dragging a slider, this would be called when they release\r
         the mouse button.\r
 \r
-        IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+        IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
         call it during their audio callback. This means that not only has your handler code\r
         got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
         blocking. If you need to handle this event on your message thread, use this callback\r
index a700098cfd182b56e706461dfab4bb466e45adcf..276ba3dc80aa65648642f6b5dc99033c857e84a2 100644 (file)
@@ -147,12 +147,12 @@ public:
     */\r
     virtual bool isBoolean() const;\r
 \r
-    /** Returns a textual version of the supplied normalised parameter value.\r
+    /** Returns a textual version of the supplied parameter value.\r
         The default implementation just returns the floating point value\r
         as a string, but this could do anything you need for a custom type\r
         of value.\r
     */\r
-    virtual String getText (float normalisedValue, int /*maximumStringLength*/) const;\r
+    virtual String getText (float value, int /*maximumStringLength*/) const;\r
 \r
     /** Should parse a string and return the appropriate value for it. */\r
     virtual float getValueForText (const String& text) const = 0;\r
@@ -216,7 +216,7 @@ public:
     /** Returns the set of strings which represent the possible states a parameter\r
         can be in.\r
 \r
-        If you are hosting a plug-in you can use the result of this function to\r
+        If you are hosting a plug-in you can use the result of this funtion to\r
         populate a ComboBox listing the allowed values.\r
 \r
         If you are implementing a plug-in then you do not need to override this.\r
@@ -242,7 +242,7 @@ public:
 \r
         /** Receives a callback when a parameter has been changed.\r
 \r
-            IMPORTANT NOTE: This will be called synchronously when a parameter changes, and\r
+            IMPORTANT NOTE: this will be called synchronously when a parameter changes, and\r
             many audio processors will change their parameter during their audio callback.\r
             This means that not only has your handler code got to be completely thread-safe,\r
             but it's also got to be VERY fast, and avoid blocking. If you need to handle\r
@@ -257,7 +257,7 @@ public:
             being true when they first press the mouse button, and it will be called again with\r
             gestureIsStarting being false when they release it.\r
 \r
-            IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+            IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
             call it during their audio callback. This means that not only has your handler code\r
             got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
             blocking. If you need to handle this event on your message thread, use this callback\r
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp
deleted file mode 100644 (file)
index 3efe8b8..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-class ParameterGroupTests   : public UnitTest\r
-{\r
-public:\r
-    ParameterGroupTests() : UnitTest ("ParameterGroups", "Parameters") {}\r
-\r
-    void runTest() override\r
-    {\r
-        beginTest ("ParameterGroups");\r
-\r
-        auto g1 = std::make_unique<AudioProcessorParameterGroup> ("g1", "g1", " - ");\r
-\r
-        auto* p1 = new AudioParameterFloat ("p1", "p1", { 0.0f, 2.0f }, 0.5f);\r
-        auto* p2 = new AudioParameterFloat ("p2", "p2", { 0.0f, 2.0f }, 0.5f);\r
-        auto* p3 = new AudioParameterFloat ("p3", "p3", { 0.0f, 2.0f }, 0.5f);\r
-\r
-        g1->addChild (std::unique_ptr<AudioParameterFloat> (p1));\r
-        g1->addChild (std::unique_ptr<AudioParameterFloat> (p2),\r
-                      std::unique_ptr<AudioParameterFloat> (p3));\r
-\r
-        auto p4 = std::make_unique<AudioParameterFloat> ("p4", "p4", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-        auto p5 = std::make_unique<AudioParameterFloat> ("p5", "p5", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-        auto p6 = std::make_unique<AudioParameterFloat> ("p6", "p6", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-\r
-        g1->addChild (std::move (p4));\r
-        g1->addChild (std::move (p5),\r
-                      std::move (p6));\r
-\r
-        {\r
-            auto topLevelParams = g1->getParameters (false);\r
-            auto params = g1->getParameters (true);\r
-            expect (topLevelParams == params);\r
-            expectEquals (params.size(), 6);\r
-\r
-            expect (params[0] == (AudioProcessorParameter*) p1);\r
-            expect (params[1] == (AudioProcessorParameter*) p2);\r
-            expect (params[2] == (AudioProcessorParameter*) p3);\r
-\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[3])->name == "p4");\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[4])->name == "p5");\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[5])->name == "p6");\r
-        }\r
-\r
-        auto* p7 = new AudioParameterFloat ("p7", "p7", { 0.0f, 2.0f }, 0.5f);\r
-        auto* p8 = new AudioParameterFloat ("p8", "p8", { 0.0f, 2.0f }, 0.5f);\r
-        auto* p9 = new AudioParameterFloat ("p9", "p9", { 0.0f, 2.0f }, 0.5f);\r
-\r
-        auto p10 = std::make_unique<AudioParameterFloat> ("p10", "p10", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-        auto p11 = std::make_unique<AudioParameterFloat> ("p11", "p11", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-        auto p12 = std::make_unique<AudioParameterFloat> ("p12", "p12", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-\r
-        auto g2 = std::make_unique<AudioProcessorParameterGroup> ("g2", "g2", " | ", std::unique_ptr<AudioParameterFloat> (p7));\r
-        auto g3 = std::make_unique<AudioProcessorParameterGroup> ("g3", "g3", " | ", std::unique_ptr<AudioParameterFloat> (p8), std::unique_ptr<AudioParameterFloat> (p9));\r
-        auto g4 = std::make_unique<AudioProcessorParameterGroup> ("g4", "g4", " | ", std::move (p10));\r
-        auto g5 = std::make_unique<AudioProcessorParameterGroup> ("g5", "g5", " | ", std::move (p11), std::move (p12));\r
-\r
-        g1->addChild (std::move (g2));\r
-        g4->addChild (std::move (g5));\r
-        g1->addChild (std::move (g3), std::move (g4));\r
-\r
-        {\r
-            auto topLevelParams = g1->getParameters (false);\r
-            auto params = g1->getParameters (true);\r
-            expectEquals (topLevelParams.size(), 6);\r
-            expectEquals (params.size(), 12);\r
-\r
-            expect (params[0] == (AudioProcessorParameter*) p1);\r
-            expect (params[1] == (AudioProcessorParameter*) p2);\r
-            expect (params[2] == (AudioProcessorParameter*) p3);\r
-\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[3])->name == "p4");\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[4])->name == "p5");\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[5])->name == "p6");\r
-\r
-            expect (params[6] == (AudioProcessorParameter*) p7);\r
-            expect (params[7] == (AudioProcessorParameter*) p8);\r
-            expect (params[8] == (AudioProcessorParameter*) p9);\r
-\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[9]) ->name == "p10");\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[10])->name == "p11");\r
-            expect (dynamic_cast<AudioParameterFloat*> (params[11])->name == "p12");\r
-        }\r
-\r
-        g1->addChild (std::make_unique<AudioProcessorParameterGroup> ("g6", "g6", " | ",\r
-                                                                      std::make_unique<AudioParameterFloat> ("p11", "p11", NormalisableRange<float> (0.0f, 2.0f), 0.5f),\r
-                                                                      std::make_unique<AudioProcessorParameterGroup> ("g7", "g7", " | ",\r
-                                                                                                                      std::make_unique<AudioParameterFloat> ("p12", "p12", NormalisableRange<float> (0.0f, 2.0f), 0.5f)),\r
-                                                                      std::make_unique<AudioParameterFloat> ("p13", "p13", NormalisableRange<float> (0.0f, 2.0f), 0.5f)));\r
-\r
-        TestAudioProcessor processor;\r
-\r
-        processor.addParameter (new AudioParameterFloat ("pstart", "pstart", NormalisableRange<float> (0.0f, 2.0f), 0.5f));\r
-        auto groupParams = g1->getParameters (true);\r
-        processor.addParameterGroup (std::move (g1));\r
-        processor.addParameter (new AudioParameterFloat ("pend", "pend", NormalisableRange<float> (0.0f, 2.0f), 0.5f));\r
-\r
-        auto& processorParams = processor.getParameters();\r
-        expect (dynamic_cast<AudioParameterFloat*> (processorParams.getFirst())->name == "pstart");\r
-        expect (dynamic_cast<AudioParameterFloat*> (processorParams.getLast()) ->name == "pend");\r
-\r
-        auto numParams = processorParams.size();\r
-\r
-        for (int i = 1; i < numParams - 1; ++i)\r
-            expect (processorParams[i] == groupParams[i - 1]);\r
-\r
-    }\r
-private:\r
-    struct TestAudioProcessor   : public AudioProcessor\r
-    {\r
-        const String getName() const override { return "ap"; }\r
-        void prepareToPlay (double, int) override {}\r
-        void releaseResources() override {}\r
-        void processBlock (AudioBuffer<float>&, MidiBuffer&) override {}\r
-        double getTailLengthSeconds() const override { return 0.0; }\r
-        bool acceptsMidi() const override { return false; }\r
-        bool producesMidi() const override { return false; }\r
-        AudioProcessorEditor* createEditor() override { return nullptr; }\r
-        bool hasEditor() const override { return false; }\r
-        int getNumPrograms() override { return 0; }\r
-        int getCurrentProgram() override { return 0; }\r
-        void setCurrentProgram (int) override {}\r
-        const String getProgramName (int) override { return {}; }\r
-        void changeProgramName (int, const String&) override {}\r
-        void getStateInformation (MemoryBlock&) override {}\r
-        void setStateInformation (const void*, int) override {}\r
-    };\r
-};\r
-\r
-static ParameterGroupTests parameterGroupTests;\r
-\r
-#endif\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h b/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h
deleted file mode 100644 (file)
index 8b1f444..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/** A class encapsulating a group of AudioProcessorParameters and nested\r
-    AudioProcessorParameterGroups.\r
-\r
-    This class is predominantly write-only; there are methods for adding group\r
-    members but none for removing them. Ultimately you will probably want to\r
-    add a fully constructed group to an AudioProcessor.\r
-\r
-    @see AudioProcessor::addParameterGroup\r
-\r
-    @tags{Audio}\r
-*/\r
-class AudioProcessorParameterGroup\r
-{\r
-public:\r
-    //==============================================================================\r
-    /** A child of an AudioProcessorParameterGroup.\r
-\r
-        This can contain either an AudioProcessorParameter or an\r
-        AudioProcessorParameterGroup. You can query which using the\r
-        getParameter and getGroup methods.\r
-\r
-        @code\r
-        for (auto* child : group)\r
-            if (auto* parameter = node.getParameter())\r
-                parameter->setValueNotifyingHost (0.5f);\r
-            else\r
-                node.getGroup()->AddChild (new Parameter());\r
-        @endcode\r
-    */\r
-    class AudioProcessorParameterNode\r
-    {\r
-    public:\r
-        //==============================================================================\r
-        /** Returns the parent group or nullptr if this is a top-level group. */\r
-        AudioProcessorParameterGroup* getParent() const              { return parent; }\r
-\r
-        /** Returns a pointer to a parameter if this node contains a paramater, nullptr otherwise. */\r
-        AudioProcessorParameter* getParameter() const                { return parameter.get(); }\r
-\r
-        /** Returns a pointer to a group if this node contains a group, nullptr otherwise. */\r
-        AudioProcessorParameterGroup* getGroup() const               { return group.get(); }\r
-\r
-    private:\r
-        //==============================================================================\r
-        AudioProcessorParameterNode (std::unique_ptr<AudioProcessorParameter> param,\r
-                                     AudioProcessorParameterGroup* parentGroup)\r
-            : parameter (std::move (param)), parent (parentGroup)\r
-        {}\r
-\r
-        AudioProcessorParameterNode (std::unique_ptr<AudioProcessorParameterGroup> grp,\r
-                                     AudioProcessorParameterGroup* parentGroup)\r
-            : group (std::move (grp)), parent (parentGroup)\r
-        {\r
-            group->parent = parent;\r
-        }\r
-\r
-        std::unique_ptr<AudioProcessorParameterGroup> group;\r
-        std::unique_ptr<AudioProcessorParameter> parameter;\r
-        AudioProcessorParameterGroup* parent = nullptr;\r
-\r
-        friend class AudioProcessorParameterGroup;\r
-\r
-        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterNode)\r
-    };\r
-\r
-    //==============================================================================\r
-    /** Creates an empty AudioProcessorParameterGroup.\r
-\r
-        @param groupID             A unique identifier for the group. Keep it basic; don't use any special\r
-                                   characters like "." and avoid pure integer strings which could collide with\r
-                                   legacy parameter IDs.\r
-        @param groupName           The group's name, which will be displayed in the host.\r
-        @param subgroupSeparator   A separator string to use between the name of this group and the name of any\r
-                                   subgroups if this group is flattened. AUv3 and VST3 plug-ins can have multiple\r
-                                   layers of nested subgroups, but AU plug-ins cannot have any subgroups.\r
-\r
-    */\r
-    AudioProcessorParameterGroup (const String& groupID, const String& groupName, const String& subgroupSeparator)\r
-        : identifier (groupID), name (groupName), separator (subgroupSeparator)\r
-    {\r
-    }\r
-\r
-    /** Creates an AudioProcessorParameterGroup with a single child.\r
-\r
-        @param groupID             A unique identifier for the group. Keep it basic; don't use any special\r
-                                   characters like "." and avoid pure integer strings which could collide with\r
-                                   legacy parameter IDs.\r
-        @param groupName           The group's name, which will be displayed in the host.\r
-        @param subgroupSeparator   A separator string to use between the name of this group and the name of any\r
-                                   subgroups if this group is flattened. AUv3 and VST3 plug-ins can have multiple\r
-                                   layers of nested subgroups, but AU plug-ins cannot have any subgroups.\r
-        @param child               An AudioProcessorParameter or an AudioProcessorParameterGroup to add to the group.\r
-    */\r
-    template <typename ChildType>\r
-    AudioProcessorParameterGroup (const String& groupID, const String& groupName, const String& subgroupSeparator,\r
-                                  std::unique_ptr<ChildType> child)\r
-        : AudioProcessorParameterGroup (groupID, groupName, subgroupSeparator)\r
-    {\r
-        addChild (std::move (child));\r
-    }\r
-\r
-    /** Creates an AudioProcessorParameterGroup with multiple children.\r
-\r
-        @param groupID             A unique identifier for the group. Keep it basic; don't use any special\r
-                                   characters like "." and avoid pure integer strings which could collide with\r
-                                   legacy parameter IDs.\r
-        @param groupName           The group's name, which will be displayed in the host.\r
-        @param subgroupSeparator   A separator string to use between the name of this group and the name of any\r
-                                   subgroups if this group is flattened. AUv3 and VST3 plug-ins can have multiple\r
-                                   layers of nested subgroups, but AU plug-ins cannot have any subgroups.\r
-        @param firstChild          An AudioProcessorParameter or an AudioProcessorParameterGroup to add to the group.\r
-        @param remainingChildren   A list of more AudioProcessorParameters or AudioProcessorParameterGroups to add to the group.\r
-    */\r
-    template <typename ChildType, typename... Args>\r
-    AudioProcessorParameterGroup (const String& groupID, const String& groupName, const String& subgroupSeparator,\r
-                                  std::unique_ptr<ChildType> firstChild, Args&&... remainingChildren)\r
-        : AudioProcessorParameterGroup (groupID, groupName, subgroupSeparator, std::move (firstChild))\r
-    {\r
-        addChild (std::forward<Args> (remainingChildren)...);\r
-    }\r
-\r
-    //==============================================================================\r
-    /** Returns the group's ID. */\r
-    String getID() const                                                     { return identifier; }\r
-\r
-    /** Returns the group's name. */\r
-    String getName() const                                                   { return name; }\r
-\r
-    /** Returns the group's separator string. */\r
-    String getSeparator() const                                              { return separator; }\r
-\r
-    /** Returns the parent of the group, or nullptr if this is a top-levle group. */\r
-    const AudioProcessorParameterGroup* getParent() const noexcept           { return parent; }\r
-\r
-    //==============================================================================\r
-    const AudioProcessorParameterNode** begin() const noexcept               { return children.begin(); }\r
-    const AudioProcessorParameterNode** end()   const noexcept               { return children.end(); }\r
-\r
-    //==============================================================================\r
-    /** Swaps the content of this group with another. */\r
-    void swapWith (AudioProcessorParameterGroup& other) noexcept\r
-    {\r
-        children.swapWith (other.children);\r
-\r
-        auto refreshParentPtr = [] (AudioProcessorParameterGroup& parentGroup)\r
-        {\r
-            for (auto* child : parentGroup)\r
-                if (auto* group = child->getGroup())\r
-                    group->parent = &parentGroup;\r
-        };\r
-\r
-        refreshParentPtr (*this);\r
-        refreshParentPtr (other);\r
-    }\r
-\r
-    //==============================================================================\r
-    /** Returns all subgroups of this group.\r
-\r
-        @param recursive   If this is true then this method will fetch all nested\r
-                           subgroups using a depth first search.\r
-    */\r
-    Array<const AudioProcessorParameterGroup*> getSubgroups (bool recursive) const\r
-    {\r
-        Array<const AudioProcessorParameterGroup*> groups;\r
-        getSubgroups (groups, recursive);\r
-        return groups;\r
-    }\r
-\r
-    /** Returns all the parameters in this group.\r
-\r
-        @param recursive   If this is true then this method will fetch all nested\r
-                           parameters using a depth first search.\r
-    */\r
-    Array<AudioProcessorParameter*> getParameters (bool recursive) const\r
-    {\r
-        Array<AudioProcessorParameter*> parameters;\r
-        getParameters (parameters, recursive);\r
-        return parameters;\r
-    }\r
-\r
-    /** Searches this group recursively for a parameter and returns a depth ordered\r
-        list of the groups it belongs to.\r
-    */\r
-    Array<const AudioProcessorParameterGroup*> getGroupsForParameter (AudioProcessorParameter* parameter) const\r
-    {\r
-        Array<const AudioProcessorParameterGroup*> groups;\r
-\r
-        if (auto* group = getGroupForParameter (parameter))\r
-        {\r
-            while (group != this)\r
-            {\r
-                groups.insert (0, group);\r
-                group = group->getParent();\r
-            }\r
-        }\r
-\r
-        return groups;\r
-    }\r
-\r
-    //==============================================================================\r
-    /** Adds a child to the group. */\r
-    template <typename ChildType>\r
-    void addChild (std::unique_ptr<ChildType> child)\r
-    {\r
-        // If you hit a compiler error here then you are attempting to add a\r
-        // child that is neither a pointer to an AudioProcessorParameterGroup\r
-        // nor a pointer to an AudioProcessorParameter.\r
-        children.add (new AudioProcessorParameterNode (std::move (child), this));\r
-    }\r
-\r
-    /** Adds multiple children to the group. */\r
-    template <typename ChildType, typename... Args>\r
-    void addChild (std::unique_ptr<ChildType> firstChild, Args&&... remainingChildren)\r
-    {\r
-        addChild (std::move (firstChild));\r
-        addChild (std::forward<Args> (remainingChildren)...);\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    void getSubgroups (Array<const AudioProcessorParameterGroup*>& previousGroups, bool recursive) const\r
-    {\r
-        for (auto* child : children)\r
-        {\r
-            if (auto* group = child->getGroup())\r
-            {\r
-                previousGroups.add (group);\r
-\r
-                if (recursive)\r
-                    group->getSubgroups (previousGroups, true);\r
-            }\r
-        }\r
-    }\r
-\r
-    void getParameters (Array<AudioProcessorParameter*>& previousParameters, bool recursive) const\r
-    {\r
-        for (auto* child : children)\r
-        {\r
-            if (auto* parameter = child->getParameter())\r
-                previousParameters.add (parameter);\r
-            else if (recursive)\r
-                child->getGroup()->getParameters (previousParameters, true);\r
-        }\r
-    }\r
-\r
-    const AudioProcessorParameterGroup* getGroupForParameter (AudioProcessorParameter* parameter) const\r
-    {\r
-        for (auto* child : children)\r
-        {\r
-            if (child->getParameter() == parameter)\r
-                return this;\r
-\r
-            if (auto* group = child->getGroup())\r
-                if (auto* foundGroup = group->getGroupForParameter (parameter))\r
-                    return foundGroup;\r
-        }\r
-\r
-        return nullptr;\r
-    }\r
-\r
-    //==============================================================================\r
-    const String identifier, name, separator;\r
-    OwnedArray<const AudioProcessorParameterNode> children;\r
-    AudioProcessorParameterGroup* parent = nullptr;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterGroup)\r
-};\r
-\r
-} // namespace juce\r
index 5f09e8006256dbbbf68a59a6f9f1bd8c69c99dbf..58855f0b1739c97b5f1d9c687e8253e6a23b4993 100644 (file)
@@ -32,8 +32,8 @@ class ParameterListener   : private AudioProcessorParameter::Listener,
                             private Timer\r
 {\r
 public:\r
-    ParameterListener (AudioProcessor& proc, AudioProcessorParameter& param)\r
-        : processor (proc), parameter (param)\r
+    ParameterListener (AudioProcessor& p, AudioProcessorParameter& param)\r
+        : processor (p), parameter (param)\r
     {\r
         if (LegacyAudioParameter::isLegacy (&parameter))\r
             processor.addListener (this);\r
@@ -101,8 +101,8 @@ class BooleanParameterComponent final   : public Component,
                                           private ParameterListener\r
 {\r
 public:\r
-    BooleanParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
-        : ParameterListener (proc, param)\r
+    BooleanParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+        : ParameterListener (processor, param)\r
     {\r
         // Set the initial value.\r
         handleNewParameterValue();\r
@@ -154,8 +154,8 @@ class SwitchParameterComponent final   : public Component,
                                          private ParameterListener\r
 {\r
 public:\r
-    SwitchParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
-        : ParameterListener (proc, param)\r
+    SwitchParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+        : ParameterListener (processor, param)\r
     {\r
         auto* leftButton  = buttons.add (new TextButton());\r
         auto* rightButton = buttons.add (new TextButton());\r
@@ -259,8 +259,8 @@ class ChoiceParameterComponent final   : public Component,
                                          private ParameterListener\r
 {\r
 public:\r
-    ChoiceParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
-        : ParameterListener (proc, param),\r
+    ChoiceParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+        : ParameterListener (processor, param),\r
           parameterValues (getParameter().getAllValueStrings())\r
     {\r
         box.addItemList (parameterValues, 1);\r
@@ -321,8 +321,8 @@ class SliderParameterComponent final   : public Component,
                                          private ParameterListener\r
 {\r
 public:\r
-    SliderParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
-        : ParameterListener (proc, param)\r
+    SliderParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+        : ParameterListener (processor, param)\r
     {\r
         if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps())\r
             slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0));\r
@@ -506,7 +506,7 @@ private:
 };\r
 \r
 //==============================================================================\r
-struct GenericAudioProcessorEditor::Pimpl\r
+struct  GenericAudioProcessorEditor::Pimpl\r
 {\r
     Pimpl (GenericAudioProcessorEditor& parent)\r
         : owner (parent)\r
index a2ff14f7dada43d17d0c0b9e94d500f738dbfe2a..3c0d447e98e9fe09003ae77f5d7ea3a0648dba38 100644 (file)
@@ -195,7 +195,7 @@ void PluginListComponent::setNumberOfThreadsForScanning (int num)
 \r
 void PluginListComponent::resized()\r
 {\r
-    auto r = getLocalBounds().reduced (2);\r
+    Rectangle<int> r (getLocalBounds().reduced (2));\r
 \r
     optionsButton.setBounds (r.removeFromBottom (24));\r
     optionsButton.changeWidthToFitText (24);\r
index 53a228ff43e3fd0f69225957d2750af9cc731a31..d7d71ffb777acfc23397bb2c42a35354ebd22385 100644 (file)
@@ -113,6 +113,8 @@ private:
     std::unique_ptr<TableListBoxModel> tableModel;\r
 \r
     class Scanner;\r
+    friend class Scanner;\r
+    friend struct ContainerDeletePolicy<Scanner>;\r
     std::unique_ptr<Scanner> currentScanner;\r
 \r
     void scanFinished (const StringArray&);\r
index 24f7176ed3351370972ebf4ba7eae0db121fcdda..fd010ed528f7e29e574768c7b73754f762b21a76 100644 (file)
@@ -34,7 +34,7 @@ namespace juce
 \r
     @tags{Audio}\r
 */\r
-class JUCE_API AudioParameterBool  : public RangedAudioParameter\r
+class JUCE_API AudioParameterBool  : public AudioProcessorParameterWithID\r
 {\r
 public:\r
     /** Creates a AudioParameterBool with the specified parameters.\r
@@ -60,16 +60,12 @@ public:
 \r
     /** Returns the parameter's current boolean value. */\r
     bool get() const noexcept          { return value >= 0.5f; }\r
-\r
     /** Returns the parameter's current boolean value. */\r
     operator bool() const noexcept     { return get(); }\r
 \r
     /** Changes the parameter's current value to a new boolean. */\r
     AudioParameterBool& operator= (bool newValue);\r
 \r
-    /** Returns the range of values that the parameter can take. */\r
-    const NormalisableRange<float>& getNormalisableRange() const override   { return range; }\r
-\r
 protected:\r
     /** Override this method if you are interested in receiving callbacks\r
         when the parameter value changes.\r
@@ -87,7 +83,6 @@ private:
     String getText (float, int) const override;\r
     float getValueForText (const String&) const override;\r
 \r
-    const NormalisableRange<float> range { 0.0f, 1.0f, 1.0f };\r
     float value;\r
     const float defaultValue;\r
     std::function<String (bool, int)> stringFromBoolFunction;\r
index d584bb91fe5faaa421f542a67794cd911cab7d86..7abd04ecade9d8d8b11b4a3f7ca6430d1d675ff6 100644 (file)
@@ -35,7 +35,7 @@ namespace juce
 \r
     @tags{Audio}\r
 */\r
-class JUCE_API  AudioParameterChoice  : public RangedAudioParameter\r
+class JUCE_API  AudioParameterChoice  : public AudioProcessorParameterWithID\r
 {\r
 public:\r
     /** Creates a AudioParameterChoice with the specified parameters.\r
@@ -64,22 +64,17 @@ public:
 \r
     /** Returns the current index of the selected item. */\r
     int getIndex() const noexcept                   { return roundToInt (value); }\r
-\r
     /** Returns the current index of the selected item. */\r
     operator int() const noexcept                   { return getIndex(); }\r
 \r
     /** Returns the name of the currently selected item. */\r
     String getCurrentChoiceName() const noexcept    { return choices[getIndex()]; }\r
-\r
     /** Returns the name of the currently selected item. */\r
     operator String() const noexcept                { return getCurrentChoiceName(); }\r
 \r
     /** Changes the selected item to a new index. */\r
     AudioParameterChoice& operator= (int newValue);\r
 \r
-    /** Returns the range of values that the parameter can take. */\r
-    const NormalisableRange<float>& getNormalisableRange() const override   { return range; }\r
-\r
     /** Provides access to the list of choices that this parameter is working with. */\r
     const StringArray choices;\r
 \r
@@ -99,8 +94,12 @@ private:
     String getText (float, int) const override;\r
     float getValueForText (const String&) const override;\r
 \r
-    const NormalisableRange<float> range;\r
+    int limitRange (int) const noexcept;\r
+    float convertTo0to1 (int) const noexcept;\r
+    int convertFrom0to1 (float) const noexcept;\r
+\r
     float value;\r
+    const int maxIndex;\r
     const float defaultValue;\r
     std::function<String (int, int)> stringFromIndexFunction;\r
     std::function<int (const String&)> indexFromStringFunction;\r
index 28410c5d86276faa89430471976d01c373f278bf..6193d7f9ab5c390ee448289fea333b0ad6702676 100644 (file)
@@ -35,7 +35,7 @@ namespace juce
 \r
     @tags{Audio}\r
 */\r
-class JUCE_API  AudioParameterFloat  : public RangedAudioParameter\r
+class JUCE_API  AudioParameterFloat  : public AudioProcessorParameterWithID\r
 {\r
 public:\r
     /** Creates a AudioParameterFloat with the specified parameters.\r
@@ -53,8 +53,7 @@ public:
                                    converts it into a non-normalised value. Some hosts use\r
                                    this to allow users to type in parameter values.\r
     */\r
-    AudioParameterFloat (const String& parameterID,\r
-                         const String& name,\r
+    AudioParameterFloat (const String& parameterID, const String& name,\r
                          NormalisableRange<float> normalisableRange,\r
                          float defaultValue,\r
                          const String& label = String(),\r
@@ -67,8 +66,7 @@ public:
         For control over skew factors, you can use the other\r
         constructor and provide a NormalisableRange.\r
     */\r
-    AudioParameterFloat (String parameterID,\r
-                         String name,\r
+    AudioParameterFloat (String parameterID, String name,\r
                          float minValue,\r
                          float maxValue,\r
                          float defaultValue);\r
@@ -78,16 +76,12 @@ public:
 \r
     /** Returns the parameter's current value. */\r
     float get() const noexcept                  { return value; }\r
-\r
     /** Returns the parameter's current value. */\r
     operator float() const noexcept             { return value; }\r
 \r
     /** Changes the parameter's current value. */\r
     AudioParameterFloat& operator= (float newValue);\r
 \r
-    /** Returns the range of values that the parameter can take. */\r
-    const NormalisableRange<float>& getNormalisableRange() const override   { return range; }\r
-\r
     /** Provides access to the parameter's range. */\r
     NormalisableRange<float> range;\r
 \r
index 76d4dfa42d0c2ff75dac668b3591c77664ffb2dd..17feac122a1875ed2feac0761c5237c9b76b8435 100644 (file)
@@ -35,7 +35,7 @@ namespace juce
 \r
     @tags{Audio}\r
 */\r
-class JUCE_API  AudioParameterInt  : public RangedAudioParameter\r
+class JUCE_API  AudioParameterInt  : public AudioProcessorParameterWithID\r
 {\r
 public:\r
     /** Creates a AudioParameterInt with the specified parameters.\r
@@ -65,7 +65,6 @@ public:
 \r
     /** Returns the parameter's current value as an integer. */\r
     int get() const noexcept                    { return roundToInt (value); }\r
-\r
     /** Returns the parameter's current value as an integer. */\r
     operator int() const noexcept               { return get(); }\r
 \r
@@ -75,10 +74,7 @@ public:
     AudioParameterInt& operator= (int newValue);\r
 \r
     /** Returns the parameter's range. */\r
-    Range<int> getRange() const noexcept        { return { (int) getNormalisableRange().start, (int) getNormalisableRange().end }; }\r
-\r
-    /** Returns the range of values that the parameter can take. */\r
-    const NormalisableRange<float>& getNormalisableRange() const override   { return range; }\r
+    Range<int> getRange() const noexcept        { return Range<int> (minValue, maxValue); }\r
 \r
 protected:\r
     /** Override this method if you are interested in receiving callbacks\r
@@ -95,7 +91,11 @@ private:
     String getText (float, int) const override;\r
     float getValueForText (const String&) const override;\r
 \r
-    const NormalisableRange<float> range;\r
+    int limitRange (int) const noexcept;\r
+    float convertTo0to1 (int) const noexcept;\r
+    int convertFrom0to1 (float) const noexcept;\r
+\r
+    const int minValue, maxValue, rangeOfValues;\r
     float value;\r
     const float defaultValue;\r
     std::function<String (int, int)> stringFromIntFunction;\r
index 2c3bd4456be7610809c4d20a4ceb016864dab16f..607958e59b6e31cd39ed8d61bb02fa684c499082 100644 (file)
@@ -37,7 +37,7 @@ namespace juce
 class JUCE_API  AudioProcessorParameterWithID  : public AudioProcessorParameter\r
 {\r
 public:\r
-    /** The creation of this object requires providing a name and ID which will be\r
+    /** Creation of this object requires providing a name and ID which will be\r
         constant for its lifetime.\r
     */\r
     AudioProcessorParameterWithID (const String& parameterID,\r
index 026f1104628054ee412a345d99a323e1e410e307..f162a7d8a3987ab735217b1cfc6857d6cfb36280 100644 (file)
@@ -48,7 +48,7 @@ AudioParameterFloat::AudioParameterFloat (const String& idToUse, const String& n
                                           const String& labelToUse, Category categoryToUse,\r
                                           std::function<String (float, int)> stringFromValue,\r
                                           std::function<float (const String&)> valueFromString)\r
-   : RangedAudioParameter (idToUse, nameToUse, labelToUse, categoryToUse),\r
+   : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse, categoryToUse),\r
      range (r), value (def), defaultValue (def),\r
      stringFromValueFunction (stringFromValue),\r
      valueFromStringFunction (valueFromString)\r
@@ -71,36 +71,32 @@ AudioParameterFloat::AudioParameterFloat (String pid, String nm, float minValue,
 \r
 AudioParameterFloat::~AudioParameterFloat() {}\r
 \r
-float AudioParameterFloat::getValue() const                              { return convertTo0to1 (value); }\r
-void AudioParameterFloat::setValue (float newValue)                      { value = convertFrom0to1 (newValue); valueChanged (get()); }\r
-float AudioParameterFloat::getDefaultValue() const                       { return convertTo0to1 (defaultValue); }\r
+float AudioParameterFloat::getValue() const                              { return range.convertTo0to1 (value); }\r
+void AudioParameterFloat::setValue (float newValue)                      { value = range.convertFrom0to1 (newValue); valueChanged (get()); }\r
+float AudioParameterFloat::getDefaultValue() const                       { return range.convertTo0to1 (defaultValue); }\r
 int AudioParameterFloat::getNumSteps() const                             { return AudioProcessorParameterWithID::getNumSteps(); }\r
-String AudioParameterFloat::getText (float v, int length) const          { return stringFromValueFunction (convertFrom0to1 (v), length); }\r
-float AudioParameterFloat::getValueForText (const String& text) const    { return convertTo0to1 (valueFromStringFunction (text)); }\r
+String AudioParameterFloat::getText (float v, int length) const          { return stringFromValueFunction (range.convertFrom0to1 (v), length); }\r
+float AudioParameterFloat::getValueForText (const String& text) const    { return range.convertTo0to1 (valueFromStringFunction (text)); }\r
 void AudioParameterFloat::valueChanged (float)                           {}\r
 \r
 AudioParameterFloat& AudioParameterFloat::operator= (float newValue)\r
 {\r
     if (value != newValue)\r
-        setValueNotifyingHost (convertTo0to1 (newValue));\r
+        setValueNotifyingHost (range.convertTo0to1 (newValue));\r
 \r
     return *this;\r
 }\r
 \r
-\r
 //==============================================================================\r
 AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameToUse,\r
-                                      int minValue, int maxValue, int def,\r
+                                      int mn, int mx, int def,\r
                                       const String& labelToUse,\r
                                       std::function<String (int, int)> stringFromInt,\r
                                       std::function<int (const String&)> intFromString)\r
-   : RangedAudioParameter (idToUse, nameToUse, labelToUse),\r
-     range ((float) minValue, (float) maxValue,\r
-            [](float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); },\r
-            [](float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); },\r
-            [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); }),\r
+   : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse),\r
+     minValue (mn), maxValue (mx), rangeOfValues (maxValue - minValue),\r
      value ((float) def),\r
-     defaultValue (convertTo0to1 ((float) def)),\r
+     defaultValue (convertTo0to1 (def)),\r
      stringFromIntFunction (stringFromInt),\r
      intFromStringFunction (intFromString)\r
 {\r
@@ -115,18 +111,22 @@ AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameT
 \r
 AudioParameterInt::~AudioParameterInt() {}\r
 \r
-float AudioParameterInt::getValue() const                                { return convertTo0to1 (value); }\r
-void AudioParameterInt::setValue (float newValue)                        { value = convertFrom0to1 (newValue); valueChanged (get()); }\r
+int AudioParameterInt::limitRange (int v) const noexcept                 { return jlimit (minValue, maxValue, v); }\r
+float AudioParameterInt::convertTo0to1 (int v) const noexcept            { return (limitRange (v) - minValue) / (float) rangeOfValues; }\r
+int AudioParameterInt::convertFrom0to1 (float v) const noexcept          { return limitRange (roundToInt ((v * (float) rangeOfValues) + minValue)); }\r
+\r
+float AudioParameterInt::getValue() const                                { return convertTo0to1 (roundToInt (value)); }\r
+void AudioParameterInt::setValue (float newValue)                        { value = (float) convertFrom0to1 (newValue); valueChanged (get()); }\r
 float AudioParameterInt::getDefaultValue() const                         { return defaultValue; }\r
-int AudioParameterInt::getNumSteps() const                               { return ((int) getNormalisableRange().getRange().getLength()) + 1; }\r
-float AudioParameterInt::getValueForText (const String& text) const      { return convertTo0to1 ((float) intFromStringFunction (text)); }\r
-String AudioParameterInt::getText (float v, int length) const            { return stringFromIntFunction ((int) convertFrom0to1 (v), length); }\r
+int AudioParameterInt::getNumSteps() const                               { return rangeOfValues + 1; }\r
+float AudioParameterInt::getValueForText (const String& text) const      { return convertTo0to1 (intFromStringFunction (text)); }\r
+String AudioParameterInt::getText (float v, int length) const            { return stringFromIntFunction (convertFrom0to1 (v), length); }\r
 void AudioParameterInt::valueChanged (int)                               {}\r
 \r
 AudioParameterInt& AudioParameterInt::operator= (int newValue)\r
 {\r
     if (get() != newValue)\r
-        setValueNotifyingHost (convertTo0to1 ((float) newValue));\r
+        setValueNotifyingHost (convertTo0to1 (newValue));\r
 \r
     return *this;\r
 }\r
@@ -137,7 +137,7 @@ AudioParameterBool::AudioParameterBool (const String& idToUse, const String& nam
                                         bool def, const String& labelToUse,\r
                                         std::function<String (bool, int)> stringFromBool,\r
                                         std::function<bool (const String&)> boolFromString)\r
-   : RangedAudioParameter (idToUse, nameToUse, labelToUse),\r
+   : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse),\r
      value (def ? 1.0f : 0.0f),\r
      defaultValue (value),\r
      stringFromBoolFunction (stringFromBool),\r
@@ -209,13 +209,10 @@ AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String&
                                             const StringArray& c, int def, const String& labelToUse,\r
                                             std::function<String (int, int)> stringFromIndex,\r
                                             std::function<int (const String&)> indexFromString)\r
-   : RangedAudioParameter (idToUse, nameToUse, labelToUse), choices (c),\r
-     range (0.0f, choices.size() - 1.0f,\r
-            [](float, float end, float v) { return jlimit (0.0f, end, v * end); },\r
-            [](float, float end, float v) { return jlimit (0.0f, 1.0f, v / end); },\r
-            [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); }),\r
+   : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse), choices (c),\r
      value ((float) def),\r
-     defaultValue (convertTo0to1 ((float) def)),\r
+     maxIndex (choices.size() - 1),\r
+     defaultValue (convertTo0to1 (def)),\r
      stringFromIndexFunction (stringFromIndex),\r
      indexFromStringFunction (indexFromString)\r
 {\r
@@ -230,108 +227,25 @@ AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String&
 \r
 AudioParameterChoice::~AudioParameterChoice() {}\r
 \r
-float AudioParameterChoice::getValue() const                             { return convertTo0to1 (value); }\r
-void AudioParameterChoice::setValue (float newValue)                     { value = convertFrom0to1 (newValue); valueChanged (getIndex()); }\r
+int AudioParameterChoice::limitRange (int v) const noexcept              { return jlimit (0, maxIndex, v); }\r
+float AudioParameterChoice::convertTo0to1 (int v) const noexcept         { return jlimit (0.0f, 1.0f, v / (float) maxIndex); }\r
+int AudioParameterChoice::convertFrom0to1 (float v) const noexcept       { return limitRange (roundToInt (v * (float) maxIndex)); }\r
+\r
+float AudioParameterChoice::getValue() const                             { return convertTo0to1 (roundToInt (value)); }\r
+void AudioParameterChoice::setValue (float newValue)                     { value = (float) convertFrom0to1 (newValue); valueChanged (getIndex()); }\r
 float AudioParameterChoice::getDefaultValue() const                      { return defaultValue; }\r
 int AudioParameterChoice::getNumSteps() const                            { return choices.size(); }\r
 bool AudioParameterChoice::isDiscrete() const                            { return true; }\r
-float AudioParameterChoice::getValueForText (const String& text) const   { return convertTo0to1 ((float) indexFromStringFunction (text)); }\r
-String AudioParameterChoice::getText (float v, int length) const         { return stringFromIndexFunction ((int) convertFrom0to1 (v), length); }\r
+float AudioParameterChoice::getValueForText (const String& text) const   { return convertTo0to1 (indexFromStringFunction (text)); }\r
+String AudioParameterChoice::getText (float v, int length) const         { return stringFromIndexFunction (convertFrom0to1 (v), length); }\r
 void AudioParameterChoice::valueChanged (int)                            {}\r
 \r
 AudioParameterChoice& AudioParameterChoice::operator= (int newValue)\r
 {\r
     if (getIndex() != newValue)\r
-        setValueNotifyingHost (convertTo0to1 ((float) newValue));\r
+        setValueNotifyingHost (convertTo0to1 (newValue));\r
 \r
     return *this;\r
 }\r
 \r
-#if JUCE_UNIT_TESTS\r
-\r
-static struct SpecialisedAudioParameterTests final   : public UnitTest\r
-{\r
-    SpecialisedAudioParameterTests() : UnitTest ("Specialised Audio Parameters", "AudioProcessor parameters") {}\r
-\r
-    void runTest() override\r
-    {\r
-        beginTest ("A choice parameter with three options switches at the correct points");\r
-        {\r
-            AudioParameterChoice choice ({}, {}, { "a", "b", "c" }, {});\r
-\r
-            choice.setValueNotifyingHost (0.0f);\r
-            expectEquals (choice.getIndex(), 0);\r
-\r
-            choice.setValueNotifyingHost (0.2f);\r
-            expectEquals (choice.getIndex(), 0);\r
-\r
-            choice.setValueNotifyingHost (0.3f);\r
-            expectEquals (choice.getIndex(), 1);\r
-\r
-            choice.setValueNotifyingHost (0.7f);\r
-            expectEquals (choice.getIndex(), 1);\r
-\r
-            choice.setValueNotifyingHost (0.8f);\r
-            expectEquals (choice.getIndex(), 2);\r
-\r
-            choice.setValueNotifyingHost (1.0f);\r
-            expectEquals (choice.getIndex(), 2);\r
-        }\r
-\r
-        beginTest ("An int parameter with three options switches at the correct points");\r
-        {\r
-            AudioParameterInt intParam ({}, {}, 1, 3, 1);\r
-\r
-            intParam.setValueNotifyingHost (0.0f);\r
-            expectEquals (intParam.get(), 1);\r
-\r
-            intParam.setValueNotifyingHost (0.2f);\r
-            expectEquals (intParam.get(), 1);\r
-\r
-            intParam.setValueNotifyingHost (0.3f);\r
-            expectEquals (intParam.get(), 2);\r
-\r
-            intParam.setValueNotifyingHost (0.7f);\r
-            expectEquals (intParam.get(), 2);\r
-\r
-            intParam.setValueNotifyingHost (0.8f);\r
-            expectEquals (intParam.get(), 3);\r
-\r
-            intParam.setValueNotifyingHost (1.0f);\r
-            expectEquals (intParam.get(), 3);\r
-        }\r
-\r
-\r
-        beginTest ("Choice parameters handle out-of-bounds input");\r
-        {\r
-            AudioParameterChoice choiceParam ({}, {}, { "a", "b", "c" }, {});\r
-\r
-            choiceParam.setValueNotifyingHost (-0.5f);\r
-            expectEquals (choiceParam.getIndex(), 0);\r
-\r
-            choiceParam.setValueNotifyingHost (1.5f);\r
-            expectEquals (choiceParam.getIndex(), 2);\r
-        }\r
-\r
-        beginTest ("Int parameters handle out-of-bounds input");\r
-        {\r
-            AudioParameterInt intParam ({}, {}, -1, 2, 0);\r
-\r
-            intParam.setValueNotifyingHost (-0.5f);\r
-            expectEquals (intParam.get(), -1);\r
-\r
-            intParam.setValueNotifyingHost (1.5f);\r
-            expectEquals (intParam.get(), 2);\r
-\r
-            intParam = -5;\r
-            expectEquals (intParam.get(), -1);\r
-\r
-            intParam = 5;\r
-            expectEquals (intParam.get(), 2);\r
-        }\r
-    }\r
-} specialisedAudioParameterTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index ec887c8a35111b461285c02e7651c2643f16a893..af86714488d68a2e2d7089e07c6f5f37403dd34a 100644 (file)
 namespace juce\r
 {\r
 \r
-//==============================================================================\r
-AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID,\r
-                                                    const String& parameterName,\r
-                                                    const String& labelText,\r
-                                                    NormalisableRange<float> valueRange,\r
-                                                    float defaultValue,\r
-                                                    std::function<String (float)> valueToTextFunction,\r
-                                                    std::function<float (const String&)> textToValueFunction,\r
-                                                    bool isMetaParameter,\r
-                                                    bool isAutomatableParameter,\r
-                                                    bool isDiscrete,\r
-                                                    AudioProcessorParameter::Category category,\r
-                                                    bool isBoolean)\r
-    : AudioParameterFloat (parameterID,\r
-                           parameterName,\r
-                           valueRange,\r
-                           defaultValue,\r
-                           labelText,\r
-                           category,\r
-                           valueToTextFunction == nullptr ? std::function<String (float v, int)>()\r
-                                                          : [valueToTextFunction](float v, int) { return valueToTextFunction (v); },\r
-                           std::move (textToValueFunction)),\r
-      unsnappedDefault (valueRange.convertTo0to1 (defaultValue)),\r
-      metaParameter (isMetaParameter),\r
-      automatable (isAutomatableParameter),\r
-      discrete (isDiscrete),\r
-      boolean (isBoolean)\r
+struct AudioProcessorValueTreeState::Parameter   : public AudioProcessorParameterWithID,\r
+                                                   private ValueTree::Listener\r
 {\r
-}\r
+    Parameter (AudioProcessorValueTreeState& s,\r
+               const String& parameterID, const String& paramName, const String& labelText,\r
+               NormalisableRange<float> r, float defaultVal,\r
+               std::function<String (float)> valueToText,\r
+               std::function<float (const String&)> textToValue,\r
+               bool meta,\r
+               bool automatable,\r
+               bool discrete,\r
+               AudioProcessorParameter::Category category,\r
+               bool boolean)\r
+        : AudioProcessorParameterWithID (parameterID, paramName, labelText, category),\r
+          owner (s), valueToTextFunction (valueToText), textToValueFunction (textToValue),\r
+          range (r), value (defaultVal), defaultValue (defaultVal),\r
+          listenersNeedCalling (true),\r
+          isMetaParam (meta),\r
+          isAutomatableParam (automatable),\r
+          isDiscreteParam (discrete),\r
+          isBooleanParam (boolean)\r
+    {\r
+        value = defaultValue;\r
+        state.addListener (this);\r
+    }\r
 \r
-float AudioProcessorValueTreeState::Parameter::getDefaultValue() const  { return unsnappedDefault; }\r
-int AudioProcessorValueTreeState::Parameter::getNumSteps() const        { return RangedAudioParameter::getNumSteps(); }\r
+    ~Parameter()\r
+    {\r
+        // should have detached all callbacks before destroying the parameters!\r
+        jassert (listeners.size() <= 1);\r
+    }\r
 \r
-bool AudioProcessorValueTreeState::Parameter::isMetaParameter() const   { return metaParameter; }\r
-bool AudioProcessorValueTreeState::Parameter::isAutomatable() const     { return automatable; }\r
-bool AudioProcessorValueTreeState::Parameter::isDiscrete() const        { return discrete; }\r
-bool AudioProcessorValueTreeState::Parameter::isBoolean() const         { return boolean; }\r
+    float getValue() const override                             { return range.convertTo0to1 (value); }\r
+    float getDefaultValue() const override                      { return range.convertTo0to1 (defaultValue); }\r
 \r
-//==============================================================================\r
-class AudioProcessorValueTreeState::ParameterAdapter   : private AudioProcessorParameter::Listener\r
-{\r
-private:\r
-    using Listener = AudioProcessorValueTreeState::Listener;\r
-\r
-public:\r
-    explicit ParameterAdapter (RangedAudioParameter& parameterIn)\r
-        : parameter (parameterIn),\r
-          // For legacy reasons, the unnormalised value should *not* be snapped on construction\r
-          unnormalisedValue (getRange().convertFrom0to1 (parameter.getDefaultValue()))\r
+    float getValueForText (const String& text) const override\r
     {\r
-        parameter.addListener (this);\r
+        return range.convertTo0to1 (textToValueFunction != nullptr ? textToValueFunction (text)\r
+                                                                   : text.getFloatValue());\r
     }\r
 \r
-    ~ParameterAdapter() noexcept        { parameter.removeListener (this); }\r
+    String getText (float v, int length) const override\r
+    {\r
+        return valueToTextFunction != nullptr ? valueToTextFunction (range.convertFrom0to1 (v))\r
+                                              : AudioProcessorParameter::getText (v, length);\r
+    }\r
 \r
-    void addListener (Listener* l)      { listeners.add (l); }\r
-    void removeListener (Listener* l)   { listeners.remove (l); }\r
+    int getNumSteps() const override\r
+    {\r
+        if (range.interval > 0)\r
+            return (static_cast<int> ((range.end - range.start) / range.interval) + 1);\r
 \r
-    RangedAudioParameter& getParameter()                { return parameter; }\r
-    const RangedAudioParameter& getParameter() const    { return parameter; }\r
+        return AudioProcessor::getDefaultNumParameterSteps();\r
+    }\r
 \r
-    const NormalisableRange<float>& getRange() const    { return parameter.getNormalisableRange(); }\r
+    void setValue (float newValue) override\r
+    {\r
+        newValue = range.snapToLegalValue (range.convertFrom0to1 (newValue));\r
 \r
-    float getDenormalisedDefaultValue() const    { return denormalise (parameter.getDefaultValue()); }\r
+        if (value != newValue || listenersNeedCalling)\r
+        {\r
+            value = newValue;\r
 \r
-    void setDenormalisedValue (float value)\r
-    {\r
-        if (value == unnormalisedValue)\r
-            return;\r
+            listeners.call ([=] (AudioProcessorValueTreeState::Listener& l) { l.parameterChanged (paramID, value); });\r
+            listenersNeedCalling = false;\r
 \r
-        setNormalisedValue (normalise (value));\r
+            needsUpdate = true;\r
+        }\r
     }\r
 \r
-    float getDenormalisedValueForText (const String& text) const\r
+    void setNewState (const ValueTree& v)\r
     {\r
-        return denormalise (parameter.getValueForText (text));\r
+        state = v;\r
+        updateFromValueTree();\r
     }\r
 \r
-    String getTextForDenormalisedValue (float value) const\r
+    void setUnnormalisedValue (float newUnnormalisedValue)\r
     {\r
-        return parameter.getText (normalise (value), 0);\r
+        if (value != newUnnormalisedValue)\r
+        {\r
+            const float newValue = range.convertTo0to1 (newUnnormalisedValue);\r
+            setValueNotifyingHost (newValue);\r
+        }\r
     }\r
 \r
-    float getDenormalisedValue() const   { return unnormalisedValue; }\r
-    float& getRawDenormalisedValue()     { return unnormalisedValue; }\r
-\r
-    bool flushToTree (ValueTree tree, const Identifier& key, UndoManager* um)\r
+    void updateFromValueTree()\r
     {\r
-        auto needsUpdateTestValue = true;\r
-\r
-        if (! needsUpdate.compare_exchange_strong (needsUpdateTestValue, false))\r
-            return false;\r
+        setUnnormalisedValue (state.getProperty (owner.valuePropertyID, defaultValue));\r
+    }\r
 \r
-        if (auto valueProperty = tree.getPropertyPointer (key))\r
+    void copyValueToValueTree()\r
+    {\r
+        if (auto* valueProperty = state.getPropertyPointer (owner.valuePropertyID))\r
         {\r
-            if ((float) *valueProperty != unnormalisedValue)\r
+            if ((float) *valueProperty != value)\r
             {\r
                 ScopedValueSetter<bool> svs (ignoreParameterChangedCallbacks, true);\r
-                tree.setProperty (key, unnormalisedValue, um);\r
+                state.setProperty (owner.valuePropertyID, value, owner.undoManager);\r
             }\r
         }\r
         else\r
         {\r
-            tree.setProperty (key, unnormalisedValue, nullptr);\r
+            state.setProperty (owner.valuePropertyID, value, nullptr);\r
         }\r
-\r
-        return true;\r
-    }\r
-\r
-private:\r
-    void parameterGestureChanged (int, bool) override {}\r
-\r
-    void parameterValueChanged (int, float) override\r
-    {\r
-        const auto newValue = denormalise (parameter.getValue());\r
-\r
-        if (unnormalisedValue == newValue && ! listenersNeedCalling)\r
-            return;\r
-\r
-        unnormalisedValue = newValue;\r
-        listeners.call ([=](Listener& l) { l.parameterChanged (parameter.paramID, unnormalisedValue); });\r
-        listenersNeedCalling = false;\r
-        needsUpdate = true;\r
-    }\r
-\r
-    float denormalise (float normalised) const\r
-    {\r
-        return getParameter().convertFrom0to1 (normalised);\r
-    }\r
-\r
-    float normalise (float denormalised) const\r
-    {\r
-        return getParameter().convertTo0to1 (denormalised);\r
     }\r
 \r
-    void setNormalisedValue (float value)\r
+    void valueTreePropertyChanged (ValueTree&, const Identifier& property) override\r
     {\r
         if (ignoreParameterChangedCallbacks)\r
             return;\r
 \r
-        parameter.setValueNotifyingHost (value);\r
+        if (property == owner.valuePropertyID)\r
+            updateFromValueTree();\r
     }\r
 \r
-    RangedAudioParameter& parameter;\r
-    ListenerList<Listener> listeners;\r
-    float unnormalisedValue{};\r
-    std::atomic<bool> needsUpdate { true };\r
-    bool listenersNeedCalling { true }, ignoreParameterChangedCallbacks { false };\r
-};\r
+    void valueTreeChildAdded (ValueTree&, ValueTree&) override {}\r
+    void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override {}\r
+    void valueTreeChildOrderChanged (ValueTree&, int, int) override {}\r
+    void valueTreeParentChanged (ValueTree&) override {}\r
 \r
-//==============================================================================\r
-AudioProcessorValueTreeState::AudioProcessorValueTreeState (AudioProcessor& processorToConnectTo,\r
-                                                            UndoManager* undoManagerToUse,\r
-                                                            const juce::Identifier& valueTreeType,\r
-                                                            ParameterLayout parameterLayout)\r
-    : AudioProcessorValueTreeState (processorToConnectTo, undoManagerToUse)\r
-{\r
-    struct PushBackVisitor : ParameterLayout::Visitor\r
+    static Parameter* getParameterForID (AudioProcessor& processor, StringRef paramID) noexcept\r
     {\r
-        explicit PushBackVisitor (AudioProcessorValueTreeState& stateIn)\r
-            : state (&stateIn) {}\r
-\r
-        void visit (std::unique_ptr<RangedAudioParameter> param) const override\r
-        {\r
-            if (param == nullptr)\r
-            {\r
-                jassertfalse;\r
-                return;\r
-            }\r
-\r
-            state->parameters.emplace_back (std::make_unique<ParameterAdapter> (*param));\r
-            state->processor.addParameter (param.release());\r
-        }\r
-\r
-        void visit (std::unique_ptr<AudioProcessorParameterGroup> group) const override\r
+        for (auto* ap : processor.getParameters())\r
         {\r
-            if (group == nullptr)\r
-            {\r
-                jassertfalse;\r
-                return;\r
-            }\r
+            // When using this class, you must allow it to manage all the parameters in your AudioProcessor, and\r
+            // not add any parameter objects of other types!\r
+            jassert (dynamic_cast<Parameter*> (ap) != nullptr);\r
 \r
-            for (const auto param : group->getParameters (true))\r
-            {\r
-                if (const auto rangedParam = dynamic_cast<RangedAudioParameter*> (param))\r
-                {\r
-                    state->parameters.emplace_back (std::make_unique<ParameterAdapter> (*rangedParam));\r
-                }\r
-                else\r
-                {\r
-                    // If you hit this assertion then you are attempting to add a parameter that is\r
-                    // not derived from RangedAudioParameter to the AudioProcessorValueTreeState.\r
-                    jassertfalse;\r
-                }\r
-            }\r
+            auto* p = static_cast<Parameter*> (ap);\r
 \r
-            state->processor.addParameterGroup (move (group));\r
+            if (paramID == p->paramID)\r
+                return p;\r
         }\r
 \r
-        AudioProcessorValueTreeState* state;\r
-    };\r
+        return nullptr;\r
+    }\r
 \r
-    for (auto& item : parameterLayout.parameters)\r
-        item->accept (PushBackVisitor (*this));\r
+    bool isMetaParameter() const override      { return isMetaParam; }\r
+    bool isAutomatable() const override        { return isAutomatableParam; }\r
+    bool isDiscrete() const override           { return isDiscreteParam; }\r
+    bool isBoolean() const override            { return isBooleanParam; }\r
 \r
-    state = ValueTree (valueTreeType);\r
-}\r
+    AudioProcessorValueTreeState& owner;\r
+    ValueTree state;\r
+    ListenerList<AudioProcessorValueTreeState::Listener> listeners;\r
+    std::function<String (float)> valueToTextFunction;\r
+    std::function<float (const String&)> textToValueFunction;\r
+    NormalisableRange<float> range;\r
+    float value, defaultValue;\r
+    std::atomic<bool> needsUpdate { true };\r
+    bool listenersNeedCalling;\r
+    const bool isMetaParam, isAutomatableParam, isDiscreteParam, isBooleanParam;\r
+    bool ignoreParameterChangedCallbacks = false;\r
+\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Parameter)\r
+};\r
 \r
+//==============================================================================\r
 AudioProcessorValueTreeState::AudioProcessorValueTreeState (AudioProcessor& p, UndoManager* um)\r
     : processor (p), undoManager (um)\r
 {\r
@@ -244,98 +194,64 @@ AudioProcessorValueTreeState::AudioProcessorValueTreeState (AudioProcessor& p, U
 \r
 AudioProcessorValueTreeState::~AudioProcessorValueTreeState() {}\r
 \r
-//==============================================================================\r
-RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (const String& paramID,\r
-                                                                           const String& paramName,\r
-                                                                           const String& labelText,\r
-                                                                           NormalisableRange<float> range,\r
-                                                                           float defaultVal,\r
-                                                                           std::function<String (float)> valueToTextFunction,\r
-                                                                           std::function<float (const String&)> textToValueFunction,\r
-                                                                           bool isMetaParameter,\r
-                                                                           bool isAutomatableParameter,\r
-                                                                           bool isDiscreteParameter,\r
-                                                                           AudioProcessorParameter::Category category,\r
-                                                                           bool isBooleanParameter)\r
-{\r
-    return createAndAddParameter (std::make_unique<Parameter> (paramID,\r
-                                                               paramName,\r
-                                                               labelText,\r
-                                                               range,\r
-                                                               defaultVal,\r
-                                                               std::move (valueToTextFunction),\r
-                                                               std::move (textToValueFunction),\r
-                                                               isMetaParameter,\r
-                                                               isAutomatableParameter,\r
-                                                               isDiscreteParameter,\r
-                                                               category,\r
-                                                               isBooleanParameter));\r
-}\r
-\r
-RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (std::unique_ptr<RangedAudioParameter> param)\r
+AudioProcessorParameterWithID* AudioProcessorValueTreeState::createAndAddParameter (const String& paramID, const String& paramName,\r
+                                                                                    const String& labelText, NormalisableRange<float> r,\r
+                                                                                    float defaultVal, std::function<String (float)> valueToTextFunction,\r
+                                                                                    std::function<float (const String&)> textToValueFunction,\r
+                                                                                    bool isMetaParameter,\r
+                                                                                    bool isAutomatableParameter,\r
+                                                                                    bool isDiscreteParameter,\r
+                                                                                    AudioProcessorParameter::Category category,\r
+                                                                                    bool isBooleanParameter)\r
 {\r
     // All parameters must be created before giving this manager a ValueTree state!\r
     jassert (! state.isValid());\r
 \r
-    if (getParameter (param->paramID) != nullptr)\r
-        return nullptr;\r
-\r
-    parameters.emplace_back (std::make_unique<ParameterAdapter> (*param));\r
-    processor.addParameter (param.get());\r
-\r
-    return param.release();\r
-}\r
-\r
-//==============================================================================\r
-AudioProcessorValueTreeState::ParameterAdapter* AudioProcessorValueTreeState::getParameterAdapter (StringRef paramID) const\r
-{\r
-    auto it = find_if (std::begin (parameters), std::end (parameters),\r
-                       [&](const std::unique_ptr<ParameterAdapter>& p) { return p->getParameter().paramID == paramID; });\r
-    return it == std::end (parameters) ? nullptr : it->get();\r
+    Parameter* p = new Parameter (*this, paramID, paramName, labelText, r,\r
+                                  defaultVal, valueToTextFunction, textToValueFunction,\r
+                                  isMetaParameter, isAutomatableParameter,\r
+                                  isDiscreteParameter, category, isBooleanParameter);\r
+    processor.addParameter (p);\r
+    return p;\r
 }\r
 \r
 void AudioProcessorValueTreeState::addParameterListener (StringRef paramID, Listener* listener)\r
 {\r
-    if (auto* p = getParameterAdapter (paramID))\r
-        p->addListener (listener);\r
+    if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+        p->listeners.add (listener);\r
 }\r
 \r
 void AudioProcessorValueTreeState::removeParameterListener (StringRef paramID, Listener* listener)\r
 {\r
-    if (auto* p = getParameterAdapter (paramID))\r
-        p->removeListener (listener);\r
+    if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+        p->listeners.remove (listener);\r
 }\r
 \r
 Value AudioProcessorValueTreeState::getParameterAsValue (StringRef paramID) const\r
 {\r
-    auto v = getChildValueTree (paramID);\r
-\r
-    if (v.isValid())\r
-        return v.getPropertyAsValue (valuePropertyID, undoManager);\r
+    if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+        return p->state.getPropertyAsValue (valuePropertyID, undoManager);\r
 \r
     return {};\r
 }\r
 \r
 NormalisableRange<float> AudioProcessorValueTreeState::getParameterRange (StringRef paramID) const noexcept\r
 {\r
-    if (auto* p = getParameterAdapter (paramID))\r
-        return p->getRange();\r
+    if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+        return p->range;\r
 \r
-    return {};\r
+    return NormalisableRange<float>();\r
 }\r
 \r
-RangedAudioParameter* AudioProcessorValueTreeState::getParameter (StringRef paramID) const noexcept\r
+AudioProcessorParameterWithID* AudioProcessorValueTreeState::getParameter (StringRef paramID) const noexcept\r
 {\r
-    if (auto adapter = getParameterAdapter (paramID))\r
-        return &adapter->getParameter();\r
-\r
-    return nullptr;\r
+    return Parameter::getParameterForID (processor, paramID);\r
 }\r
 \r
 float* AudioProcessorValueTreeState::getRawParameterValue (StringRef paramID) const noexcept\r
 {\r
-    if (auto* p = getParameterAdapter (paramID))\r
-        return &p->getRawDenormalisedValue();\r
+    if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+        return &(p->value);\r
 \r
     return nullptr;\r
 }\r
@@ -343,7 +259,9 @@ float* AudioProcessorValueTreeState::getRawParameterValue (StringRef paramID) co
 ValueTree AudioProcessorValueTreeState::copyState()\r
 {\r
     ScopedLock lock (valueTreeChanging);\r
+\r
     flushParameterValuesToValueTree();\r
+\r
     return state.createCopy();\r
 }\r
 \r
@@ -357,14 +275,9 @@ void AudioProcessorValueTreeState::replaceState (const ValueTree& newState)
         undoManager->clearUndoHistory();\r
 }\r
 \r
-ValueTree AudioProcessorValueTreeState::getChildValueTree (const String& paramID) const\r
-{\r
-    return { state.getChildWithProperty (idPropertyID, paramID) };\r
-}\r
-\r
 ValueTree AudioProcessorValueTreeState::getOrCreateChildValueTree (const String& paramID)\r
 {\r
-    auto v = getChildValueTree (paramID);\r
+    ValueTree v (state.getChildWithProperty (idPropertyID, paramID));\r
 \r
     if (! v.isValid())\r
     {\r
@@ -376,44 +289,37 @@ ValueTree AudioProcessorValueTreeState::getOrCreateChildValueTree (const String&
     return v;\r
 }\r
 \r
-void AudioProcessorValueTreeState::setNewState (ParameterAdapter& p)\r
-{\r
-    const auto tree = getOrCreateChildValueTree (p.getParameter().paramID);\r
-    p.setDenormalisedValue (tree.getProperty (valuePropertyID, p.getDenormalisedDefaultValue()));\r
-}\r
-\r
 void AudioProcessorValueTreeState::updateParameterConnectionsToChildTrees()\r
 {\r
     ScopedLock lock (valueTreeChanging);\r
 \r
-    for (const auto& p : parameters)\r
-        setNewState (*p);\r
+    for (auto* param : processor.getParameters())\r
+    {\r
+        jassert (dynamic_cast<Parameter*> (param) != nullptr);\r
+        auto* p = static_cast<Parameter*> (param);\r
+\r
+        p->setNewState (getOrCreateChildValueTree (p->paramID));\r
+    }\r
 }\r
 \r
 void AudioProcessorValueTreeState::valueTreePropertyChanged (ValueTree& tree, const Identifier& property)\r
 {\r
-    if (! (tree.hasType (valueType) && tree.getParent() == state))\r
-        return;\r
-\r
-    if (property == idPropertyID)\r
+    if (property == idPropertyID && tree.hasType (valueType) && tree.getParent() == state)\r
         updateParameterConnectionsToChildTrees();\r
-    else if (property == valuePropertyID)\r
-        if (auto adapter = getParameterAdapter (tree.getProperty (idPropertyID).toString()))\r
-            adapter->setDenormalisedValue (tree.getProperty (valuePropertyID));\r
 }\r
 \r
 void AudioProcessorValueTreeState::valueTreeChildAdded (ValueTree& parent, ValueTree& tree)\r
 {\r
     if (parent == state && tree.hasType (valueType))\r
-        if (auto* param = getParameterAdapter (tree.getProperty (idPropertyID).toString()))\r
-            setNewState (*param);\r
+        if (auto* param = Parameter::getParameterForID (processor, tree.getProperty (idPropertyID).toString()))\r
+            param->setNewState (getOrCreateChildValueTree (param->paramID));\r
 }\r
 \r
 void AudioProcessorValueTreeState::valueTreeChildRemoved (ValueTree& parent, ValueTree& tree, int)\r
 {\r
     if (parent == state && tree.hasType (valueType))\r
-        if (auto* param = getParameterAdapter (tree.getProperty (idPropertyID).toString()))\r
-            setNewState (*param);\r
+        if (auto* param = Parameter::getParameterForID (processor, tree.getProperty (idPropertyID).toString()))\r
+            param->setNewState (getOrCreateChildValueTree (param->paramID));\r
 }\r
 \r
 void AudioProcessorValueTreeState::valueTreeRedirected (ValueTree& v)\r
@@ -429,14 +335,23 @@ bool AudioProcessorValueTreeState::flushParameterValuesToValueTree()
 {\r
     ScopedLock lock (valueTreeChanging);\r
 \r
-    bool anyUpdated = false;\r
+    bool anythingUpdated = false;\r
+\r
+    for (auto* ap : processor.getParameters())\r
+    {\r
+        jassert (dynamic_cast<Parameter*> (ap) != nullptr);\r
+        auto* p = static_cast<Parameter*> (ap);\r
 \r
-    for (auto& p : parameters)\r
-        anyUpdated |= p->flushToTree (getChildValueTree (p->getParameter().paramID),\r
-                                      valuePropertyID,\r
-                                      undoManager);\r
+        bool needsUpdateTestValue = true;\r
+\r
+        if (p->needsUpdate.compare_exchange_strong (needsUpdateTestValue, false))\r
+        {\r
+            p->copyValueToValueTree();\r
+            anythingUpdated = true;\r
+        }\r
+    }\r
 \r
-    return anyUpdated;\r
+    return anythingUpdated;\r
 }\r
 \r
 void AudioProcessorValueTreeState::timerCallback()\r
@@ -447,6 +362,9 @@ void AudioProcessorValueTreeState::timerCallback()
                                 : jlimit (50, 500, getTimerInterval() + 20));\r
 }\r
 \r
+AudioProcessorValueTreeState::Listener::Listener() {}\r
+AudioProcessorValueTreeState::Listener::~Listener() {}\r
+\r
 //==============================================================================\r
 struct AttachedControlBase  : public AudioProcessorValueTreeState::Listener,\r
                               public AsyncUpdater\r
@@ -462,12 +380,12 @@ struct AttachedControlBase  : public AudioProcessorValueTreeState::Listener,
         state.removeParameterListener (paramID, this);\r
     }\r
 \r
-    void setNewDenormalisedValue (float newDenormalisedValue)\r
+    void setNewUnnormalisedValue (float newUnnormalisedValue)\r
     {\r
-        if (auto* p = state.getParameter (paramID))\r
+        if (AudioProcessorParameter* p = state.getParameter (paramID))\r
         {\r
             const float newValue = state.getParameterRange (paramID)\r
-                                        .convertTo0to1 (newDenormalisedValue);\r
+                                        .convertTo0to1 (newUnnormalisedValue);\r
 \r
             if (p->getValue() != newValue)\r
                 p->setValueNotifyingHost (newValue);\r
@@ -476,7 +394,7 @@ struct AttachedControlBase  : public AudioProcessorValueTreeState::Listener,
 \r
     void sendInitialUpdate()\r
     {\r
-        if (auto* v = state.getRawParameterValue (paramID))\r
+        if (float* v = state.getRawParameterValue (paramID))\r
             parameterChanged (paramID, *v);\r
     }\r
 \r
@@ -497,7 +415,7 @@ struct AttachedControlBase  : public AudioProcessorValueTreeState::Listener,
 \r
     void beginParameterChange()\r
     {\r
-        if (auto* p = state.getParameter (paramID))\r
+        if (AudioProcessorParameter* p = state.getParameter (paramID))\r
         {\r
             if (state.undoManager != nullptr)\r
                 state.undoManager->beginNewTransaction();\r
@@ -535,54 +453,57 @@ struct AudioProcessorValueTreeState::SliderAttachment::Pimpl  : private Attached
     {\r
         NormalisableRange<float> range (state.getParameterRange (paramID));\r
 \r
-        if (auto* param = state.getParameterAdapter (paramID))\r
-        {\r
-            slider.valueFromTextFunction = [param](const String& text) { return (double) param->getDenormalisedValueForText (text); };\r
-            slider.textFromValueFunction = [param](double value) { return param->getTextForDenormalisedValue ((float) value); };\r
-            slider.setDoubleClickReturnValue (true, range.convertFrom0to1 (param->getParameter().getDefaultValue()));\r
-        }\r
-\r
-        if (range.interval != 0.0f || range.skew != 1.0f)\r
+        if (range.interval != 0 || range.skew != 0)\r
         {\r
             slider.setRange (range.start, range.end, range.interval);\r
             slider.setSkewFactor (range.skew, range.symmetricSkew);\r
         }\r
         else\r
         {\r
-            auto convertFrom0To1Function = [range](double currentRangeStart,\r
-                                                   double currentRangeEnd,\r
-                                                   double normalisedValue) mutable\r
+            auto convertFrom0To1Function = [range] (double currentRangeStart,\r
+                                                    double currentRangeEnd,\r
+                                                    double normalisedValue) mutable\r
             {\r
                 range.start = (float) currentRangeStart;\r
                 range.end = (float) currentRangeEnd;\r
                 return (double) range.convertFrom0to1 ((float) normalisedValue);\r
             };\r
 \r
-            auto convertTo0To1Function = [range](double currentRangeStart,\r
-                                                 double currentRangeEnd,\r
-                                                 double mappedValue) mutable\r
+            auto convertTo0To1Function = [range] (double currentRangeStart,\r
+                                                  double currentRangeEnd,\r
+                                                  double mappedValue) mutable\r
             {\r
                 range.start = (float) currentRangeStart;\r
                 range.end = (float) currentRangeEnd;\r
                 return (double) range.convertTo0to1 ((float) mappedValue);\r
             };\r
 \r
-            auto snapToLegalValueFunction = [range](double currentRangeStart,\r
-                                                    double currentRangeEnd,\r
-                                                    double valueToSnap) mutable\r
+            auto snapToLegalValueFunction = [range] (double currentRangeStart,\r
+                                                     double currentRangeEnd,\r
+                                                     double valueToSnap) mutable\r
             {\r
                 range.start = (float) currentRangeStart;\r
                 range.end = (float) currentRangeEnd;\r
                 return (double) range.snapToLegalValue ((float) valueToSnap);\r
             };\r
 \r
-            slider.setNormalisableRange ({ (double) range.start,\r
-                                           (double) range.end,\r
+            slider.setNormalisableRange ({ (double) range.start, (double) range.end,\r
                                            convertFrom0To1Function,\r
                                            convertTo0To1Function,\r
                                            snapToLegalValueFunction });\r
         }\r
 \r
+        if (auto* param = dynamic_cast<AudioProcessorValueTreeState::Parameter*> (state.getParameter (paramID)))\r
+        {\r
+            if (param->textToValueFunction != nullptr)\r
+                slider.valueFromTextFunction = [param] (const String& text) { return (double) param->textToValueFunction (text); };\r
+\r
+            if (param->valueToTextFunction != nullptr)\r
+                slider.textFromValueFunction = [param] (double value)       { return param->valueToTextFunction ((float) value); };\r
+\r
+            slider.setDoubleClickReturnValue (true, range.convertFrom0to1 (param->getDefaultValue()));\r
+        }\r
+\r
         sendInitialUpdate();\r
         slider.addListener (this);\r
     }\r
@@ -608,11 +529,11 @@ struct AudioProcessorValueTreeState::SliderAttachment::Pimpl  : private Attached
         const ScopedLock selfCallbackLock (selfCallbackMutex);\r
 \r
         if ((! ignoreCallbacks) && (! ModifierKeys::currentModifiers.isRightButtonDown()))\r
-            setNewDenormalisedValue ((float) s->getValue());\r
+            setNewUnnormalisedValue ((float) s->getValue());\r
     }\r
 \r
-    void sliderDragStarted (Slider*) override   { beginParameterChange(); }\r
-    void sliderDragEnded   (Slider*) override   { endParameterChange(); }\r
+    void sliderDragStarted (Slider*) override { beginParameterChange(); }\r
+    void sliderDragEnded   (Slider*) override { endParameterChange();   }\r
 \r
     Slider& slider;\r
     bool ignoreCallbacks;\r
@@ -649,37 +570,21 @@ struct AudioProcessorValueTreeState::ComboBoxAttachment::Pimpl  : private Attach
     {\r
         const ScopedLock selfCallbackLock (selfCallbackMutex);\r
 \r
-        if (state.getParameter (paramID) != nullptr)\r
         {\r
-            auto normValue = state.getParameterRange (paramID)\r
-                                  .convertTo0to1 (newValue);\r
-            auto index = roundToInt (normValue * (combo.getNumItems() - 1));\r
-\r
-            if (index != combo.getSelectedItemIndex())\r
-            {\r
-                ScopedValueSetter<bool> svs (ignoreCallbacks, true);\r
-                combo.setSelectedItemIndex (index, sendNotificationSync);\r
-            }\r
+            ScopedValueSetter<bool> svs (ignoreCallbacks, true);\r
+            combo.setSelectedItemIndex (roundToInt (newValue), sendNotificationSync);\r
         }\r
     }\r
 \r
-    void comboBoxChanged (ComboBox*) override\r
+    void comboBoxChanged (ComboBox* comboBox) override\r
     {\r
         const ScopedLock selfCallbackLock (selfCallbackMutex);\r
 \r
         if (! ignoreCallbacks)\r
         {\r
-            if (auto* p = state.getParameter (paramID))\r
-            {\r
-                auto newValue = (float) combo.getSelectedItemIndex() / (combo.getNumItems() - 1);\r
-\r
-                if (p->getValue() != newValue)\r
-                {\r
-                    beginParameterChange();\r
-                    p->setValueNotifyingHost (newValue);\r
-                    endParameterChange();\r
-                }\r
-            }\r
+            beginParameterChange();\r
+            setNewUnnormalisedValue ((float) comboBox->getSelectedId() - 1.0f);\r
+            endParameterChange();\r
         }\r
     }\r
 \r
@@ -731,7 +636,7 @@ struct AudioProcessorValueTreeState::ButtonAttachment::Pimpl  : private Attached
         if (! ignoreCallbacks)\r
         {\r
             beginParameterChange();\r
-            setNewDenormalisedValue (b->getToggleState() ? 1.0f : 0.0f);\r
+            setNewUnnormalisedValue (b->getToggleState() ? 1.0f : 0.0f);\r
             endParameterChange();\r
         }\r
     }\r
@@ -750,431 +655,4 @@ AudioProcessorValueTreeState::ButtonAttachment::ButtonAttachment (AudioProcessor
 \r
 AudioProcessorValueTreeState::ButtonAttachment::~ButtonAttachment() {}\r
 \r
-#if JUCE_UNIT_TESTS\r
-\r
-static struct ParameterAdapterTests final   : public UnitTest\r
-{\r
-    ParameterAdapterTests() : UnitTest ("Parameter Adapter") {}\r
-\r
-    void runTest() override\r
-    {\r
-        beginTest ("The default value is returned correctly");\r
-        {\r
-            const auto test = [&] (NormalisableRange<float> range, float value)\r
-            {\r
-                AudioParameterFloat param ({}, {}, range, value, {});\r
-\r
-                AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
-                expectEquals (adapter.getDenormalisedDefaultValue(), value);\r
-            };\r
-\r
-            test ({ -100, 100 }, 0);\r
-            test ({ -2.5, 12.5 }, 10);\r
-        }\r
-\r
-        beginTest ("Denormalised parameter values can be retrieved");\r
-        {\r
-            const auto test = [&](NormalisableRange<float> range, float value)\r
-            {\r
-                AudioParameterFloat param ({}, {}, range, {}, {});\r
-                AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
-                adapter.setDenormalisedValue (value);\r
-\r
-                expectEquals (adapter.getDenormalisedValue(), value);\r
-                expectEquals (adapter.getRawDenormalisedValue(), value);\r
-            };\r
-\r
-            test ({ -20, -10 }, -15);\r
-            test ({ 0, 7.5 }, 2.5);\r
-        }\r
-\r
-        beginTest ("Floats can be converted to text");\r
-        {\r
-            const auto test = [&](NormalisableRange<float> range, float value, juce::String expected)\r
-            {\r
-                AudioParameterFloat param ({}, {}, range, {}, {});\r
-                AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
-                expectEquals (adapter.getTextForDenormalisedValue (value), expected);\r
-            };\r
-\r
-            test ({ -100, 100 }, 0, "0.0");\r
-            test ({ -2.5, 12.5 }, 10, "10.0");\r
-            test ({ -20, -10 }, -15, "-15.0");\r
-            test ({ 0, 7.5 }, 2.5, "2.5");\r
-        }\r
-\r
-        beginTest ("Text can be converted to floats");\r
-        {\r
-            const auto test = [&](NormalisableRange<float> range, juce::String text, float expected)\r
-            {\r
-                AudioParameterFloat param ({}, {}, range, {}, {});\r
-                AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
-                expectEquals (adapter.getDenormalisedValueForText (text), expected);\r
-            };\r
-\r
-            test ({ -100, 100 }, "0.0", 0);\r
-            test ({ -2.5, 12.5 }, "10.0", 10);\r
-            test ({ -20, -10 }, "-15.0", -15);\r
-            test ({ 0, 7.5 }, "2.5", 2.5);\r
-        }\r
-    }\r
-} parameterAdapterTests;\r
-\r
-namespace\r
-{\r
-template <typename ValueType>\r
-inline bool operator== (const NormalisableRange<ValueType>& a,\r
-                        const NormalisableRange<ValueType>& b)\r
-{\r
-    return std::tie (a.start, a.end, a.interval, a.skew, a.symmetricSkew)\r
-           == std::tie (b.start, b.end, b.interval, b.skew, b.symmetricSkew);\r
-}\r
-\r
-template <typename ValueType>\r
-inline bool operator!= (const NormalisableRange<ValueType>& a,\r
-                        const NormalisableRange<ValueType>& b)\r
-{\r
-    return ! (a == b);\r
-}\r
-} // namespace\r
-\r
-static class AudioProcessorValueTreeStateTests final   : public UnitTest\r
-{\r
-private:\r
-    using Parameter = AudioProcessorValueTreeState::Parameter;\r
-    using ParameterGroup = AudioProcessorParameterGroup;\r
-    using ParameterLayout = AudioProcessorValueTreeState::ParameterLayout;\r
-\r
-    class TestAudioProcessor : public AudioProcessor\r
-    {\r
-    public:\r
-        TestAudioProcessor() = default;\r
-\r
-        explicit TestAudioProcessor (ParameterLayout layout)\r
-            : state (*this, nullptr, "state", std::move (layout)) {}\r
-\r
-        const String getName() const override { return {}; }\r
-        void prepareToPlay (double, int) override {}\r
-        void releaseResources() override {}\r
-        void processBlock (AudioBuffer<float>&, MidiBuffer&) override {}\r
-        double getTailLengthSeconds() const override { return {}; }\r
-        bool acceptsMidi() const override { return {}; }\r
-        bool producesMidi() const override { return {}; }\r
-        AudioProcessorEditor* createEditor() override { return {}; }\r
-        bool hasEditor() const override { return {}; }\r
-        int getNumPrograms() override { return 1; }\r
-        int getCurrentProgram() override { return {}; }\r
-        void setCurrentProgram (int) override {}\r
-        const String getProgramName (int) override { return {}; }\r
-        void changeProgramName (int, const String&) override {}\r
-        void getStateInformation (MemoryBlock&) override {}\r
-        void setStateInformation (const void*, int) override {}\r
-\r
-        AudioProcessorValueTreeState state { *this, nullptr };\r
-    };\r
-\r
-    struct Listener final : public AudioProcessorValueTreeState::Listener\r
-    {\r
-        void parameterChanged (const String& idIn, float valueIn) override\r
-        {\r
-            id = idIn;\r
-            value = valueIn;\r
-        }\r
-\r
-        String id;\r
-        float value{};\r
-    };\r
-\r
-public:\r
-    AudioProcessorValueTreeStateTests() : UnitTest ("Audio Processor Value Tree State", "AudioProcessor parameters") {}\r
-\r
-    void runTest() override\r
-    {\r
-        ScopedJuceInitialiser_GUI scopedJuceInitialiser_gui;\r
-\r
-        beginTest ("After calling createAndAddParameter, the number of parameters increases by one");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            proc.state.createAndAddParameter (std::make_unique<Parameter> (String(), String(), String(), NormalisableRange<float>(),\r
-                                                                           0.0f, nullptr, nullptr));\r
-\r
-            expectEquals (proc.getParameters().size(), 1);\r
-        }\r
-\r
-        beginTest ("After creating a normal named parameter, we can later retrieve that parameter");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr));\r
-\r
-            expect (proc.state.getParameter (key) == param);\r
-        }\r
-\r
-        beginTest ("After construction, the value tree has the expected format");\r
-        {\r
-            TestAudioProcessor proc ({\r
-                std::make_unique<AudioProcessorParameterGroup> ("", "", "",\r
-                    std::make_unique<AudioParameterBool> ("a", "", false),\r
-                    std::make_unique<AudioParameterFloat> ("b", "", NormalisableRange<float>{}, 0.0f)),\r
-                std::make_unique<AudioProcessorParameterGroup> ("", "", "",\r
-                    std::make_unique<AudioParameterInt> ("c", "", 0, 1, 0),\r
-                    std::make_unique<AudioParameterChoice> ("d", "", StringArray { "foo", "bar" }, 0)) });\r
-\r
-            const auto valueTree = proc.state.copyState();\r
-\r
-            expectEquals (valueTree.getNumChildren(), 4);\r
-\r
-            for (auto child : valueTree)\r
-            {\r
-                expect (child.hasType ("PARAM"));\r
-                expect (child.hasProperty ("id"));\r
-                expect (child.hasProperty ("value"));\r
-            }\r
-        }\r
-\r
-        beginTest ("Meta parameters can be created");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr, true));\r
-\r
-            expect (param->isMetaParameter());\r
-        }\r
-\r
-        beginTest ("Automatable parameters can be created");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr, false, true));\r
-\r
-            expect (param->isAutomatable());\r
-        }\r
-\r
-        beginTest ("Discrete parameters can be created");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr, false, false, true));\r
-\r
-            expect (param->isDiscrete());\r
-        }\r
-\r
-        beginTest ("Custom category parameters can be created");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr, false, false, false,\r
-                                                                                              AudioProcessorParameter::Category::inputMeter));\r
-\r
-            expect (param->category == AudioProcessorParameter::Category::inputMeter);\r
-        }\r
-\r
-        beginTest ("Boolean parameters can be created");\r
-        {\r
-            TestAudioProcessor proc;\r
-\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr, false, false, false,\r
-                                                                                              AudioProcessorParameter::Category::genericParameter, true));\r
-\r
-            expect (param->isBoolean());\r
-        }\r
-\r
-        beginTest ("After creating a custom named parameter, we can later retrieve that parameter");\r
-        {\r
-            const auto key = "id";\r
-            auto param = std::make_unique<AudioParameterBool> (key, "", false);\r
-            const auto paramPtr = param.get();\r
-\r
-            TestAudioProcessor proc (std::move (param));\r
-\r
-            expect (proc.state.getParameter (key) == paramPtr);\r
-        }\r
-\r
-        beginTest ("After adding a normal parameter that already exists, the AudioProcessor parameters are unchanged");\r
-        {\r
-            TestAudioProcessor proc;\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr));\r
-\r
-            proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                           0.0f, nullptr, nullptr));\r
-\r
-            expectEquals (proc.getParameters().size(), 1);\r
-            expect (proc.getParameters().getFirst() == param);\r
-        }\r
-\r
-        beginTest ("After setting a parameter value, that value is reflected in the state");\r
-        {\r
-            TestAudioProcessor proc;\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr));\r
-\r
-            const auto value = 0.5f;\r
-            param->setValueNotifyingHost (value);\r
-\r
-            expectEquals (*proc.state.getRawParameterValue (key), value);\r
-        }\r
-\r
-        beginTest ("After adding an APVTS::Parameter, its value is the default value");\r
-        {\r
-            TestAudioProcessor proc;\r
-            const auto key = "id";\r
-            const auto value = 5.0f;\r
-\r
-            proc.state.createAndAddParameter (std::make_unique<Parameter> (\r
-                key,\r
-                String(),\r
-                String(),\r
-                juce::NormalisableRange<float> (0.0f, 100.0f, 10.0f),\r
-                value,\r
-                nullptr,\r
-                nullptr));\r
-\r
-            expectEquals (*proc.state.getRawParameterValue (key), value);\r
-        }\r
-\r
-        beginTest ("Listeners receive notifications when parameters change");\r
-        {\r
-            Listener listener;\r
-            TestAudioProcessor proc;\r
-            const auto key = "id";\r
-            const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                              0.0f, nullptr, nullptr));\r
-            proc.state.addParameterListener (key, &listener);\r
-\r
-            const auto value = 0.5f;\r
-            param->setValueNotifyingHost (value);\r
-\r
-            expectEquals (listener.id, String { key });\r
-            expectEquals (listener.value, value);\r
-        }\r
-\r
-        beginTest ("Bool parameters have a range of 0-1");\r
-        {\r
-            const auto key = "id";\r
-\r
-            TestAudioProcessor proc (std::make_unique<AudioParameterBool> (key, "", false));\r
-\r
-            expect (proc.state.getParameterRange (key) == NormalisableRange<float> (0.0f, 1.0f, 1.0f));\r
-        }\r
-\r
-        beginTest ("Float parameters retain their specified range");\r
-        {\r
-            const auto key = "id";\r
-            const auto range = NormalisableRange<float> { -100, 100, 0.7f, 0.2f, true };\r
-\r
-            TestAudioProcessor proc (std::make_unique<AudioParameterFloat> (key, "", range, 0.0f));\r
-\r
-            expect (proc.state.getParameterRange (key) == range);\r
-        }\r
-\r
-        beginTest ("Int parameters retain their specified range");\r
-        {\r
-            const auto key = "id";\r
-            const auto min = -27;\r
-            const auto max = 53;\r
-\r
-            TestAudioProcessor proc (std::make_unique<AudioParameterInt> (key, "", min, max, 0));\r
-\r
-            expect (proc.state.getParameterRange (key) == NormalisableRange<float> (float (min), float (max)));\r
-        }\r
-\r
-        beginTest ("Choice parameters retain their specified range");\r
-        {\r
-            const auto key = "id";\r
-            const auto choices = StringArray { "", "", "" };\r
-\r
-            TestAudioProcessor proc (std::make_unique<AudioParameterChoice> (key, "", choices, 0));\r
-\r
-            expect (proc.state.getParameterRange (key) == NormalisableRange<float> (0.0f, (float) (choices.size() - 1)));\r
-            expect (proc.state.getParameter (key)->getNumSteps() == choices.size());\r
-        }\r
-\r
-        beginTest ("When the parameter value is changed, normal parameter values are updated");\r
-        {\r
-            TestAudioProcessor proc;\r
-            const auto key = "id";\r
-            auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                                        0.0f, nullptr, nullptr));\r
-            proc.state.state = ValueTree { "state" };\r
-\r
-            const auto newValue = 0.75f;\r
-            auto value = proc.state.getParameterAsValue (key);\r
-            value = newValue;\r
-\r
-            expectEquals (param->getValue(), newValue);\r
-            expectEquals (*proc.state.getRawParameterValue (key), newValue);\r
-        }\r
-\r
-        beginTest ("When the parameter value is changed, custom parameter values are updated");\r
-        {\r
-            const auto key = "id";\r
-            const auto choices = StringArray ("foo", "bar", "baz");\r
-            auto param = std::make_unique<AudioParameterChoice> (key, "", choices, 0);\r
-            const auto paramPtr = param.get();\r
-            TestAudioProcessor proc (std::move (param));\r
-\r
-            const auto newValue = 2.0f;\r
-            auto value = proc.state.getParameterAsValue (key);\r
-            value = newValue;\r
-\r
-            expectEquals (paramPtr->getCurrentChoiceName(), choices[int (newValue)]);\r
-            expectEquals (*proc.state.getRawParameterValue (key), newValue);\r
-        }\r
-\r
-        beginTest ("When the parameter value is changed, listeners are notified");\r
-        {\r
-            Listener listener;\r
-            TestAudioProcessor proc;\r
-            const auto key = "id";\r
-            proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
-                                                                           0.0f, nullptr, nullptr));\r
-            proc.state.addParameterListener (key, &listener);\r
-            proc.state.state = ValueTree { "state" };\r
-\r
-            const auto newValue = 0.75f;\r
-            proc.state.getParameterAsValue (key) = newValue;\r
-\r
-            expectEquals (listener.value, newValue);\r
-            expectEquals (listener.id, String { key });\r
-        }\r
-\r
-        beginTest ("When the parameter value is changed, listeners are notified");\r
-        {\r
-            const auto key = "id";\r
-            const auto choices = StringArray { "foo", "bar", "baz" };\r
-            Listener listener;\r
-            TestAudioProcessor proc (std::make_unique<AudioParameterChoice> (key, "", choices, 0));\r
-            proc.state.addParameterListener (key, &listener);\r
-\r
-            const auto newValue = 2.0f;\r
-            proc.state.getParameterAsValue (key) = newValue;\r
-\r
-            expectEquals (listener.value, newValue);\r
-            expectEquals (listener.id, String (key));\r
-        }\r
-    }\r
-} audioProcessorValueTreeStateTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index f0b7e04c389c67c7eb070dd8b351316ce74226c3..509410ac03de7472e493abf76fb839661afdd439 100644 (file)
@@ -28,9 +28,9 @@ namespace juce
 {\r
 \r
 /**\r
-    This class contains a ValueTree that is used to manage an AudioProcessor's entire state.\r
+    This class contains a ValueTree which is used to manage an AudioProcessor's entire state.\r
 \r
-    It has its own internal class of parameter object that is linked to values\r
+    It has its own internal class of parameter object which are linked to values\r
     within its ValueTree, and which are each identified by a string ID.\r
 \r
     You can get access to the underlying ValueTree object via the state member variable,\r
@@ -39,258 +39,86 @@ namespace juce
     It also provides some utility child classes for connecting parameters directly to\r
     GUI controls like sliders.\r
 \r
-    The favoured constructor of this class takes a collection of RangedAudioParameters or\r
-    AudioProcessorParameterGroups of RangedAudioParameters and adds them to the attached\r
-    AudioProcessor directly.\r
-\r
-    The deprecated way of using this class is as follows:\r
-\r
+    To use:\r
     1) Create an AudioProcessorValueTreeState, and give it some parameters using createAndAddParameter().\r
     2) Initialise the state member variable with a type name.\r
 \r
-    The deprecated constructor will be removed from the API in a future version of JUCE!\r
-\r
     @tags{Audio}\r
 */\r
-class JUCE_API AudioProcessorValueTreeState   : private Timer,\r
+class JUCE_API  AudioProcessorValueTreeState  : private Timer,\r
                                                 private ValueTree::Listener\r
 {\r
 public:\r
-    //==============================================================================\r
-    /** A class to contain a set of RangedAudioParameters and AudioProcessorParameterGroups\r
-        containing RangedAudioParameters.\r
-\r
-        This class is used in the AudioProcessorValueTreeState constructor to allow\r
-        arbitrarily grouped RangedAudioParameters to be passed to an AudioProcessor.\r
-    */\r
-    class JUCE_API ParameterLayout final\r
-    {\r
-    private:\r
-        //==============================================================================\r
-        template <typename It>\r
-        using ValidIfIterator = decltype (std::next (std::declval<It>()));\r
-\r
-    public:\r
-        //==============================================================================\r
-        template <typename... Items>\r
-        ParameterLayout (std::unique_ptr<Items>... items) { add (std::move (items)...); }\r
-\r
-        template <typename It, typename = ValidIfIterator<It>>\r
-        ParameterLayout (It begin, It end) { add (begin, end); }\r
-\r
-        template <typename... Items>\r
-        void add (std::unique_ptr<Items>... items)\r
-        {\r
-            parameters.reserve (parameters.size() + sizeof... (items));\r
-\r
-            // We can replace this with some nicer code once generic lambdas become available. A\r
-            // sequential context like an array initialiser is required to ensure we get the correct\r
-            // order from the parameter pack.\r
-            int unused[] { (parameters.emplace_back (MakeContents() (std::move (items))), 0)... };\r
-            ignoreUnused (unused);\r
-        }\r
-\r
-        template <typename It, typename = ValidIfIterator<It>>\r
-        void add (It begin, It end)\r
-        {\r
-            parameters.reserve (parameters.size() + std::size_t (std::distance (begin, end)));\r
-            std::transform (std::make_move_iterator (begin),\r
-                            std::make_move_iterator (end),\r
-                            std::back_inserter (parameters),\r
-                            MakeContents());\r
-        }\r
-\r
-        ParameterLayout (const ParameterLayout& other) = delete;\r
-        ParameterLayout (ParameterLayout&& other) noexcept { swap (other); }\r
-\r
-        ParameterLayout& operator= (const ParameterLayout& other) = delete;\r
-        ParameterLayout& operator= (ParameterLayout&& other) noexcept { swap (other); return *this; }\r
-\r
-        void swap (ParameterLayout& other) noexcept { std::swap (other.parameters, parameters); }\r
+    /** Creates a state object for a given processor.\r
 \r
-    private:\r
-        //==============================================================================\r
-        struct Visitor\r
-        {\r
-            virtual ~Visitor() = default;\r
-\r
-            // If you have a compiler error telling you that there is no matching\r
-            // member function to call for 'visit', then you are probably attempting\r
-            // to add a parameter that is not derived from RangedAudioParameter to\r
-            // the AudioProcessorValueTreeState.\r
-            virtual void visit (std::unique_ptr<RangedAudioParameter>) const = 0;\r
-            virtual void visit (std::unique_ptr<AudioProcessorParameterGroup>) const = 0;\r
-        };\r
-\r
-        struct ParameterStorageBase\r
-        {\r
-            virtual ~ParameterStorageBase() = default;\r
-            virtual void accept (const Visitor& visitor) = 0;\r
-        };\r
-\r
-        template <typename Contents>\r
-        struct ParameterStorage : ParameterStorageBase\r
-        {\r
-            explicit ParameterStorage (std::unique_ptr<Contents> input) : contents (std::move (input)) {}\r
-\r
-            void accept (const Visitor& visitor) override   { visitor.visit (std::move (contents)); }\r
-\r
-            std::unique_ptr<Contents> contents;\r
-        };\r
-\r
-        struct MakeContents final\r
-        {\r
-            template <typename Item>\r
-            std::unique_ptr<ParameterStorageBase> operator() (std::unique_ptr<Item> item) const\r
-            {\r
-                return std::unique_ptr<ParameterStorageBase> (new ParameterStorage<Item> (std::move (item)));\r
-            }\r
-        };\r
-\r
-        void add() {}\r
-\r
-        friend class AudioProcessorValueTreeState;\r
-\r
-        std::vector<std::unique_ptr<ParameterStorageBase>> parameters;\r
-    };\r
-\r
-    //==============================================================================\r
-    /** Creates a state object for a given processor, and sets up all the parameters\r
-        that will control that processor.\r
-\r
-        You should *not* assign a new ValueTree to the state, or call\r
-        createAndAddParameter, after using this constructor.\r
-\r
-        Note that each AudioProcessorValueTreeState should be attached to only one\r
-        processor, and must have the same lifetime as the processor, as they will\r
-        have dependencies on each other.\r
-\r
-        The ParameterLayout parameter has a set of constructors that allow you to\r
-        add multiple RangedAudioParameters and AudioProcessorParameterGroups containing\r
-        RangedAudioParameters to the AudioProcessorValueTreeState inside this constructor.\r
-\r
-        @code\r
-        YourAudioProcessor()\r
-            : apvts (*this, &undoManager, "PARAMETERS",\r
-                     { std::make_unique<AudioParameterFloat> ("a", "Parameter A", NormalisableRange<float> (-100.0f, 100.0f), 0),\r
-                       std::make_unique<AudioParameterInt> ("b", "Parameter B", 0, 5, 2) })\r
-        @endcode\r
-\r
-        To add parameters programatically you can use the iterator-based ParameterLayout\r
-        constructor:\r
-\r
-        @code\r
-        AudioProcessorValueTreeState::ParameterLayout createParameterLayout()\r
-        {\r
-            std::vector<std::unique_ptr<AudioParameterInt>> params;\r
-\r
-            for (int i = 1; i < 9; ++i)\r
-                params.push_back (std::make_unique<AudioParameterInt> (String (i), String (i), 0, i, 0));\r
-\r
-            return { params.begin(), params.end() };\r
-        }\r
-\r
-        YourAudioProcessor()\r
-            : apvts (*this, &undoManager, "PARAMETERS", createParameterLayout())\r
-        {\r
-        }\r
-        @endcode\r
-\r
-        @param processorToConnectTo     The Processor that will be managed by this object\r
-        @param undoManagerToUse         An optional UndoManager to use; pass nullptr if no UndoManager is required\r
-        @param valueTreeType            The identifier used to initialise the internal ValueTree\r
-        @param parameterLayout          An object that holds all parameters and parameter groups that the\r
-                                        AudioProcessor should use.\r
+        The UndoManager is optional and can be a nullptr.\r
+        After creating your state object, you should add parameters with the\r
+        createAndAddParameter() method. Note that each AudioProcessorValueTreeState\r
+        should be attached to only one processor, and must have the same lifetime as the\r
+        processor, as they will have dependencies on each other.\r
     */\r
     AudioProcessorValueTreeState (AudioProcessor& processorToConnectTo,\r
-                                  UndoManager* undoManagerToUse,\r
-                                  const juce::Identifier& valueTreeType,\r
-                                  ParameterLayout parameterLayout);\r
-\r
-    /** This constructor is discouraged and will be deprecated in a future version of JUCE!\r
-        Use the other constructor instead.\r
-\r
-        Creates a state object for a given processor.\r
-\r
-        The UndoManager is optional and can be a nullptr. After creating your state object,\r
-        you should add parameters with the createAndAddParameter() method. Note that each\r
-        AudioProcessorValueTreeState should be attached to only one processor, and must have\r
-        the same lifetime as the processor, as they will have dependencies on each other.\r
-    */\r
-    AudioProcessorValueTreeState (AudioProcessor& processorToConnectTo, UndoManager* undoManagerToUse);\r
+                                  UndoManager* undoManagerToUse);\r
 \r
     /** Destructor. */\r
     ~AudioProcessorValueTreeState();\r
 \r
-    //==============================================================================\r
-    /** This function is deprecated and will be removed in a future version of JUCE!\r
-\r
-        Previous calls to\r
-\r
-        @code\r
-        createAndAddParameter (paramID1, paramName1, ...);\r
-        @endcode\r
-\r
-        can be replaced with\r
-\r
-        @code\r
-        using Parameter = AudioProcessorValueTreeState::Parameter;\r
-        createAndAddParameter (std::make_unique<Parameter> (paramID1, paramName1, ...));\r
-        @endcode\r
-\r
-        However, a much better approach is to use the AudioProcessorValueTreeState\r
-        constructor directly\r
-\r
-        @code\r
-        using Parameter = AudioProcessorValueTreeState::Parameter;\r
-        YourAudioProcessor()\r
-            : apvts (*this, &undoManager, "PARAMETERS", { std::make_unique<Parameter> (paramID1, paramName1, ...),\r
-                                                          std::make_unique<Parameter> (paramID2, paramName2, ...),\r
-                                                          ... })\r
-        @endcode\r
-\r
-        @see AudioProcessorValueTreeState::AudioProcessorValueTreeState\r
-\r
-        This function creates and returns a new parameter object for controlling a\r
-        parameter with the given ID.\r
+    /** Creates and returns a new parameter object for controlling a parameter\r
+        with the given ID.\r
 \r
         Calling this will create and add a special type of AudioProcessorParameter to the\r
         AudioProcessor to which this state is attached.\r
+\r
+        @param parameterID              A unique string ID for the new parameter\r
+        @param parameterName            The name that the parameter will return from AudioProcessorParameter::getName()\r
+        @param labelText                The label that the parameter will return from AudioProcessorParameter::getLabel()\r
+        @param valueRange               A mapping that will be used to determine the value range which this parameter uses\r
+        @param defaultValue             A default value for the parameter (in non-normalised units)\r
+        @param valueToTextFunction      A function that will convert a non-normalised value to a string for the\r
+                                        AudioProcessorParameter::getText() method. This can be nullptr to use the\r
+                                        default implementation\r
+        @param textToValueFunction      The inverse of valueToTextFunction\r
+        @param isMetaParameter          Set this value to true if this should be a meta parameter\r
+        @param isAutomatableParameter   Set this value to false if this parameter should not be automatable\r
+        @param isDiscrete               Set this value to true to make this parameter take discrete values in a host.\r
+                                        @see AudioProcessorParameter::isDiscrete\r
+        @param category                 Which category the parameter should use.\r
+                                        @see AudioProcessorParameter::Category\r
+        @param isBoolean                Set this value to true to make this parameter appear as a boolean toggle in\r
+                                        a hosts view of your plug-ins parameters\r
+                                        @see AudioProcessorParameter::isBoolean\r
+\r
+        @returns the parameter object that was created\r
     */\r
-    JUCE_DEPRECATED (RangedAudioParameter* createAndAddParameter (const String& parameterID,\r
-                                                                  const String& parameterName,\r
-                                                                  const String& labelText,\r
-                                                                  NormalisableRange<float> valueRange,\r
-                                                                  float defaultValue,\r
-                                                                  std::function<String (float)> valueToTextFunction,\r
-                                                                  std::function<float (const String&)> textToValueFunction,\r
-                                                                  bool isMetaParameter = false,\r
-                                                                  bool isAutomatableParameter = true,\r
-                                                                  bool isDiscrete = false,\r
-                                                                  AudioProcessorParameter::Category category = AudioProcessorParameter::genericParameter,\r
-                                                                  bool isBoolean = false));\r
-\r
-    /** This function adds a parameter to the attached AudioProcessor and that parameter will\r
-        be managed by this AudioProcessorValueTreeState object.\r
-    */\r
-    RangedAudioParameter* createAndAddParameter (std::unique_ptr<RangedAudioParameter> parameter);\r
+    AudioProcessorParameterWithID* createAndAddParameter (const String& parameterID,\r
+                                                          const String& parameterName,\r
+                                                          const String& labelText,\r
+                                                          NormalisableRange<float> valueRange,\r
+                                                          float defaultValue,\r
+                                                          std::function<String (float)> valueToTextFunction,\r
+                                                          std::function<float (const String&)> textToValueFunction,\r
+                                                          bool isMetaParameter = false,\r
+                                                          bool isAutomatableParameter = true,\r
+                                                          bool isDiscrete = false,\r
+                                                          AudioProcessorParameter::Category category\r
+                                                             = AudioProcessorParameter::genericParameter,\r
+                                                          bool isBoolean = false);\r
 \r
-    //==============================================================================\r
     /** Returns a parameter by its ID string. */\r
-    RangedAudioParameter* getParameter (StringRef parameterID) const noexcept;\r
+    AudioProcessorParameterWithID* getParameter (StringRef parameterID) const noexcept;\r
 \r
     /** Returns a pointer to a floating point representation of a particular\r
         parameter which a realtime process can read to find out its current value.\r
     */\r
     float* getRawParameterValue (StringRef parameterID) const noexcept;\r
 \r
-    //==============================================================================\r
     /** A listener class that can be attached to an AudioProcessorValueTreeState.\r
         Use AudioProcessorValueTreeState::addParameterListener() to register a callback.\r
     */\r
     struct JUCE_API  Listener\r
     {\r
-        virtual ~Listener() = default;\r
+        Listener();\r
+        virtual ~Listener();\r
 \r
         /** This callback method is called by the AudioProcessorValueTreeState when a parameter changes. */\r
         virtual void parameterChanged (const String& parameterID, float newValue) = 0;\r
@@ -302,14 +130,12 @@ public:
     /** Removes a callback that was previously added with addParameterCallback(). */\r
     void removeParameterListener (StringRef parameterID, Listener* listener);\r
 \r
-    //==============================================================================\r
     /** Returns a Value object that can be used to control a particular parameter. */\r
     Value getParameterAsValue (StringRef parameterID) const;\r
 \r
     /** Returns the range that was set when the given parameter was created. */\r
     NormalisableRange<float> getParameterRange (StringRef parameterID) const noexcept;\r
 \r
-    //==============================================================================\r
     /** Returns a copy of the state value tree.\r
 \r
         The AudioProcessorValueTreeState's ValueTree is updated internally on the\r
@@ -337,7 +163,6 @@ public:
     */\r
     void replaceState (const ValueTree& newState);\r
 \r
-    //==============================================================================\r
     /** A reference to the processor with which this state is associated. */\r
     AudioProcessor& processor;\r
 \r
@@ -353,63 +178,6 @@ public:
     /** Provides access to the undo manager that this object is using. */\r
     UndoManager* const undoManager;\r
 \r
-    //==============================================================================\r
-    /** A parameter class that maintains backwards compatibility with deprecated\r
-        AudioProcessorValueTreeState functionality.\r
-\r
-        Previous calls to\r
-\r
-        @code\r
-        createAndAddParameter (paramID1, paramName1, ...);\r
-        @endcode\r
-\r
-        can be replaced with\r
-\r
-        @code\r
-        using Parameter = AudioProcessorValueTreeState::Parameter;\r
-        createAndAddParameter (std::make_unique<Parameter> (paramID1, paramName1, ...));\r
-        @endcode\r
-\r
-        However, a much better approach is to use the AudioProcessorValueTreeState\r
-        constructor directly\r
-\r
-        @code\r
-        using Parameter = AudioProcessorValueTreeState::Parameter;\r
-        YourAudioProcessor()\r
-            : apvts (*this, &undoManager, "PARAMETERS", { std::make_unique<Parameter> (paramID1, paramName1, ...),\r
-                                                          std::make_unique<Parameter> (paramID2, paramName2, ...),\r
-                                                          ... })\r
-        @endcode\r
-    */\r
-    class Parameter final  : public AudioParameterFloat\r
-    {\r
-    public:\r
-        Parameter (const String& parameterID,\r
-                   const String& parameterName,\r
-                   const String& labelText,\r
-                   NormalisableRange<float> valueRange,\r
-                   float defaultValue,\r
-                   std::function<String(float)> valueToTextFunction,\r
-                   std::function<float(const String&)> textToValueFunction,\r
-                   bool isMetaParameter = false,\r
-                   bool isAutomatableParameter = true,\r
-                   bool isDiscrete = false,\r
-                   AudioProcessorParameter::Category category = AudioProcessorParameter::genericParameter,\r
-                   bool isBoolean = false);\r
-\r
-        float getDefaultValue() const override;\r
-        int getNumSteps() const override;\r
-\r
-        bool isMetaParameter() const override;\r
-        bool isAutomatable() const override;\r
-        bool isDiscrete() const override;\r
-        bool isBoolean() const override;\r
-\r
-    private:\r
-        const float unsnappedDefault;\r
-        const bool metaParameter, automatable, discrete, boolean;\r
-    };\r
-\r
     //==============================================================================\r
     /** An object of this class maintains a connection between a Slider and a parameter\r
         in an AudioProcessorValueTreeState.\r
@@ -429,6 +197,7 @@ public:
 \r
     private:\r
         struct Pimpl;\r
+        friend struct ContainerDeletePolicy<Pimpl>;\r
         std::unique_ptr<Pimpl> pimpl;\r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SliderAttachment)\r
     };\r
@@ -437,11 +206,6 @@ public:
     /** An object of this class maintains a connection between a ComboBox and a parameter\r
         in an AudioProcessorValueTreeState.\r
 \r
-        Combobox items will be spaced linearly across the range of the parameter. For\r
-        example if the range is specified by NormalisableRange<float> (-0.5f, 0.5f, 0.5f)\r
-        and you add three items then the first will be mapped to a value of -0.5, the\r
-        second to 0, and the third to 0.5.\r
-\r
         During the lifetime of this ComboBoxAttachment object, it keeps the two things in\r
         sync, making it easy to connect a combo box to a parameter. When this object is\r
         deleted, the connection is broken. Make sure that your AudioProcessorValueTreeState\r
@@ -457,6 +221,7 @@ public:
 \r
     private:\r
         struct Pimpl;\r
+        friend struct ContainerDeletePolicy<Pimpl>;\r
         std::unique_ptr<Pimpl> pimpl;\r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComboBoxAttachment)\r
     };\r
@@ -480,50 +245,18 @@ public:
 \r
     private:\r
         struct Pimpl;\r
+        friend struct ContainerDeletePolicy<Pimpl>;\r
         std::unique_ptr<Pimpl> pimpl;\r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonAttachment)\r
     };\r
 \r
 private:\r
     //==============================================================================\r
-    /** This method was introduced to allow you to use AudioProcessorValueTreeState parameters in\r
-        an AudioProcessorParameterGroup, but there is now a much nicer way to achieve this.\r
-\r
-        Code that looks like this\r
-        @code\r
-        auto paramA = apvts.createParameter ("a", "Parameter A", {}, { -100, 100 }, ...);\r
-        auto paramB = apvts.createParameter ("b", "Parameter B", {}, { 0, 5 }, ...);\r
-        addParameterGroup (std::make_unique<AudioProcessorParameterGroup> ("g1", "Group 1", " | ", std::move (paramA), std::move (paramB)));\r
-        apvts.state = ValueTree (Identifier ("PARAMETERS"));\r
-        @endcode\r
-        can instead create the APVTS like this, avoiding the two-step initialization process and leveraging one of JUCE's\r
-        pre-built parameter types (or your own custom type derived from RangedAudioParameter)\r
-        @code\r
-        using Parameter = AudioProcessorValueTreeState::Parameter;\r
-        YourAudioProcessor()\r
-            : apvts (*this, &undoManager, "PARAMETERS",\r
-                     { std::make_unique<AudioProcessorParameterGroup> ("g1", "Group 1", " | ",\r
-                           std::make_unique<Parameter> ("a", "Parameter A", "", NormalisableRange<float> (-100, 100), ...),\r
-                           std::make_unique<Parameter> ("b", "Parameter B", "", NormalisableRange<float> (0, 5), ...)) })\r
-        @endcode\r
-    */\r
-    JUCE_DEPRECATED (std::unique_ptr<RangedAudioParameter> createParameter (const String&, const String&, const String&, NormalisableRange<float>,\r
-                                                                            float, std::function<String (float)>, std::function<float (const String&)>,\r
-                                                                            bool, bool, bool, AudioProcessorParameter::Category, bool));\r
-\r
-    //==============================================================================\r
-    class ParameterAdapter;\r
+    struct Parameter;\r
+    friend struct Parameter;\r
 \r
-   #if JUCE_UNIT_TESTS\r
-    friend struct ParameterAdapterTests;\r
-   #endif\r
-\r
-    ParameterAdapter* getParameterAdapter (StringRef) const;\r
-\r
-    ValueTree getChildValueTree (const String&) const;\r
     ValueTree getOrCreateChildValueTree (const String&);\r
     bool flushParameterValuesToValueTree();\r
-    void setNewState (ParameterAdapter&);\r
     void timerCallback() override;\r
 \r
     void valueTreePropertyChanged (ValueTree&, const Identifier&) override;\r
@@ -534,9 +267,9 @@ private:
     void valueTreeRedirected (ValueTree&) override;\r
     void updateParameterConnectionsToChildTrees();\r
 \r
-    const Identifier valueType { "PARAM" }, valuePropertyID { "value" }, idPropertyID { "id" };\r
-\r
-    std::vector<std::unique_ptr<ParameterAdapter>> parameters;\r
+    Identifier valueType { "PARAM" },\r
+               valuePropertyID { "value" },\r
+               idPropertyID { "id" };\r
 \r
     CriticalSection valueTreeChanging;\r
 \r
diff --git a/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h b/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h
deleted file mode 100644 (file)
index 244105a..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-/**\r
-    This abstract base class is used by some AudioProcessorParameter helper classes.\r
-\r
-    @see AudioParameterFloat, AudioParameterInt, AudioParameterBool, AudioParameterChoice\r
-\r
-    @tags{Audio}\r
-*/\r
-class JUCE_API RangedAudioParameter   : public AudioProcessorParameterWithID\r
-{\r
-public:\r
-    /** The creation of this object requires providing a name and ID which will be\r
-        constant for its lifetime.\r
-    */\r
-    RangedAudioParameter (const String& parameterID,\r
-                          const String& name,\r
-                          const String& label = {},\r
-                          Category category = AudioProcessorParameter::genericParameter)\r
-        : AudioProcessorParameterWithID (parameterID, name, label, category) {}\r
-\r
-    /** Returns the range of values that the parameter can take. */\r
-    virtual const NormalisableRange<float>& getNormalisableRange() const = 0;\r
-\r
-    /** Returns the number of steps for this parameter based on the normalisable range's interval.\r
-        If you are using lambda functions to define the normalisable range's snapping behaviour\r
-        then you should override this function so that it returns the number of snapping points.\r
-    */\r
-    int getNumSteps() const override\r
-    {\r
-        const auto& range = getNormalisableRange();\r
-\r
-        if (range.interval > 0)\r
-            return (static_cast<int> ((range.end - range.start) / range.interval) + 1);\r
-\r
-        return AudioProcessor::getDefaultNumParameterSteps();\r
-    }\r
-\r
-    /** Normalises and snaps a value based on the normalisable range. */\r
-    float convertTo0to1 (float v) const noexcept\r
-    {\r
-        const auto& range = getNormalisableRange();\r
-        return range.convertTo0to1 (range.snapToLegalValue (v));\r
-    }\r
-\r
-    /** Denormalises and snaps a value based on the normalisable range. */\r
-    float convertFrom0to1 (float v) const noexcept\r
-    {\r
-        const auto& range = getNormalisableRange();\r
-        return range.snapToLegalValue (range.convertFrom0to1 (jlimit (0.0f, 1.0f, v)));\r
-    }\r
-};\r
-\r
-} // namespace juce\r
index b74019dda1a3d6670f65d36a95ce89f6689b2ca7..cca13675656d58ef781db197918074a2a9fd0cd7 100644 (file)
@@ -162,6 +162,7 @@ private:
     AudioCDBurner (const int deviceIndex);\r
 \r
     class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDBurner)\r
index 78a0909e18388b9c3adb8783c8005be94016e603..31ccc2ae8022c89ab8a47b2e2e5d57c18c73f74c 100644 (file)
@@ -52,10 +52,11 @@ void AudioAppComponent::setAudioChannels (int numInputChannels, int numOutputCha
 \r
     if (usingCustomDeviceManager && xml == nullptr)\r
     {\r
-        auto setup = deviceManager.getAudioDeviceSetup();\r
+        AudioDeviceManager::AudioDeviceSetup setup;\r
+        deviceManager.getAudioDeviceSetup (setup);\r
 \r
         if (setup.inputChannels.countNumberOfSetBits() != numInputChannels\r
-             || setup.outputChannels.countNumberOfSetBits() != numOutputChannels)\r
+            || setup.outputChannels.countNumberOfSetBits() != numOutputChannels)\r
         {\r
             setup.inputChannels.clear();\r
             setup.outputChannels.clear();\r
index ee22972aca23fbbbf6014d9c22fb3a3e276cd9ec..1b1b292c8df7912546cf05da8b43b15e158c8757 100644 (file)
@@ -330,7 +330,8 @@ public:
 \r
     void updateConfig (bool updateOutputDevice, bool updateInputDevice, bool updateSampleRate, bool updateBufferSize)\r
     {\r
-        auto config = setup.manager->getAudioDeviceSetup();\r
+        AudioDeviceManager::AudioDeviceSetup config;\r
+        setup.manager->getAudioDeviceSetup (config);\r
         String error;\r
 \r
         if (updateOutputDevice || updateInputDevice)\r
@@ -768,7 +769,9 @@ public:
 \r
                 auto item = items[row];\r
                 bool enabled = false;\r
-                auto config = setup.manager->getAudioDeviceSetup();\r
+\r
+                AudioDeviceManager::AudioDeviceSetup config;\r
+                setup.manager->getAudioDeviceSetup (config);\r
 \r
                 if (setup.useStereoPairs)\r
                 {\r
@@ -865,7 +868,8 @@ public:
 \r
             if (isPositiveAndBelow (row, items.size()))\r
             {\r
-                auto config = setup.manager->getAudioDeviceSetup();\r
+                AudioDeviceManager::AudioDeviceSetup config;\r
+                setup.manager->getAudioDeviceSetup (config);\r
 \r
                 if (setup.useStereoPairs)\r
                 {\r
index a589f9c415d3794f728fcb92cb78299966bd9105..f57fc693585fe8d7349c7784f1d0881a32cc1b87 100644 (file)
@@ -105,6 +105,7 @@ private:
     const bool hideAdvancedOptionsWithButton;\r
 \r
     class MidiInputSelectorComponentListBox;\r
+    friend struct ContainerDeletePolicy<MidiInputSelectorComponentListBox>;\r
     std::unique_ptr<MidiInputSelectorComponentListBox> midiInputsList;\r
     std::unique_ptr<ComboBox> midiOutputSelector;\r
     std::unique_ptr<Label> midiInputsLabel, midiOutputLabel;\r
index 85bdca3d73e0b55a28dc5a9a66928db9ae9c5c05..9ad264c296c4488fa32ab869083f3ec7965ab27a 100644 (file)
@@ -642,7 +642,7 @@ void AudioThumbnail::saveTo (OutputStream& output) const
 //==============================================================================\r
 bool AudioThumbnail::setDataSource (LevelDataSource* newSource)\r
 {\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
     numSamplesFinished = 0;\r
 \r
index 50e1bcaa59e9c318c348f50b7fa3f9cde600a186..2b9b19bba1e718af24eac7be7cd3fc9e5734eaca 100644 (file)
@@ -201,6 +201,13 @@ private:
     class ThumbData;\r
     class CachedWindow;\r
 \r
+    friend class LevelDataSource;\r
+    friend class ThumbData;\r
+    friend class CachedWindow;\r
+    friend struct ContainerDeletePolicy<LevelDataSource>;\r
+    friend struct ContainerDeletePolicy<ThumbData>;\r
+    friend struct ContainerDeletePolicy<CachedWindow>;\r
+\r
     std::unique_ptr<LevelDataSource> source;\r
     std::unique_ptr<CachedWindow> window;\r
     OwnedArray<ThumbData> channels;\r
index 3608fbc38d4114c43b445cacd7faecb0a5951d07..b3ab04107b6ffbb3c4d8bfcb1dd4c93532be3484 100644 (file)
@@ -106,6 +106,7 @@ private:
     TimeSliceThread thread;\r
 \r
     class ThumbnailCacheEntry;\r
+    friend struct ContainerDeletePolicy<ThumbnailCacheEntry>;\r
     OwnedArray<ThumbnailCacheEntry> thumbs;\r
     CriticalSection lock;\r
     int maxNumThumbsToStore;\r
index a13a489937bcdaf6dda048164c2a8d8d5a5b6003..21b0fad66a30818e29e73dccae5b5475bf337a8c 100644 (file)
@@ -29,7 +29,8 @@ namespace juce
 \r
 struct AudioVisualiserComponent::ChannelInfo\r
 {\r
-    ChannelInfo (AudioVisualiserComponent& o, int bufferSize) : owner (o)\r
+    ChannelInfo (AudioVisualiserComponent& o, int bufferSize)\r
+       : owner (o), nextSample (0), subSample (0)\r
     {\r
         setBufferSize (bufferSize);\r
         clear();\r
@@ -37,21 +38,20 @@ struct AudioVisualiserComponent::ChannelInfo
 \r
     void clear() noexcept\r
     {\r
-        // VS2013 doesn't like {} here...\r
-        for (auto& l : levels)\r
-            l = Range<float>();\r
+        for (int i = 0; i < levels.size(); ++i)\r
+            levels.getReference(i) = Range<float>();\r
 \r
-        value = {};\r
+        value = Range<float>();\r
         subSample = 0;\r
     }\r
 \r
-    void pushSamples (const float* inputSamples, int num) noexcept\r
+    void pushSamples (const float* inputSamples, const int num) noexcept\r
     {\r
         for (int i = 0; i < num; ++i)\r
             pushSample (inputSamples[i]);\r
     }\r
 \r
-    void pushSample (float newSample) noexcept\r
+    void pushSample (const float newSample) noexcept\r
     {\r
         if (--subSample <= 0)\r
         {\r
@@ -69,7 +69,7 @@ struct AudioVisualiserComponent::ChannelInfo
     void setBufferSize (int newSize)\r
     {\r
         levels.removeRange (newSize, levels.size());\r
-        levels.insertMultiple (-1, {}, newSize - levels.size());\r
+        levels.insertMultiple (-1, Range<float>(), newSize - levels.size());\r
 \r
         if (nextSample >= newSize)\r
             nextSample = 0;\r
@@ -78,13 +78,13 @@ struct AudioVisualiserComponent::ChannelInfo
     AudioVisualiserComponent& owner;\r
     Array<Range<float>> levels;\r
     Range<float> value;\r
-    int nextSample = 0, subSample = 0;\r
+    int nextSample, subSample;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelInfo)\r
 };\r
 \r
 //==============================================================================\r
-AudioVisualiserComponent::AudioVisualiserComponent (int initialNumChannels)\r
+AudioVisualiserComponent::AudioVisualiserComponent (const int initialNumChannels)\r
   : numSamples (1024),\r
     inputSamplesPerBlock (256),\r
     backgroundColour (Colours::black),\r
@@ -99,7 +99,7 @@ AudioVisualiserComponent::~AudioVisualiserComponent()
 {\r
 }\r
 \r
-void AudioVisualiserComponent::setNumChannels (int numChannels)\r
+void AudioVisualiserComponent::setNumChannels (const int numChannels)\r
 {\r
     channels.clear();\r
 \r
@@ -111,14 +111,14 @@ void AudioVisualiserComponent::setBufferSize (int newNumSamples)
 {\r
     numSamples = newNumSamples;\r
 \r
-    for (auto* c : channels)\r
-        c->setBufferSize (newNumSamples);\r
+    for (int i = 0; i < channels.size(); ++i)\r
+        channels.getUnchecked(i)->setBufferSize (newNumSamples);\r
 }\r
 \r
 void AudioVisualiserComponent::clear()\r
 {\r
-    for (auto* c : channels)\r
-        c->clear();\r
+    for (int i = 0; i < channels.size(); ++i)\r
+        channels.getUnchecked(i)->clear();\r
 }\r
 \r
 void AudioVisualiserComponent::pushBuffer (const float** d, int numChannels, int num)\r
@@ -138,7 +138,7 @@ void AudioVisualiserComponent::pushBuffer (const AudioBuffer<float>& buffer)
 \r
 void AudioVisualiserComponent::pushBuffer (const AudioSourceChannelInfo& buffer)\r
 {\r
-    auto numChannels = jmin (buffer.buffer->getNumChannels(), channels.size());\r
+    const int numChannels = jmin (buffer.buffer->getNumChannels(), channels.size());\r
 \r
     for (int i = 0; i < numChannels; ++i)\r
         channels.getUnchecked(i)->pushSamples (buffer.buffer->getReadPointer (i, buffer.startSample),\r
@@ -179,24 +179,27 @@ void AudioVisualiserComponent::paint (Graphics& g)
 {\r
     g.fillAll (backgroundColour);\r
 \r
-    auto r = getLocalBounds().toFloat();\r
-    auto channelHeight = r.getHeight() / channels.size();\r
+    Rectangle<float> r (getLocalBounds().toFloat());\r
+    const float channelHeight = r.getHeight() / channels.size();\r
 \r
     g.setColour (waveformColour);\r
 \r
-    for (auto* c : channels)\r
+    for (int i = 0; i < channels.size(); ++i)\r
+    {\r
+        const ChannelInfo& c = *channels.getUnchecked(i);\r
+\r
         paintChannel (g, r.removeFromTop (channelHeight),\r
-                      c->levels.begin(), c->levels.size(), c->nextSample);\r
+                      c.levels.begin(), c.levels.size(), c.nextSample);\r
+    }\r
 }\r
 \r
-void AudioVisualiserComponent::getChannelAsPath (Path& path, const Range<float>* levels,\r
-                                                 int numLevels, int nextSample)\r
+void AudioVisualiserComponent::getChannelAsPath (Path& path, const Range<float>* levels, int numLevels, int nextSample)\r
 {\r
     path.preallocateSpace (4 * numLevels + 8);\r
 \r
     for (int i = 0; i < numLevels; ++i)\r
     {\r
-        auto level = -(levels[(nextSample + i) % numLevels].getEnd());\r
+        const float level = -(levels[(nextSample + i) % numLevels].getEnd());\r
 \r
         if (i == 0)\r
             path.startNewSubPath (0.0f, level);\r
index d900314286ec021ee64124573ef10c71b8aff76e..f08292a38a3fcf03e4b5a6de8e2cfb6973f2a281 100644 (file)
@@ -121,6 +121,8 @@ public:
 \r
 private:\r
     struct ChannelInfo;\r
+    friend struct ChannelInfo;\r
+    friend struct ContainerDeletePolicy<ChannelInfo>;\r
 \r
     OwnedArray<ChannelInfo> channels;\r
     int numSamples, inputSamplesPerBlock;\r
index 754bc89760ecfaf901e1f09e05888ccec47c9146..aa96f3a4389df608ac8eb56bc3423704b50b510e 100644 (file)
@@ -50,10 +50,10 @@ struct MidiKeyboardComponent::UpDownButton  : public Button
         owner.setLowestVisibleKey (note * 12);\r
     }\r
 \r
-    void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+    void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
     {\r
         owner.drawUpDownButton (g, getWidth(), getHeight(),\r
-                                shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown,\r
+                                isMouseOverButton, isButtonDown,\r
                                 delta > 0);\r
     }\r
 \r
@@ -712,7 +712,7 @@ void MidiKeyboardComponent::updateNoteUnderMouse (Point<float> pos, bool isDown,
     auto newNote = xyToNote (pos, mousePositionVelocity);\r
     auto oldNote = mouseOverNotes.getUnchecked (fingerNum);\r
     auto oldNoteDown = mouseDownNotes.getUnchecked (fingerNum);\r
-    auto eventVelocity = useMousePositionForVelocity ? mousePositionVelocity * velocity : velocity;\r
+    auto eventVelocity = useMousePositionForVelocity ? mousePositionVelocity * velocity : 1.0f;\r
 \r
     if (oldNote != newNote)\r
     {\r
index 193e7927ee848a8c3d3034fb2d52ab0d4c1989fc..2588d92a30b0292e77acfc3a96abf63cada7a4f4 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_audio_utils\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE extra audio utility classes\r
   description:      Classes for audio-related GUI and miscellaneous tasks.\r
   website:          http://www.juce.com/juce\r
index 1911e83abca12ed84442340f8d4ea7cc53f5e085..0353e8412b5cede98621879ff1ccee0bba7b352d 100644 (file)
@@ -35,7 +35,7 @@ namespace juce
  METHOD (getBluetoothDeviceStatus, "getBluetoothDeviceStatus", "(Ljava/lang/String;)I") \\r
  METHOD (startStopScan, "startStopScan", "(Z)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidBluetoothManager, JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager")\r
+DECLARE_JNI_CLASS (AndroidBluetoothManager, JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
index 80731ef52cc279b3d8e75e2ecd7be01bddb5e0b9..780200b35ae43109ebba4411559e2a20a2397c36 100644 (file)
@@ -88,15 +88,6 @@ void AudioProcessorPlayer::setDoublePrecisionProcessing (bool doublePrecision)
     }\r
 }\r
 \r
-void AudioProcessorPlayer::setMidiOutput (MidiOutput* midiOutputToUse)\r
-{\r
-    if (midiOutput != midiOutputToUse)\r
-    {\r
-        const ScopedLock sl (lock);\r
-        midiOutput = midiOutputToUse;\r
-    }\r
-}\r
-\r
 //==============================================================================\r
 void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChannelData,\r
                                                   const int numInputChannels,\r
@@ -172,9 +163,6 @@ void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChann
                     processor->processBlock (buffer, incomingMidi);\r
                 }\r
 \r
-                if (midiOutput != nullptr)\r
-                    midiOutput->sendBlockOfMessagesNow (incomingMidi);\r
-\r
                 return;\r
             }\r
         }\r
index d0251aa0db85acb6698e2a3b69039389624c2af3..198641e6c5f523fc924294aa5240c40c2aaa782b 100644 (file)
@@ -35,8 +35,7 @@ namespace juce
     give it a processor to use by calling setProcessor().\r
 \r
     It's also a MidiInputCallback, so you can connect it to both an audio and midi\r
-    input to send both streams through the processor. To set a MidiOutput for the processor,\r
-    use the setMidiOutput() method.\r
+    input to send both streams through the processor.\r
 \r
     @see AudioProcessor, AudioProcessorGraph\r
 \r
@@ -69,26 +68,18 @@ public:
     */\r
     MidiMessageCollector& getMidiMessageCollector() noexcept        { return messageCollector; }\r
 \r
-    /** Sets the MIDI output that should be used, if required.\r
-\r
-        The MIDI output will not be deleted or owned by this object. If the MIDI output is\r
-        deleted, pass a nullptr to this method.\r
-    */\r
-    void setMidiOutput (MidiOutput* midiOutputToUse);\r
-\r
     /** Switch between double and single floating point precisions processing.\r
-\r
-        The audio IO callbacks will still operate in single floating point precision,\r
-        however, all internal processing including the AudioProcessor will be processed in\r
-        double floating point precision if the AudioProcessor supports it (see\r
-        AudioProcessor::supportsDoublePrecisionProcessing()). Otherwise, the processing will\r
-        remain single precision irrespective of the parameter doublePrecision.\r
-    */\r
+        The audio IO callbacks will still operate in single floating point\r
+        precision, however, all internal processing including the\r
+        AudioProcessor will be processed in double floating point precision if\r
+        the AudioProcessor supports it (see\r
+        AudioProcessor::supportsDoublePrecisionProcessing()).\r
+        Otherwise, the processing will remain single precision irrespective of\r
+        the parameter doublePrecision. */\r
     void setDoublePrecisionProcessing (bool doublePrecision);\r
 \r
     /** Returns true if this player processes internally processes the samples with\r
-        double floating point precision.\r
-    */\r
+        double floating point precision. */\r
     inline bool getDoublePrecisionProcessing() { return isDoublePrecision; }\r
 \r
     //==============================================================================\r
@@ -116,7 +107,6 @@ private:
 \r
     MidiBuffer incomingMidi;\r
     MidiMessageCollector messageCollector;\r
-    MidiOutput* midiOutput = nullptr;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorPlayer)\r
 };\r
index cbf6e924c15e26c51cf27d05ca481d8273901478..45af97f5ce5c3775048c98f45bce21cca9440a14 100644 (file)
@@ -30,9 +30,9 @@ namespace juce
 // This is an AudioTransportSource which will own it's assigned source\r
 struct AudioSourceOwningTransportSource  : public AudioTransportSource\r
 {\r
-    AudioSourceOwningTransportSource (PositionableAudioSource* s, double sr)  : source (s)\r
+    AudioSourceOwningTransportSource (PositionableAudioSource* s, double sampleRate)  : source (s)\r
     {\r
-        AudioTransportSource::setSource (s, 0, nullptr, sr);\r
+        AudioTransportSource::setSource (s, 0, nullptr, sampleRate);\r
     }\r
 \r
     ~AudioSourceOwningTransportSource()\r
index 144cc183e0295c2285a07f9a6548b330707f43fe..4336a92f90f95d93b0a27d155704709da19d52e4 100644 (file)
@@ -61,19 +61,6 @@ Block::Block (const juce::String& serial, const juce::String& version, const juc
 \r
 Block::~Block() {}\r
 \r
-bool Block::isControlBlock() const\r
-{\r
-    return isControlBlock (getType());\r
-}\r
-\r
-bool Block::isControlBlock (Block::Type type)\r
-{\r
-    return type == Block::Type::liveBlock\r
-        || type == Block::Type::loopBlock\r
-        || type == Block::Type::touchBlock\r
-        || type == Block::Type::developerControlBlock;\r
-}\r
-\r
 void Block::addDataInputPortListener (DataInputPortListener* listener)      { dataInputPortListeners.add (listener); }\r
 void Block::removeDataInputPortListener (DataInputPortListener* listener)   { dataInputPortListeners.remove (listener); }\r
 \r
index 042ee63d4f521eb3fa1c36540f70d7bd36f50f1b..f0c7bc6b31d511124f452dd456a69effaf5d8093 100644 (file)
@@ -88,12 +88,6 @@ public:
     */\r
     virtual Type getType() const = 0;\r
 \r
-    /** Returns true if this a control block. **/\r
-    bool isControlBlock() const;\r
-\r
-    /** Returns true if Block::Type is a control block. */\r
-    static bool isControlBlock (Block::Type);\r
-\r
     /** Returns a human-readable description of this device type. */\r
     virtual juce::String getDeviceDescription() const = 0;\r
 \r
@@ -114,9 +108,6 @@ public:
     */\r
     virtual bool isMasterBlock() const = 0;\r
 \r
-    /** Returns the UID of the master block this block is connected to. */\r
-    virtual UID getConnectedMasterUID() const = 0;\r
-\r
     //==============================================================================\r
     /** Returns the width of the device in logical device units. */\r
     virtual int getWidth() const = 0;\r
@@ -130,14 +121,6 @@ public:
     /** Returns the length of one logical device unit as physical millimeters. */\r
     virtual float getMillimetersPerUnit() const = 0;\r
 \r
-    /** Returns the area that this block covers within the layout of the group as a whole.\r
-        The coordinates are in logical block units, and are relative to the origin, which is the master block's top-left corner.\r
-     */\r
-    virtual Rectangle<int> getBlockAreaWithinLayout() const = 0;\r
-\r
-    /** Returns the rotation of this block relative to the master block in 90 degree steps clockwise. */\r
-    virtual int getRotation() const = 0;\r
-\r
     //==============================================================================\r
     /** If this block has a grid of LEDs, this will return an object to control it.\r
         Note that the pointer that is returned belongs to this object, and the caller must\r
@@ -151,7 +134,7 @@ public:
         neither delete it or use it after the lifetime of this Block object has finished.\r
         If there are no LEDs, then this method will return nullptr.\r
     */\r
-    virtual LEDRow* getLEDRow() = 0;\r
+    virtual LEDRow* getLEDRow() const = 0;\r
 \r
     /** If this block has any status LEDs, this will return an array of objects to control them.\r
         Note that the objects in the array belong to this Block object, and the caller must\r
@@ -221,9 +204,6 @@ public:
         /** Returns the LittleFoot program to execute on the BLOCKS device. */\r
         virtual juce::String getLittleFootProgram() = 0;\r
 \r
-        /** Returns an array of search paths to use when resolving includes. **/\r
-        virtual juce::Array<juce::File> getSearchPaths() { return {}; }\r
-\r
         Block& block;\r
     };\r
 \r
@@ -273,11 +253,8 @@ public:
     virtual void removeProgramEventListener (ProgramEventListener*);\r
 \r
     //==============================================================================\r
-    /** Returns the overall memory of the block. */\r
-    virtual uint32 getMemorySize() = 0;\r
-\r
     /** Returns the size of the data block that setDataByte and other functions can write to. */\r
-    virtual uint32 getHeapMemorySize() = 0;\r
+    virtual uint32 getMemorySize() = 0;\r
 \r
     /** Sets a single byte on the littlefoot heap. */\r
     virtual void setDataByte (size_t offset, uint8 value) = 0;\r
@@ -300,15 +277,6 @@ public:
     {\r
         static constexpr int32 numOptionNames = 8;\r
 \r
-        enum class ConfigType\r
-        {\r
-            integer,\r
-            floating,\r
-            boolean,\r
-            colour,\r
-            options\r
-        };\r
-\r
         ConfigMetaData() {}\r
 \r
         // Constructor to work around VS2015 bugs...\r
@@ -317,7 +285,7 @@ public:
                         juce::Range<int32> rangeToUse,\r
                         bool active,\r
                         const char* itemName,\r
-                        ConfigType itemType,\r
+                        uint32 itemType,\r
                         const char* options[ConfigMetaData::numOptionNames],\r
                         const char* groupName)\r
           : item (itemIndex),\r
@@ -380,7 +348,7 @@ public:
         juce::Range<int32> range;\r
         bool isActive = false;\r
         juce::String name;\r
-        ConfigType type = ConfigType::integer;\r
+        uint32 type = 0;\r
         juce::String optionNames[numOptionNames] = {};\r
         juce::String group;\r
     };\r
@@ -435,9 +403,6 @@ public:
     /** Provides a callback that will be called when a config changes. */\r
     virtual void setConfigChangedCallback (std::function<void(Block&, const ConfigMetaData&, uint32)>) = 0;\r
 \r
-    /** Provides a callback that will be called when a prgoram has been loaded. */\r
-    virtual void setProgramLoadedCallback (std::function<void(Block&)> programLoaded) = 0;\r
-\r
     //==============================================================================\r
     /** Interface for objects listening to input data port. */\r
     struct DataInputPortListener\r
index 7de8336bb3dc08ed05b5e1e4dc1c17651fdc7659..4a5f3ecbaa67a11af481121a36cff0ca4e2ccb6f 100644 (file)
@@ -36,8 +36,6 @@ namespace juce
 \r
 using namespace BlocksProtocol;\r
 \r
-using ConfigType = Block::ConfigMetaData::ConfigType;\r
-\r
 /** Manages the configuration of blocks\r
 \r
     @tags{Blocks}\r
@@ -47,7 +45,16 @@ struct BlockConfigManager
     void setDeviceIndex (TopologyIndex newDeviceIndex)                       { deviceIndex = newDeviceIndex; }\r
     void setDeviceComms (PhysicalTopologySource::DeviceConnection* newConn)  { deviceConnection = newConn; }\r
 \r
-    static constexpr uint32 numConfigItems = 64;\r
+    enum ConfigType\r
+    {\r
+        integer,\r
+        floating,\r
+        boolean,\r
+        colour,\r
+        options\r
+    };\r
+\r
+    static constexpr uint32 numConfigItems = 61;\r
 \r
     /** Structure describing a configuration */\r
     struct ConfigDescription\r
@@ -66,7 +73,7 @@ struct BlockConfigManager
 \r
         Block::ConfigMetaData toConfigMetaData() const\r
         {\r
-            return Block::ConfigMetaData ((uint32) item, value, { min, max }, isActive, name, type, (const char**) optionNames, group);\r
+            return Block::ConfigMetaData ((uint32) item, value, { min, max }, isActive, name, (uint32) type, (const char**) optionNames, group);\r
         }\r
     };\r
 \r
@@ -74,13 +81,8 @@ struct BlockConfigManager
     {\r
         { midiStartChannel,     2,      1,      16,     false,  "MIDI Start Channel",   ConfigType::integer,    {},               "MIDI Settings" },\r
         { midiEndChannel,       16,     1,      16,     false,  "MIDI End Channel",     ConfigType::integer,    {},               "MIDI Settings" },\r
-        { midiUseMPE,           1,      0,      2,      false,  "MIDI Mode",            ConfigType::options,    { "Multi Channel",\r
-                                                                                                                  "MPE",\r
-                                                                                                                  "Single Channel" }, "MIDI Settings" },\r
+        { midiUseMPE,           1,      0,      1,      false,  "Use MPE",              ConfigType::boolean,    {},               "MIDI Settings" },\r
         { pitchBendRange,       48,     1,      96,     false,  "Pitch Bend Range",     ConfigType::integer,    {},               "MIDI Settings" },\r
-        { midiChannelRange,     15,     1,      15,     false,  "No. MIDI Channels",    ConfigType::integer,    {},               "MIDI Settings" },\r
-        { MPEZone,              0,      0,      1,      false,  "MPE Zone",             ConfigType::options,    { "Lower Zone",\r
-                                                                                                                  "Upper Zone"},  "MIDI Settings" },\r
         { octave,               0,      -4,     6,      false,  "Octave",               ConfigType::integer,    {},               "Pitch" },\r
         { transpose,            0,      -11,    11,     false,  "Transpose",            ConfigType::integer,    {},               "Pitch" },\r
         { slideCC,              74,     0,      127,    false,  "Slide CC",             ConfigType::integer,    {},               "Play mode" },\r
@@ -104,12 +106,12 @@ struct BlockConfigManager
         { chord,                0,      0,      127,    false,  "Chord",                ConfigType::integer,    {},               "Play mode" }, // NOTE: Should be options\r
         { arpPattern,           0,      0,      127,    false,  "Arp Pattern",          ConfigType::integer,    {},               "Play mode" },\r
         { tempo,                120,    1,      300,    false,  "Tempo",                ConfigType::integer,    {},               "Rhythm" },\r
-        { xTrackingMode,        1,      1,      4,      false,  "Glide Tracking Mode",  ConfigType::options,    { "Multi-Channel",\r
+        { xTrackingMode,        1,      0,      4,      false,  "Glide Tracking Mode",  ConfigType::options,    { "Multi-Channel",\r
                                                                                                                   "Last Played",\r
                                                                                                                   "Highest",\r
                                                                                                                   "Lowest",\r
                                                                                                                   "Disabled" },   "Play mode" },\r
-        { yTrackingMode,        1,      1,      4,      false,  "Slide Tracking Mode",  ConfigType::options,    { "Multi-Channel",\r
+        { yTrackingMode,        1,      0,      4,      false,  "Slide Tracking Mode",  ConfigType::options,    { "Multi-Channel",\r
                                                                                                                   "Last Played",\r
                                                                                                                   "Highest",\r
                                                                                                                   "Lowest",\r
@@ -267,22 +269,50 @@ struct BlockConfigManager
     // Set Block Configuration\r
     void setBlockConfig (ConfigItemId item, int32 value)\r
     {\r
-        buildAndSendPacket ([item, value] (HostPacketBuilder<32>& p) { p.addConfigSetMessage (item, value); });\r
+        HostPacketBuilder<32> packet;\r
+\r
+        packet.writePacketSysexHeaderBytes (deviceIndex);\r
+        packet.addConfigSetMessage (item, value);\r
+        packet.writePacketSysexFooter();\r
+\r
+        if (deviceConnection != nullptr)\r
+            deviceConnection->sendMessageToDevice (packet.getData(), (size_t) packet.size());\r
     }\r
 \r
     void requestBlockConfig (ConfigItemId item)\r
     {\r
-        buildAndSendPacket ([item] (HostPacketBuilder<32>& p) { p.addRequestMessage (item); });\r
+        HostPacketBuilder<32> packet;\r
+\r
+        packet.writePacketSysexHeaderBytes (deviceIndex);\r
+        packet.addRequestMessage (item);\r
+        packet.writePacketSysexFooter();\r
+\r
+        if (deviceConnection != nullptr)\r
+            deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());\r
     }\r
 \r
     void requestFactoryConfigSync()\r
     {\r
-        buildAndSendPacket ([] (HostPacketBuilder<32>& p) { p.addRequestFactorySyncMessage(); });\r
+        HostPacketBuilder<32> packet;\r
+\r
+        packet.writePacketSysexHeaderBytes(deviceIndex);\r
+        packet.addRequestFactorySyncMessage();\r
+        packet.writePacketSysexFooter();\r
+\r
+        if (deviceConnection != nullptr)\r
+            deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());\r
     }\r
 \r
     void requestUserConfigSync()\r
     {\r
-        buildAndSendPacket ([] (HostPacketBuilder<32>& p) { p.addRequestUserSyncMessage(); });\r
+        HostPacketBuilder<32> packet;\r
+\r
+        packet.writePacketSysexHeaderBytes(deviceIndex);\r
+        packet.addRequestUserSyncMessage();\r
+        packet.writePacketSysexFooter();\r
+\r
+        if (deviceConnection != nullptr)\r
+            deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());\r
     }\r
 \r
     void handleConfigUpdateMessage (int32 item, int32 value, int32 min, int32 max)\r
@@ -321,21 +351,8 @@ private:
         return false;\r
     }\r
 \r
-    template<typename PacketBuildFn>\r
-    void buildAndSendPacket (PacketBuildFn buildFn)\r
-    {\r
-        if (deviceConnection == nullptr)\r
-            return;\r
-\r
-        HostPacketBuilder<32> packet;\r
-        packet.writePacketSysexHeaderBytes (deviceIndex);\r
-        buildFn (packet);\r
-        packet.writePacketSysexFooter();\r
-        deviceConnection->sendMessageToDevice (packet.getData(), (size_t) packet.size());\r
-    }\r
-\r
-    TopologyIndex deviceIndex {};\r
-    PhysicalTopologySource::DeviceConnection* deviceConnection {};\r
+    TopologyIndex deviceIndex;\r
+    PhysicalTopologySource::DeviceConnection* deviceConnection;\r
 };\r
 \r
 } // namespace juce\r
index a7965f1caf6afcb482114e356afddee7ffee1aa5..eb6dd0368023de92b9387d586eb5e24247213fef 100644 (file)
@@ -110,7 +110,7 @@ float abs (float arg);
     @param value        the value within the source range to map\r
     @param sourceMin    the minimum value of the source range\r
     @param sourceMax    the maximum value of the source range\r
-    @param destMin      the minimum value of the destination range\r
+    @param destMin      the minumum value of the destination range\r
     @param destMax      the maximum value of the destination range\r
     @returns            the original value mapped to the destination range\r
 */\r
@@ -272,25 +272,21 @@ void handleButtonDown (int index);
 */\r
 void handleButtonUp (int index);\r
 \r
-/** Call this when a control block button is pressed to trigger the buttons default behaviour.\r
+/** Called when a control block button is pressed.\r
 \r
     @param buttonIndex    the index of the button\r
 \r
     @note Requires >= 0.2.5 firmware\r
     @note Only valid with a control block\r
-\r
-    @see initControl onControlRelease\r
 */\r
 void onControlPress (int buttonIndex);\r
 \r
-/** Call this when a control block button is released to trigger the buttons default behaviour.\r
+/** Called when a control block button is released.\r
 \r
     @param buttonIndex    the index of the button\r
 \r
     @note Requires >= 0.2.5 firmware\r
     @note Only valid with a control block\r
-\r
-    @see initControl onControlPress\r
 */\r
 void onControlRelease (int buttonIndex);\r
 \r
index 034dc53aee90f54c84ce2360ae635e42d3ea98d2..fcd764b24fa3d31a432f6476e82760cfd825c904 100644 (file)
  #endif\r
 #else\r
 \r
-namespace juce\r
-{\r
- #include "littlefoot/juce_LittleFootRemoteHeap.h"\r
-}\r
-\r
 #include "protocol/juce_BitPackingUtilities.h"\r
 #include "protocol/juce_BlocksProtocolDefinitions.h"\r
 #include "protocol/juce_HostPacketDecoder.h"\r
index 64886173e76081fbb8bbfa10daef64268a44d98b..6ca644d5c852dc08de06cbfc30abdb57465e9d48 100644 (file)
@@ -31,7 +31,7 @@
 \r
   ID:               juce_blocks_basics\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             Provides low-level control over ROLI BLOCKS devices\r
   description:      JUCE wrapper for low-level control over ROLI BLOCKS devices.\r
   website:          http://developer.roli.com\r
@@ -84,6 +84,7 @@ namespace juce
 {\r
  #include "littlefoot/juce_LittleFootRunner.h"\r
  #include "littlefoot/juce_LittleFootCompiler.h"\r
+ #include "littlefoot/juce_LittleFootRemoteHeap.h"\r
 }\r
 \r
 #endif\r
index f2c03a939a7d661a4ca4a5c172551f59402b2a56..1e96326e85149c019b2808a958d83dc09a2c41f6 100644 (file)
@@ -61,11 +61,11 @@ struct Compiler
         If there's an error, this returns it, otherwise the compiled bytecode is\r
         placed in the compiledObjectCode member.\r
     */\r
-    Result compile (const String& sourceCode, uint32 defaultHeapSize, const Array<File>& searchPaths = {})\r
+    Result compile (const String& sourceCode, uint32 defaultHeapSize)\r
     {\r
         try\r
         {\r
-            SyntaxTreeBuilder stb (sourceCode, nativeFunctions, defaultHeapSize, searchPaths);\r
+            SyntaxTreeBuilder stb (sourceCode, nativeFunctions, defaultHeapSize);\r
             stb.compile();\r
             stb.simplify();\r
 \r
@@ -98,7 +98,6 @@ private:
 \r
     struct Statement;\r
     struct Expression;\r
-    struct Variable;\r
     struct BlockStatement;\r
     struct Function;\r
     struct AllocatedObject  { virtual ~AllocatedObject() noexcept {} };\r
@@ -142,8 +141,8 @@ private:
     //==============================================================================\r
     struct CodeLocation\r
     {\r
-        CodeLocation (const String& code, const File& srcFile) noexcept : program (code), location (program.getCharPointer()), sourceFile (srcFile) {}\r
-        CodeLocation (const CodeLocation& other) noexcept : program (other.program), location (other.location), sourceFile (other.sourceFile) {}\r
+        CodeLocation (const String& code) noexcept        : program (code), location (program.getCharPointer()) {}\r
+        CodeLocation (const CodeLocation& other) noexcept : program (other.program), location (other.location) {}\r
 \r
         [[noreturn]] void throwError (const String& message) const\r
         {\r
@@ -155,19 +154,17 @@ private:
                 if (*i == '\n')  { col = 1; ++line; }\r
             }\r
 \r
-            auto filePath = sourceFile == File() ? String() : (sourceFile.getFullPathName() + ": ");\r
-            throw filePath + "Line " + String (line) + ", column " + String (col) + " : " + message;\r
+            throw "Line " + String (line) + ", column " + String (col) + " : " + message;\r
         }\r
 \r
         String program;\r
         String::CharPointerType location;\r
-        File sourceFile;\r
     };\r
 \r
     //==============================================================================\r
     struct TokenIterator\r
     {\r
-        TokenIterator (const String& code) : location (code, {}), p (code.getCharPointer()) { skip(); }\r
+        TokenIterator (const String& code) : location (code), p (code.getCharPointer()) { skip(); }\r
 \r
         TokenType skip()\r
         {\r
@@ -192,16 +189,15 @@ private:
         bool matchesAny (TokenType t1, Args... others) const noexcept   { return currentType == t1 || matchesAny (others...); }\r
         bool matchesAny (TokenType t1) const noexcept                   { return currentType == t1; }\r
 \r
-        void throwErrorExpecting (const String& expected)    { location.throwError ("Found " + getTokenDescription (currentType) + " when expecting " + expected); }\r
-\r
         CodeLocation location;\r
         TokenType currentType;\r
         var currentValue;\r
 \r
-    protected:\r
-        String::CharPointerType p;\r
+        void throwErrorExpecting (const String& expected)    { location.throwError ("Found " + getTokenDescription (currentType) + " when expecting " + expected); }\r
 \r
     private:\r
+        String::CharPointerType p;\r
+\r
         static bool isIdentifierStart (juce_wchar c) noexcept   { return CharacterFunctions::isLetter (c)        || c == '_'; }\r
         static bool isIdentifierBody  (juce_wchar c) noexcept   { return CharacterFunctions::isLetterOrDigit (c) || c == '_'; }\r
 \r
@@ -369,24 +365,12 @@ private:
     //==============================================================================\r
     struct SyntaxTreeBuilder  : private TokenIterator\r
     {\r
-        SyntaxTreeBuilder (const String& code, const Array<NativeFunction>& nativeFns, uint32 defaultHeapSize, const Array<File>& searchPathsToUse)\r
-            : TokenIterator (code), searchPaths (searchPathsToUse), nativeFunctions (nativeFns), heapSizeRequired (defaultHeapSize) {}\r
+        SyntaxTreeBuilder (const String& code, const Array<NativeFunction>& nativeFns, uint32 defaultHeapSize)\r
+            : TokenIterator (code), nativeFunctions (nativeFns), heapSizeRequired (defaultHeapSize) {}\r
 \r
         void compile()\r
         {\r
             blockBeingParsed = allocate<BlockStatement> (location, nullptr, nullptr, false);\r
-            parseCode();\r
-            heapSizeRequired += arrayHeapSize;\r
-        }\r
-\r
-        void parseCode()\r
-        {\r
-            const auto programHash = location.program.hashCode64();\r
-\r
-            if (includedSourceCode.contains (programHash))\r
-                return;\r
-\r
-            includedSourceCode.add (programHash);\r
 \r
             while (currentType != Token::eof)\r
             {\r
@@ -447,11 +431,8 @@ private:
         //==============================================================================\r
         BlockPtr blockBeingParsed = nullptr;\r
         Array<Function*> functions;\r
-        Array<File> searchPaths;\r
-        Array<int64> includedSourceCode;\r
         const Array<NativeFunction>& nativeFunctions;\r
         uint32 heapSizeRequired;\r
-        uint32 arrayHeapSize = 0;\r
 \r
         template <typename Type, typename... Args>\r
         Type* allocate (Args... args)   { auto o = new Type (args...); allAllocatedObjects.add (o); return o; }\r
@@ -468,98 +449,27 @@ private:
             {\r
                 match (Token::colon);\r
                 heapSizeRequired = (((uint32) parseIntegerLiteral()) + 3) & ~3u;\r
-            }\r
-            else if (name == "include")\r
-            {\r
-                parseIncludeDirective();\r
-            }\r
-            else\r
-            {\r
-                location.throwError ("Unknown compiler directive");\r
-            }\r
-        }\r
-\r
-        void parseIncludeDirective()\r
-        {\r
-            match (Token::literal);\r
-\r
-            if (! currentValue.isString())\r
-            {\r
-                location.throwError ("Expected file path");\r
                 return;\r
             }\r
 \r
-            juce::File fileToInclude = resolveIncludePath (currentValue.toString());\r
-\r
-            if (fileToInclude == File())\r
-                return;\r
-\r
-            searchPaths.add (fileToInclude);\r
-            auto codeToInclude = fileToInclude.loadFileAsString();\r
-\r
-            auto locationToRestore = location;\r
-            auto currentTypeToRestore = currentType;\r
-            auto currentValueToRestore = currentValue;\r
-            auto pToRestore = p;\r
-\r
-            location = CodeLocation (codeToInclude, fileToInclude);\r
-            p = codeToInclude.getCharPointer();\r
-            skip();\r
-\r
-            parseCode();\r
-\r
-            location = locationToRestore;\r
-            currentType = currentTypeToRestore;\r
-            currentValue = currentValueToRestore;\r
-            p = pToRestore;\r
+            location.throwError ("Unknown compiler directive");\r
         }\r
 \r
-        File resolveIncludePath (String include)\r
+        void parseGlobalVariableDeclaraion (bool isConst, Type type, String name)\r
         {\r
-            if (include.substring (include.length() - 11) != ".littlefoot")\r
-            {\r
-                location.throwError ("File extension must be .littlefoot");\r
-                return {};\r
-            }\r
-\r
-            if (File::isAbsolutePath (include) && File (include).existsAsFile())\r
-                return { include };\r
-\r
-            auto fileName = include.fromLastOccurrenceOf ("/", false, false);\r
-\r
-            for (auto path : searchPaths)\r
+            for (;;)\r
             {\r
-                if (path == File())\r
-                    continue;\r
+                int arraySize = matchIf (Token::openBracket) ? parseIntegerLiteral() : 0;\r
 \r
-                if (! path.isDirectory())\r
-                    path = path.getParentDirectory();\r
+                if (arraySize > 0)\r
+                    location.throwError ("Arrays not yet implemented!");\r
 \r
-                if (path.getChildFile (include).existsAsFile())\r
-                    return path.getChildFile (include);\r
-\r
-                if (path.getChildFile (fileName).existsAsFile())\r
-                    return path.getChildFile (fileName);\r
-            }\r
+                var constantInitialiser;\r
 \r
-            location.throwError ("File not found: " + include);\r
-        }\r
+                if (isConst)\r
+                    constantInitialiser = parseConstantExpressionInitialiser (type);\r
 \r
-        //TODO:   should there be a max array size?\r
-        void parseGlobalVariableDeclaraion (bool isConst, Type type, String name)\r
-        {\r
-            for (;;)\r
-            {\r
-                if (matchIf (Token::openBracket))\r
-                {\r
-                    int arraySize = 0;\r
-                    parseGlobalArray (arraySize, type, name, nullptr);\r
-                    arrayHeapSize += uint32 (arraySize * 4);\r
-                }\r
-                else\r
-                {\r
-                    parseGlobalVariable (isConst, type, name);\r
-                }\r
+                blockBeingParsed->addVariable ({ name, type, true, isConst, constantInitialiser }, location);\r
 \r
                 if (matchIf (Token::comma))\r
                 {\r
@@ -572,40 +482,6 @@ private:
             }\r
         }\r
 \r
-        void parseGlobalArray (int& arraySize, Type type, const String& name, Variable* parent)\r
-        {\r
-            const auto value = parseIntegerLiteral();\r
-            match (Token::closeBracket);\r
-\r
-            blockBeingParsed->addVariable ({ {}, type, true, false, {}, value, parent }, location);\r
-\r
-            auto& newArray = blockBeingParsed->arrays.getReference (blockBeingParsed->arrays.size() - 1);\r
-\r
-            if (parent != nullptr)\r
-                parent->nextArray = &newArray;\r
-\r
-            if (matchIf (Token::openBracket))\r
-            {\r
-                parseGlobalArray (arraySize, type, name, &newArray);\r
-                arraySize *= value;\r
-            }\r
-            else\r
-            {\r
-                newArray.name = name;\r
-                arraySize = value;\r
-            }\r
-        }\r
-\r
-        void parseGlobalVariable (bool isConst, Type type, String name)\r
-        {\r
-            var constantInitialiser;\r
-\r
-            if (isConst)\r
-                constantInitialiser = parseConstantExpressionInitialiser (type);\r
-\r
-            blockBeingParsed->addVariable ({ name, type, true, isConst, constantInitialiser, 0 }, location);\r
-        }\r
-\r
         var parseConstantExpressionInitialiser (Type expectedType)\r
         {\r
             var result;\r
@@ -738,7 +614,7 @@ private:
             if (matchIf (Token::assign))\r
             {\r
                 auto loc = location;\r
-                return allocate<Assignment> (loc, blockBeingParsed, lhs, parseExpression(), false);\r
+                return allocate<Assignment> (loc, blockBeingParsed, getIdentifierFromExpression (lhs), parseExpression(), false);\r
             }\r
 \r
             return lhs;\r
@@ -868,31 +744,26 @@ private:
                 return {};\r
             }\r
 \r
-            if (matchIf (Token::openBracket)) return parseArraySubscript (input);\r
-            if (matchIf (Token::plusplus))    return parsePostIncDec (input, Token::plus);\r
-            if (matchIf (Token::minusminus))  return parsePostIncDec (input, Token::minus);\r
-\r
-            return input;\r
-        }\r
-\r
-        ExpPtr parseArraySubscript (ExpPtr input)\r
-        {\r
-            auto s = allocate<ArraySubscript> (location, blockBeingParsed);\r
-            s->object = input;\r
-            s->index = parseExpression();\r
-            match (Token::closeBracket);\r
-\r
             if (matchIf (Token::openBracket))\r
-                return parseArraySubscript (s);\r
+            {\r
+                auto s = allocate<ArraySubscript> (location, blockBeingParsed);\r
+                s->object = input;\r
+                s->index = parseExpression();\r
+                match (Token::closeBracket);\r
+                return parseSuffixes (s);\r
+            }\r
 \r
-            return s;\r
+            if (matchIf (Token::plusplus))   return parsePostIncDec (input, Token::plus);\r
+            if (matchIf (Token::minusminus)) return parsePostIncDec (input, Token::minus);\r
+\r
+            return input;\r
         }\r
 \r
         ExpPtr parseInPlaceOpExpression (ExpPtr lhs, TokenType opType)\r
         {\r
             auto loc = location;\r
             auto rhs = parseExpression();\r
-            return allocate<Assignment> (loc, blockBeingParsed, lhs,\r
+            return allocate<Assignment> (loc, blockBeingParsed, getIdentifierFromExpression (lhs),\r
                                          allocate<BinaryOperator> (location, blockBeingParsed, lhs, rhs, opType), false);\r
         }\r
 \r
@@ -900,14 +771,14 @@ private:
         {\r
             auto lhs = parseFactor();\r
             auto one = allocate<LiteralValue> (location, blockBeingParsed, (int) 1);\r
-            return allocate<Assignment> (location, blockBeingParsed, lhs,\r
+            return allocate<Assignment> (location, blockBeingParsed, getIdentifierFromExpression (lhs),\r
                                          allocate<BinaryOperator> (location, blockBeingParsed, lhs, one, opType), false);\r
         }\r
 \r
         ExpPtr parsePostIncDec (ExpPtr lhs, TokenType opType)\r
         {\r
             auto one = allocate<LiteralValue> (location, blockBeingParsed, (int) 1);\r
-            return allocate<Assignment> (location, blockBeingParsed, lhs,\r
+            return allocate<Assignment> (location, blockBeingParsed, getIdentifierFromExpression (lhs),\r
                                          allocate<BinaryOperator> (location, blockBeingParsed, lhs, one, opType), true);\r
         }\r
 \r
@@ -938,17 +809,17 @@ private:
 \r
             for (StatementPtr result = nullptr;;)\r
             {\r
-                auto identifier = allocate<Identifier> (location, blockBeingParsed, parseIdentifier());\r
+                auto name = parseIdentifier();\r
                 auto loc = location;\r
 \r
                 if (isConst)\r
                 {\r
                     auto constantValue = parseConstantExpressionInitialiser (type);\r
-                    blockBeingParsed->addVariable ({ identifier->getIdentifier(), type, false, true, constantValue }, loc);\r
+                    blockBeingParsed->addVariable ({ name, type, false, true, constantValue }, loc);\r
                 }\r
                 else\r
                 {\r
-                    blockBeingParsed->addVariable ({ identifier->getIdentifier(), type, false, false, {} }, loc);\r
+                    blockBeingParsed->addVariable ({ name, type, false, false, {} }, loc);\r
 \r
                     auto assignedValue = matchIf (Token::assign) ? parseExpression() : nullptr;\r
 \r
@@ -961,7 +832,7 @@ private:
                         if (assignedValue == nullptr)\r
                             assignedValue = allocate<LiteralValue> (loc, blockBeingParsed, (int) 0);\r
 \r
-                        auto assignment = allocate<Assignment> (loc, blockBeingParsed, identifier, assignedValue, false);\r
+                        auto assignment = allocate<Assignment> (loc, blockBeingParsed, name, assignedValue, false);\r
 \r
                         if (result == nullptr)\r
                         {\r
@@ -1038,6 +909,15 @@ private:
             return name;\r
         }\r
 \r
+        String getIdentifierFromExpression (ExpPtr e)\r
+        {\r
+            if (auto i = dynamic_cast<Identifier*> (e))\r
+                return i->name;\r
+\r
+            location.throwError ("This operator requires an assignable variable");\r
+            return {};\r
+        }\r
+\r
         ExpPtr parseFunctionCall (const String& name)\r
         {\r
             auto call = allocate<FunctionCall> (location, blockBeingParsed);\r
@@ -1067,7 +947,7 @@ private:
     //==============================================================================\r
     struct CodeGenerator\r
     {\r
-        CodeGenerator (Array<uint8>& output, SyntaxTreeBuilder& stb)\r
+        CodeGenerator (Array<uint8>& output, const SyntaxTreeBuilder& stb)\r
             : outputCode (output), syntaxTree (stb) {}\r
 \r
         void generateCode (BlockPtr outerBlock, uint32 heapSizeBytesRequired)\r
@@ -1103,7 +983,7 @@ private:
 \r
         //==============================================================================\r
         Array<uint8>& outputCode;\r
-        SyntaxTreeBuilder& syntaxTree;\r
+        const SyntaxTreeBuilder& syntaxTree;\r
 \r
         struct Marker  { int index = 0; };\r
         struct MarkerAndAddress  { Marker marker; int address; };\r
@@ -1254,44 +1134,6 @@ private:
 \r
             emitCast (sourceType, requiredType, location);\r
         }\r
-\r
-        void emitArrayElementIndex (const Expression* target, BlockPtr parentBlock,\r
-                                    int stackDepth, const CodeLocation& errorLocation)\r
-        {\r
-            if (auto currentSubscript = dynamic_cast<const ArraySubscript*> (target))\r
-            {\r
-                const auto identifier = currentSubscript->getIdentifier();\r
-                auto array = parentBlock->getArray (identifier, errorLocation);\r
-\r
-                ExpPtr elementIndent = nullptr;\r
-                auto currentArray = &array;\r
-\r
-                while (currentSubscript != nullptr && currentArray != nullptr)\r
-                {\r
-                    auto lhs = syntaxTree.allocate<LiteralValue> (errorLocation, parentBlock, parentBlock->getArrayElementSizeInBytes (*currentArray));\r
-                    ExpPtr subscriptIndent = syntaxTree.allocate<BinaryOperator> (errorLocation, parentBlock, lhs, currentSubscript->index, Token::times);\r
-\r
-                    if (elementIndent == nullptr)\r
-                        elementIndent = subscriptIndent;\r
-                    else\r
-                        elementIndent = syntaxTree.allocate<BinaryOperator> (errorLocation, parentBlock, elementIndent, subscriptIndent, Token::plus);\r
-\r
-                    currentSubscript = dynamic_cast<ArraySubscript*> (currentSubscript->object);\r
-                    currentArray = currentArray->previousArray;\r
-                }\r
-\r
-                auto arrayStart = (int) (syntaxTree.heapSizeRequired - syntaxTree.arrayHeapSize) + parentBlock->getArrayStart (identifier, errorLocation);\r
-                auto lhs = syntaxTree.allocate<LiteralValue> (errorLocation, parentBlock, arrayStart);\r
-                elementIndent = syntaxTree.allocate<BinaryOperator> (errorLocation, parentBlock, lhs, elementIndent, Token::plus);\r
-\r
-                elementIndent = elementIndent->simplify (syntaxTree);\r
-                elementIndent->emit (*this, Type::int_, stackDepth);\r
-            }\r
-            else\r
-            {\r
-                errorLocation.throwError ("Cannot cast Expression to ArraySubscript");\r
-            }\r
-        }\r
     };\r
 \r
     //==============================================================================\r
@@ -1319,26 +1161,14 @@ private:
         Expression (const CodeLocation& l, BlockPtr parent) noexcept : Statement (l, parent) {}\r
         virtual Type getType (CodeGenerator&) const = 0;\r
         virtual ExpPtr simplify (SyntaxTreeBuilder&) override    { return this; }\r
-        virtual String getIdentifier() const { location.throwError ("This operator requires an assignable variable"); return {}; }\r
     };\r
 \r
     struct Variable\r
     {\r
-        // VS2015 requires a constructor to avoid aggregate initialization\r
-        Variable (const String& n, Type t, bool isGlobalVar, bool isConstVar, const var& cv,\r
-                  int nElements = 0, Variable* pArray = nullptr, Variable* nArray = nullptr)\r
-           : name (n), type (t), isGlobal (isGlobalVar), isConst (isConstVar), constantValue (cv),\r
-             numElements (nElements), previousArray (pArray), nextArray (nArray)\r
-        {\r
-        }\r
-\r
         String name;\r
         Type type;\r
         bool isGlobal, isConst;\r
         var constantValue;\r
-        int numElements = 0;\r
-        Variable* previousArray = nullptr;\r
-        Variable* nextArray = nullptr;\r
     };\r
 \r
     //==============================================================================\r
@@ -1470,63 +1300,23 @@ private:
         // returns -ve values for globals\r
         int getVariableDepth (const String& name, const CodeLocation& locationForError) const\r
         {\r
-            auto index = indexOf (variables, name);\r
-\r
+            int index = indexOf (variables, name);\r
             if (index >= 0)\r
                 return getNumVariablesInParentBlocks() + index;\r
 \r
             if (! isMainBlockOfFunction)\r
                 return parentBlock->getVariableDepth (name, locationForError);\r
 \r
-            if (function != nullptr)\r
-                for (int i = function->arguments.size(); --i >= 0;)\r
-                    if (function->arguments.getReference(i).name == name)\r
-                        return i + 1 + function->getNumLocals();\r
+            for (int i = function->arguments.size(); --i >= 0;)\r
+                if (function->arguments.getReference(i).name == name)\r
+                    return i + 1 + function->getNumLocals();\r
 \r
             index = indexOf (getGlobalVariables(), name);\r
-\r
             if (index >= 0)\r
                 return -(index + 1);\r
 \r
             locationForError.throwError ("Unknown variable '" + name + "'");\r
-        }\r
-\r
-        Variable getArray (const String& name, const CodeLocation& locationForError) const\r
-        {\r
-            for (const auto& array : getGlobalArrays())\r
-                if (array.name == name)\r
-                    return array;\r
-\r
-            locationForError.throwError ("Unknown array '" + name + "'");\r
-        }\r
-\r
-        int getArraySizeInBytes (const Variable& array) const\r
-        {\r
-            return array.numElements * getArrayElementSizeInBytes (array);\r
-        }\r
-\r
-        int getArrayElementSizeInBytes (const Variable& array) const\r
-        {\r
-            if (array.nextArray != nullptr)\r
-                return getArraySizeInBytes (*array.nextArray);\r
-\r
-            return numBytesInType;\r
-        }\r
-\r
-        int getArrayStart (const String& name, const CodeLocation& locationForError) const\r
-        {\r
-            int start = 0;\r
-\r
-            for (const auto& array : getGlobalArrays())\r
-            {\r
-                if (array.name == name)\r
-                    return start;\r
-\r
-                if (array.name.isNotEmpty())\r
-                    start += getArraySizeInBytes (array);\r
-            }\r
-\r
-            locationForError.throwError ("Unknown array '" + name + "'");\r
+            return 0;\r
         }\r
 \r
         int getNumVariablesInParentBlocks() const noexcept\r
@@ -1537,7 +1327,6 @@ private:
 \r
         const Array<Variable>& getGlobalVariables() const noexcept  { return parentBlock != nullptr ? parentBlock->getGlobalVariables() : variables; }\r
         const Array<Variable>& getGlobalConstants() const noexcept  { return parentBlock != nullptr ? parentBlock->getGlobalConstants() : constants; }\r
-        const Array<Variable>& getGlobalArrays() const noexcept     { return parentBlock != nullptr ? parentBlock->getGlobalArrays() : arrays; }\r
 \r
         const Variable& getVariable (const String& name, const CodeLocation& locationForError) const\r
         {\r
@@ -1549,23 +1338,18 @@ private:
                 if (v.name == name)\r
                     return v;\r
 \r
-            if (! isMainBlockOfFunction && parentBlock != nullptr)\r
+            if (! isMainBlockOfFunction)\r
                 return parentBlock->getVariable (name, locationForError);\r
 \r
-            if (function != nullptr)\r
-                for (auto& v : function->arguments)\r
-                    if (v.name == name)\r
-                        return v;\r
-\r
-            for (auto& v : getGlobalConstants())\r
+            for (auto& v : function->arguments)\r
                 if (v.name == name)\r
                     return v;\r
 \r
-            for (auto& v : getGlobalVariables())\r
+            for (auto& v : getGlobalConstants())\r
                 if (v.name == name)\r
                     return v;\r
 \r
-            for (auto& v : getGlobalArrays())\r
+            for (auto& v : getGlobalVariables())\r
                 if (v.name == name)\r
                     return v;\r
 \r
@@ -1574,10 +1358,10 @@ private:
 \r
         void addVariable (Variable v, const CodeLocation& locationForError)\r
         {\r
-            if (v.name.isNotEmpty() && (indexOf (variables, v.name) >= 0 || indexOf (constants, v.name) >= 0 || indexOf (arrays, v.name) >= 0))\r
+            if (indexOf (variables, v.name) >= 0 || indexOf (constants, v.name) >= 0)\r
                 locationForError.throwError ("Variable '" + v.name + "' already exists");\r
 \r
-            (v.numElements == 0 ? (v.isConst ? constants : variables) : arrays).add (v);\r
+            (v.isConst ? constants : variables).add (v);\r
         }\r
 \r
         static int indexOf (const Array<Variable>& vars, const String& name) noexcept\r
@@ -1591,7 +1375,7 @@ private:
 \r
         Function* function;\r
         Array<StatementPtr> statements;\r
-        Array<Variable> variables, constants, arrays;\r
+        Array<Variable> variables, constants;\r
         bool isMainBlockOfFunction;\r
     };\r
 \r
@@ -1879,11 +1663,6 @@ private:
             return this;\r
         }\r
 \r
-        String getIdentifier() const override\r
-        {\r
-            return name;\r
-        }\r
-\r
         String name;\r
     };\r
 \r
@@ -2126,7 +1905,7 @@ private:
 \r
     struct Assignment  : public Expression\r
     {\r
-        Assignment (const CodeLocation& l, BlockPtr parent, ExpPtr dest, ExpPtr source, bool isPost) noexcept\r
+        Assignment (const CodeLocation& l, BlockPtr parent, const String& dest, ExpPtr source, bool isPost) noexcept\r
             : Expression (l, parent), target (dest), newValue (source), isPostAssignment (isPost) {}\r
 \r
         void emit (CodeGenerator& cg, Type requiredType, int stackDepth) const override\r
@@ -2135,50 +1914,42 @@ private:
 \r
             if (isPostAssignment && requiredType != Type::void_)\r
             {\r
-                target->emit (cg, requiredType, stackDepth);\r
+                cg.emitVariableRead (variableType, requiredType, stackDepth,\r
+                                     parentBlock->getVariableDepth (target, location), location);\r
                 ++stackDepth;\r
                 requiredType = Type::void_;\r
             }\r
 \r
             newValue->emit (cg, variableType, stackDepth);\r
+            auto index = parentBlock->getVariableDepth (target, location);\r
+\r
+            if (requiredType != Type::void_)\r
+            {\r
+                cg.emit (OpCode::dup);\r
+                ++stackDepth;\r
+            }\r
 \r
-            if (auto a = dynamic_cast<ArraySubscript*> (target))\r
+            if (index < 0)\r
             {\r
-                cg.emitArrayElementIndex (a, parentBlock, stackDepth, location);\r
-                cg.emit (OpCode::setHeapInt);\r
+                cg.emit (OpCode::dropToGlobal, (int16) ((-index) - 1));\r
             }\r
             else\r
             {\r
-                auto index = parentBlock->getVariableDepth (target->getIdentifier(), location);\r
-\r
-                if (requiredType != Type::void_)\r
-                {\r
-                    cg.emit (OpCode::dup);\r
-                    ++stackDepth;\r
-                }\r
+                index += stackDepth;\r
 \r
-                if (index < 0)\r
-                {\r
-                    cg.emit (OpCode::dropToGlobal, (int16) ((-index) - 1));\r
-                }\r
+                if (index >= 128)\r
+                    cg.emit (OpCode::dropToStack16, (int16) index);\r
                 else\r
-                {\r
-                    index += stackDepth;\r
-\r
-                    if (index >= 128)\r
-                        cg.emit (OpCode::dropToStack16, (int16) index);\r
-                    else\r
-                        cg.emit (OpCode::dropToStack, (int8) index);\r
-                }\r
-\r
-                if (requiredType != Type::void_)\r
-                    cg.emitCast (variableType, requiredType, location);\r
+                    cg.emit (OpCode::dropToStack, (int8) index);\r
             }\r
+\r
+            if (requiredType != Type::void_)\r
+                cg.emitCast (variableType, requiredType, location);\r
         }\r
 \r
         Type getType (CodeGenerator&) const override\r
         {\r
-            return parentBlock->getVariable (target->getIdentifier(), location).type;\r
+            return parentBlock->getVariable (target, location).type;\r
         }\r
 \r
         void visitSubStatements (Statement::Visitor& visit) const override\r
@@ -2192,7 +1963,8 @@ private:
             return this;\r
         }\r
 \r
-        ExpPtr target, newValue;\r
+        String target;\r
+        ExpPtr newValue;\r
         bool isPostAssignment;\r
     };\r
 \r
@@ -2353,10 +2125,9 @@ private:
     {\r
         ArraySubscript (const CodeLocation& l, BlockPtr parent) noexcept  : Expression (l, parent) {}\r
 \r
-        void emit (CodeGenerator& cg, Type /*requiredType*/, int stackDepth) const override\r
+        void emit (CodeGenerator&, Type /*requiredType*/, int /*stackDepth*/) const override\r
         {\r
-            cg.emitArrayElementIndex (this, parentBlock, stackDepth, location);\r
-            cg.emit (OpCode::getHeapInt);\r
+            location.throwError ("Arrays are not implemented yet!");\r
         }\r
 \r
         void visitSubStatements (Statement::Visitor& visit) const override\r
@@ -2376,18 +2147,6 @@ private:
             return object->getType (cg);\r
         }\r
 \r
-        String getIdentifier() const override\r
-        {\r
-            if (auto i = dynamic_cast<Identifier*> (object))\r
-                return i->name;\r
-\r
-            if (auto s = dynamic_cast<ArraySubscript*> (object))\r
-                return s->getIdentifier();\r
-\r
-            location.throwError ("This operator requires an assignable variable");\r
-            return {};\r
-        }\r
-\r
         ExpPtr object, index;\r
     };\r
 \r
index beff6be4635072d3192d8162951e5fcc40b5319b..92609aa8f11d3d95bb807086255a52bd6092de23 100644 (file)
@@ -20,8 +20,6 @@
   ==============================================================================\r
 */\r
 \r
-#define JUCE_DUMP_LITTLEFOOT_HEAP_STATUS 0\r
-\r
 namespace littlefoot\r
 {\r
 \r
@@ -191,7 +189,6 @@ struct LittleFootRemoteHeap
                     for (uint32 j = 0; j < blockSize; ++j)\r
                         deviceState[j] = m.resultDataState[j];\r
 \r
-                    programStateKnown = false;\r
                     messagesSent.removeRange (0, i + 1);\r
                     dumpStatus();\r
                     sendChanges (bi, false);\r
@@ -266,7 +263,7 @@ private:
 \r
     void dumpStatus()\r
     {\r
-       #if JUCE_DUMP_LITTLEFOOT_HEAP_STATUS\r
+       #if DUMP_LITTLEFOOT_HEAP_STATUS\r
         int differences = 0;\r
         constexpr int diffLen = 50;\r
         char areas[diffLen + 1] = { 0 };\r
index 788474f35acbeb6d7c03ea188a8fdd66a3460e55..0091e6f7f40931b2e5680921dd346f538b690216 100644 (file)
@@ -130,8 +130,6 @@ enum class Type  : uint8
     float_  = 'f'\r
 };\r
 \r
-const int numBytesInType = 4;\r
-\r
 //==============================================================================\r
 /** Defines a native function that the program can call.\r
 \r
@@ -145,11 +143,11 @@ struct NativeFunction
         The format of nameAndArgumentTypes is "name/[return type][arg1][arg2..]"\r
         So for example "int foobar (float, bool)" would be "foobar/ifb"\r
     */\r
-    NativeFunction (const char* nameAndArgumentTypes, ImplementationFunction fn)\r
+    NativeFunction (const char* nameAndArgumentTypes, ImplementationFunction fn) noexcept\r
         : nameAndArguments (nameAndArgumentTypes), function (fn),\r
           functionID (createID (nameAndArgumentTypes)), returnType(), numArgs()\r
     {\r
-        auto slash = indexOfSlash (nameAndArgumentTypes);\r
+        const int slash = indexOfSlash (nameAndArgumentTypes);\r
 \r
         if (slash > 0)\r
         {\r
@@ -167,9 +165,11 @@ struct NativeFunction
     uint8 numArgs;                      /**< The number of arguments that the function takes. */\r
 \r
     /** Converts a function signature to its hashed ID. */\r
-    static FunctionID createID (const char* nameAndArgTypes)\r
+    static FunctionID createID (const char* nameAndArgTypes) noexcept\r
     {\r
-        auto slash = indexOfSlash (nameAndArgTypes);\r
+        jassert (nameAndArgTypes != nullptr && nameAndArgTypes[0] != 0); // the name cannot be an empty string!\r
+        int hash = 0, i = 0;\r
+        const int slash = indexOfSlash (nameAndArgTypes);\r
 \r
         jassert (slash > 0); // The slash can't be the first character in this string!\r
         jassert (nameAndArgTypes[slash + 1] != 0);  // The slash must be followed by a return type character\r
@@ -178,11 +178,9 @@ struct NativeFunction
         jassert (juce::String (nameAndArgTypes).substring (slash + 1).containsOnly ("vifb"));\r
         jassert (juce::String (nameAndArgTypes).substring (slash + 2).containsOnly ("ifb")); // arguments must only be of these types\r
 \r
-        uint32 hash = 0, i = 0;\r
-\r
         for (; nameAndArgTypes[i] != 0; ++i)\r
-            if (i != (uint32) (slash + 1))\r
-                hash = hash * 31u + (uint32) nameAndArgTypes[i];\r
+            if (i != slash + 1)\r
+                hash = hash * 31 + nameAndArgTypes[i];\r
 \r
         return static_cast<FunctionID> (hash + i);\r
     }\r
@@ -190,8 +188,6 @@ struct NativeFunction
 private:\r
     static int indexOfSlash (const char* nameAndArgs) noexcept\r
     {\r
-        jassert (nameAndArgs != nullptr && nameAndArgs[0] != 0); // the name cannot be an empty string!\r
-\r
         for (int i = 0; nameAndArgs[i] != 0; ++i)\r
             if (nameAndArgs[i] == '/')\r
                 return i;\r
@@ -235,7 +231,7 @@ struct Program
     uint16 calculateChecksum() const noexcept\r
     {\r
         auto size = getProgramSize();\r
-        auto n = (uint16) size;\r
+        uint16 n = (uint16) size;\r
 \r
         for (uint32 i = 2; i < size; ++i)\r
             n += (n * 2) + programStart[i];\r
@@ -386,7 +382,7 @@ struct Program
 \r
     //==============================================================================\r
     static constexpr uint32 programHeaderSize = 10;\r
-    const uint8* programStart = nullptr;\r
+    const uint8* programStart = 0;\r
     const uint32 maxProgramSize;\r
 \r
 private:\r
index 149aa89ae44f530308b6ca875274d43f6516b08a..1d41f1344bc9511674868bbe4b6aa6262d5e2749 100644 (file)
@@ -5,7 +5,7 @@ The first 7 bits of a message is the index of the device within the topology to
 message should be delivered, or from which it originated. The 0x40 bit of this will be set
 to indicate that it's a device->host message, or clear for host->device
 \r
-The next 32 bits are a timestamp, in milliseconds since the source device was booted.
+The next 32 bits are a timestamp, in milliseconds since the source device was booted. 
 If sending from the host to the device, or for types of packet \r
 where the timestamp is irrelevant, this can be 0.\r
 \r
@@ -27,7 +27,7 @@ This is followed by a series of device-info blocks of the form:
 10 bits - device firmware version\r
 6 bits - battery status\r
 \r
-Next follows by a series of connection-info blocks of the form:\r
+Next follows by a series of connection-info blocks of ths form:\r
 \r
 7 bits - device 1 index (i.e. index in the list of devices sent above)\r
 5 bits - device 1 port type\r
index 3cda5b8aae2033025d9e708f0b2560e03e3a550d..c74b63560e4289868507a2e87f210aaf2ea7e52b 100644 (file)
@@ -51,8 +51,8 @@ enum class MessageFromDevice
     firmwareUpdateACK       = 0x03,\r
     deviceTopologyExtend    = 0x04,\r
     deviceTopologyEnd       = 0x05,\r
-    deviceVersion           = 0x06,\r
-    deviceName              = 0x07,\r
+    deviceVersionList       = 0x06,\r
+    deviceNameList          = 0x07,\r
 \r
     touchStart              = 0x10,\r
     touchMove               = 0x11,\r
@@ -232,8 +232,6 @@ enum ConfigItemId
     slideCC             = 6,\r
     slideMode           = 7,\r
     octaveTopology      = 8,\r
-    midiChannelRange    = 9,\r
-    MPEZone             = 40,\r
     // Touch\r
     velocitySensitivity = 10,\r
     glideSensitivity    = 11,\r
@@ -365,8 +363,7 @@ enum ConfigCommands
     updateUserConfig            = 0x05, // As above but contains user config metadata\r
     setConfigState              = 0x06, // Set config activation state and whether it is saved in flash\r
     factorySyncEnd              = 0x07,\r
-    clusterConfigSync           = 0x08,\r
-    factorySyncReset            = 0x09\r
+    clusterConfigSync           = 0x08\r
 };\r
 \r
 using ConfigCommand = IntegerWithBitSize<4>;\r
index ac823854a5a6f85ef067cf61e212728c2177cfe9..8e8585390e6eef1493b94cde26b175afe1be4077 100644 (file)
@@ -281,7 +281,7 @@ struct HostPacketBuilder
         if (! data.hasCapacity (MessageType::bits))\r
             return false;\r
 \r
-        writeMessageType (MessageFromHost::factoryReset);\r
+        writeMessageType(MessageFromHost::factoryReset);\r
         return true;\r
     }\r
 \r
@@ -290,7 +290,7 @@ struct HostPacketBuilder
         if (! data.hasCapacity (MessageType::bits))\r
             return false;\r
 \r
-        writeMessageType (MessageFromHost::blockReset);\r
+        writeMessageType(MessageFromHost::blockReset);\r
         return true;\r
     }\r
 \r
index 517d6ea620f5492b4e6a5ec83087d3dbf41e814f..ddac5af1eed91cef346ee3807a5106d667d44d8e 100644 (file)
@@ -49,38 +49,29 @@ struct HostPacketDecoder
             auto packetTimestamp = reader.read<PacketTimestamp>();\r
             deviceIndex &= 63; // top bit is used as a direction indicator\r
 \r
-            for (;;)\r
-            {\r
-                auto nextMessageType = getMessageType (reader);\r
-\r
-                if (nextMessageType == 0)\r
-                    break;\r
-\r
-                if (! processNextMessage (handler, reader, (MessageFromDevice) nextMessageType, deviceIndex, packetTimestamp))\r
-                    break;\r
-            }\r
+            while (processNextMessage (handler, reader, deviceIndex, packetTimestamp))\r
+            {}\r
         }\r
     }\r
 \r
-    static uint32 getMessageType (Packed7BitArrayReader& reader)\r
+    static bool processNextMessage (Handler& handler, Packed7BitArrayReader& reader,\r
+                                    TopologyIndex deviceIndex, PacketTimestamp packetTimestamp)\r
     {\r
         if (reader.getRemainingBits() < MessageType::bits)\r
-            return 0;\r
+            return false;\r
 \r
-        return reader.read<MessageType>().get();\r
-    }\r
+        auto messageType = reader.read<MessageType>().get();\r
 \r
-    static bool processNextMessage (Handler& handler, Packed7BitArrayReader& reader,\r
-                                    MessageFromDevice messageType, TopologyIndex deviceIndex,\r
-                                    PacketTimestamp packetTimestamp)\r
-    {\r
-        switch (messageType)\r
+        if (messageType == 0)\r
+            return false;\r
+\r
+        switch ((MessageFromDevice) messageType)\r
         {\r
             case MessageFromDevice::deviceTopology:           return handleTopology (handler, reader, true);\r
             case MessageFromDevice::deviceTopologyExtend:     return handleTopology (handler, reader, false);\r
             case MessageFromDevice::deviceTopologyEnd:        return handleTopologyEnd (handler, reader);\r
-            case MessageFromDevice::deviceVersion:            return handleVersion (handler, reader);\r
-            case MessageFromDevice::deviceName:               return handleName (handler, reader);\r
+            case MessageFromDevice::deviceVersionList:        return handleVersion (handler, reader);\r
+            case MessageFromDevice::deviceNameList:           return handleName (handler, reader);\r
             case MessageFromDevice::touchStart:               return handleTouch (handler, reader, deviceIndex, packetTimestamp, true, false);\r
             case MessageFromDevice::touchMove:                return handleTouch (handler, reader, deviceIndex, packetTimestamp, false, false);\r
             case MessageFromDevice::touchEnd:                 return handleTouch (handler, reader, deviceIndex, packetTimestamp, false, true);\r
@@ -317,10 +308,7 @@ struct HostPacketDecoder
             return false;\r
         }\r
 \r
-        auto ackCode   = reader.read<FirmwareUpdateACKCode>();\r
-        auto ackDetail = reader.read<FirmwareUpdateACKDetail>();\r
-\r
-        handler.handleFirmwareUpdateACK (deviceIndex, ackCode, ackDetail);\r
+        handler.handleFirmwareUpdateACK (deviceIndex, reader.read<FirmwareUpdateACKCode>(), reader.read<FirmwareUpdateACKDetail>());\r
         return true;\r
     }\r
 \r
@@ -353,11 +341,6 @@ struct HostPacketDecoder
             handler.handleConfigFactorySyncEndMessage (deviceIndex);\r
         }\r
 \r
-        if (type == factorySyncReset)\r
-        {\r
-            handler.handleConfigFactorySyncResetMessage (deviceIndex);\r
-        }\r
-\r
         return true;\r
     }\r
 \r
index 8618725597898327f17aa6e39fac1e66c7adb868..0b0fb8be150e775c3168c406362881e6d3a8d7a3 100644 (file)
 namespace juce\r
 {\r
 \r
-//==============================================================================\r
-/** These can be useful when debugging the topology. */\r
-#define LOG_BLOCKS_CONNECTIVITY 0\r
-#define LOG_BLOCKS_PINGS 0\r
-#define DUMP_BANDWIDTH_STATS 0\r
-\r
-#define TOPOLOGY_LOG(text) \\r
-    JUCE_BLOCK_WITH_FORCED_SEMICOLON (juce::String buf ("Topology Src:   "); \\r
-    juce::Logger::outputDebugString (buf << text);)\r
-\r
-#if LOG_BLOCKS_CONNECTIVITY\r
- #define LOG_CONNECTIVITY(text) TOPOLOGY_LOG(text)\r
-#else\r
- #define LOG_CONNECTIVITY(text)\r
-#endif\r
-\r
-#if LOG_BLOCKS_PINGS\r
- #define LOG_PING(text) TOPOLOGY_LOG(text)\r
-#else\r
- #define LOG_PING(text)\r
-#endif\r
+#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED \\r
+    jassert (juce::MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
 #if DUMP_BANDWIDTH_STATS\r
 namespace\r
@@ -122,6 +103,7 @@ juce::String getMidiIOStats()
 }\r
 #endif\r
 \r
+\r
 //==============================================================================\r
 struct PhysicalTopologySource::Internal\r
 {\r
@@ -222,7 +204,6 @@ struct PhysicalTopologySource::Internal
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MIDIDeviceConnection)\r
     };\r
 \r
-    //==============================================================================\r
     struct MIDIDeviceDetector  : public DeviceDetector\r
     {\r
         MIDIDeviceDetector() {}\r
@@ -247,8 +228,6 @@ struct PhysicalTopologySource::Internal
 \r
                 if (dev->lockAgainstOtherProcesses (pair.inputName, pair.outputName))\r
                 {\r
-                    lockedFromOutside = false;\r
-\r
                     dev->midiInput.reset (juce::MidiInput::openDevice (pair.inputIndex, dev.get()));\r
                     dev->midiOutput.reset (juce::MidiOutput::openDevice (pair.outputIndex));\r
 \r
@@ -258,20 +237,11 @@ struct PhysicalTopologySource::Internal
                         return dev.release();\r
                     }\r
                 }\r
-                else\r
-                {\r
-                    lockedFromOutside = true;\r
-                }\r
             }\r
 \r
             return nullptr;\r
         }\r
 \r
-        bool isLockedFromOutside() const override\r
-        {\r
-            return lockedFromOutside && ! findDevices().isEmpty();\r
-        }\r
-\r
         static bool isBlocksMidiDeviceName (const juce::String& name)\r
         {\r
             return name.indexOf (" BLOCK") > 0 || name.indexOf (" Block") > 0;\r
@@ -333,42 +303,20 @@ struct PhysicalTopologySource::Internal
             return result;\r
         }\r
 \r
-    private:\r
-        bool lockedFromOutside = true;\r
-\r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MIDIDeviceDetector)\r
     };\r
 \r
     //==============================================================================\r
     struct DeviceInfo\r
     {\r
-        // VS2015 requires a constructor to avoid aggregate initialization\r
-        DeviceInfo (Block::UID buid, BlocksProtocol::TopologyIndex tidx, BlocksProtocol::BlockSerialNumber s,\r
-                    BlocksProtocol::VersionNumber v, BlocksProtocol::BlockName n, bool master = false)\r
-            : uid (buid), index (tidx), serial (s), version (v), name (n), isMaster (master)\r
-        {\r
-        }\r
-\r
-        Block::UID uid {};\r
+        Block::UID uid;\r
         BlocksProtocol::TopologyIndex index;\r
         BlocksProtocol::BlockSerialNumber serial;\r
         BlocksProtocol::VersionNumber version;\r
         BlocksProtocol::BlockName name;\r
-        bool isMaster {};\r
+        bool isMaster;\r
     };\r
 \r
-    static juce::String getVersionString (const BlocksProtocol::VersionNumber& v)\r
-    {\r
-        return juce::String (reinterpret_cast<const char*> (v.version),\r
-                             std::min (sizeof (v.version), static_cast<size_t> (v.length)));\r
-    }\r
-\r
-    static juce::String getNameString (const BlocksProtocol::BlockName& n)\r
-    {\r
-        return juce::String (reinterpret_cast<const char*> (n.name),\r
-                             std::min (sizeof (n.name), static_cast<size_t> (n.length)));\r
-    }\r
-\r
     static Block::Timestamp deviceTimestampToHost (uint32 timestamp) noexcept\r
     {\r
         return static_cast<Block::Timestamp> (timestamp);\r
@@ -377,7 +325,7 @@ struct PhysicalTopologySource::Internal
     static juce::Array<DeviceInfo> getArrayOfDeviceInfo (const juce::Array<BlocksProtocol::DeviceStatus>& devices)\r
     {\r
         juce::Array<DeviceInfo> result;\r
-        bool isFirst = true; // TODO: First block not always master block! Assumption violated.\r
+        bool isFirst = true;\r
 \r
         for (auto& device : devices)\r
         {\r
@@ -397,6 +345,15 @@ struct PhysicalTopologySource::Internal
         return result;\r
     }\r
 \r
+    static bool containsBlockWithUID (const juce::Array<DeviceInfo>& devices, Block::UID uid) noexcept\r
+    {\r
+        for (auto&& d : devices)\r
+            if (d.uid == uid)\r
+                return true;\r
+\r
+        return false;\r
+    }\r
+\r
     static bool containsBlockWithUID (const Block::Array& blocks, Block::UID uid) noexcept\r
     {\r
         for (auto&& block : blocks)\r
@@ -406,27 +363,41 @@ struct PhysicalTopologySource::Internal
         return false;\r
     }\r
 \r
-    static bool versionNumberChanged (const DeviceInfo& device, juce::String version) noexcept\r
+    static bool versionNumberAddedToBlock (const juce::Array<DeviceInfo>& devices, Block::UID uid, juce::String version) noexcept\r
     {\r
-        auto deviceVersion = getVersionString (device.version);\r
-        return deviceVersion != version && deviceVersion.isNotEmpty();\r
+        for (auto&& d : devices)\r
+        {\r
+            String deviceVersion (reinterpret_cast<const char*> (d.version.version),\r
+                                  jmin (static_cast<size_t> (d.version.length), sizeof (d.version.version)));\r
+\r
+            if (d.uid == uid && deviceVersion != version && deviceVersion.isNotEmpty())\r
+                return true;\r
+        }\r
+\r
+        return false;\r
     }\r
 \r
-    static bool nameIsValid (const DeviceInfo& device)\r
+    static bool nameAddedToBlock (const juce::Array<DeviceInfo>& devices, Block::UID uid) noexcept\r
     {\r
-        return device.name.length > 0;\r
+        for (auto&& d : devices)\r
+            if (d.uid == uid && d.name.length)\r
+                return true;\r
+\r
+        return false;\r
     }\r
 \r
-    static void setVersionNumberForBlock (const DeviceInfo& deviceInfo, Block& block) noexcept\r
+    static void setVersionNumberForBlock (const juce::Array<DeviceInfo>& devices, Block& block) noexcept\r
     {\r
-        jassert (deviceInfo.uid == block.uid);\r
-        block.versionNumber = getVersionString (deviceInfo.version);\r
+        for (auto&& d : devices)\r
+            if (d.uid == block.uid)\r
+                block.versionNumber = juce::String ((const char*) d.version.version, d.version.length);\r
     }\r
 \r
-    static void setNameForBlock (const DeviceInfo& deviceInfo, Block& block)\r
+    static void setNameForBlock (const juce::Array<DeviceInfo>& devices, Block& block) noexcept\r
     {\r
-        jassert (deviceInfo.uid == block.uid);\r
-        block.name = getNameString (deviceInfo.name);\r
+        for (auto&& d : devices)\r
+            if (d.uid == block.uid)\r
+                block.name = juce::String ((const char*) d.name.name, d.name.length);\r
     }\r
 \r
     //==============================================================================\r
@@ -436,6 +407,8 @@ struct PhysicalTopologySource::Internal
         ConnectedDeviceGroup (Detector& d, const juce::String& name, DeviceConnection* connection)\r
             : detector (d), deviceName (name), deviceConnection (connection)\r
         {\r
+            lastGlobalPingTime = juce::Time::getCurrentTime();\r
+\r
             deviceConnection->handleMessageFromDevice = [this] (const void* data, size_t dataSize)\r
             {\r
                 this->handleIncomingMessage (data, dataSize);\r
@@ -448,7 +421,17 @@ struct PhysicalTopologySource::Internal
         bool isStillConnected (const juce::StringArray& detectedDevices) const noexcept\r
         {\r
             return detectedDevices.contains (deviceName)\r
-                && ! failedToGetTopology();\r
+                    && ! failedToGetTopology()\r
+                    && lastGlobalPingTime > juce::Time::getCurrentTime() - juce::RelativeTime::seconds (pingTimeoutSeconds);\r
+        }\r
+\r
+        Block::UID getDeviceIDFromIndex (BlocksProtocol::TopologyIndex index) const noexcept\r
+        {\r
+            for (auto& d : currentDeviceInfo)\r
+                if (d.index == index)\r
+                    return d.uid;\r
+\r
+            return {};\r
         }\r
 \r
         int getIndexFromDeviceID (Block::UID uid) const noexcept\r
@@ -478,9 +461,47 @@ struct PhysicalTopologySource::Internal
             return nullptr;\r
         }\r
 \r
-        void notifyBlockIsRestarting (Block::UID deviceID)\r
+        //==============================================================================\r
+        juce::Time lastTopologyRequestTime, lastTopologyReceiveTime;\r
+        int numTopologyRequestsSent = 0;\r
+\r
+        void sendTopologyRequest()\r
+        {\r
+            ++numTopologyRequestsSent;\r
+            lastTopologyRequestTime = juce::Time::getCurrentTime();\r
+            sendCommandMessage (0, BlocksProtocol::requestTopologyMessage);\r
+        }\r
+\r
+        void scheduleNewTopologyRequest()\r
         {\r
-            forceApiDisconnected (deviceID);\r
+            numTopologyRequestsSent = 0;\r
+            lastTopologyReceiveTime = juce::Time();\r
+        }\r
+\r
+        bool failedToGetTopology() const noexcept\r
+        {\r
+            return numTopologyRequestsSent > 4 && lastTopologyReceiveTime == juce::Time();\r
+        }\r
+\r
+        bool hasAnyBlockStoppedPinging() const noexcept\r
+        {\r
+            auto now = juce::Time::getCurrentTime();\r
+\r
+            for (auto& ping : blockPings)\r
+                if (ping.lastPing < now - juce::RelativeTime::seconds (pingTimeoutSeconds))\r
+                    return true;\r
+\r
+            return false;\r
+        }\r
+\r
+        void timerCallback() override\r
+        {\r
+            auto now = juce::Time::getCurrentTime();\r
+\r
+            if ((now > lastTopologyReceiveTime + juce::RelativeTime::seconds (30.0) || hasAnyBlockStoppedPinging())\r
+                  && now > lastTopologyRequestTime + juce::RelativeTime::seconds (1.0)\r
+                  && numTopologyRequestsSent < 4)\r
+                sendTopologyRequest();\r
         }\r
 \r
         //==============================================================================\r
@@ -514,34 +535,41 @@ struct PhysicalTopologySource::Internal
             currentDeviceInfo = getArrayOfDeviceInfo (incomingTopologyDevices);\r
             currentDeviceConnections = getArrayOfConnections (incomingTopologyConnections);\r
             currentTopologyDevices = incomingTopologyDevices;\r
-            lastTopologyReceiveTime = juce::Time::getCurrentTime();\r
-\r
-            const int numRemoved = blockPings.removeIf ([this] (auto& ping)\r
-            {\r
-                for (auto& info : currentDeviceInfo)\r
-                    if (info.uid == ping.blockUID)\r
-                        return false;\r
-\r
-                LOG_CONNECTIVITY ("API Disconnected by topology update " << ping.blockUID);\r
-                return true;\r
-            });\r
+            currentTopologyConnections = incomingTopologyConnections;\r
+            detector.handleTopologyChange();\r
 \r
-            if (numRemoved > 0)\r
-                detector.handleTopologyChange();\r
+            lastTopologyReceiveTime = juce::Time::getCurrentTime();\r
+            blockPings.clear();\r
         }\r
 \r
         void handleVersion (BlocksProtocol::DeviceVersion version)\r
         {\r
-            for (auto& d : currentDeviceInfo)\r
-                if (d.index == version.index && version.version.length > 1)\r
-                    d.version = version.version;\r
+            for (auto i = 0; i < currentDeviceInfo.size(); ++i)\r
+            {\r
+                if (currentDeviceInfo[i].index == version.index && version.version.length > 1)\r
+                {\r
+                    if (memcmp (currentDeviceInfo.getReference (i).version.version, version.version.version, sizeof (version.version)))\r
+                    {\r
+                        currentDeviceInfo.getReference(i).version = version.version;\r
+                        detector.handleTopologyChange();\r
+                    }\r
+                }\r
+            }\r
         }\r
 \r
         void handleName (BlocksProtocol::DeviceName name)\r
         {\r
-            for (auto& d : currentDeviceInfo)\r
-                if (d.index == name.index && name.name.length > 1)\r
-                    d.name = name.name;\r
+            for (auto i = 0; i < currentDeviceInfo.size(); ++i)\r
+            {\r
+                if (currentDeviceInfo[i].index == name.index && name.name.length > 1)\r
+                {\r
+                    if (memcmp (currentDeviceInfo.getReference (i).name.name, name.name.name, sizeof (name.name)))\r
+                    {\r
+                        currentDeviceInfo.getReference (i).name = name.name;\r
+                        detector.handleTopologyChange();\r
+                    }\r
+                }\r
+            }\r
         }\r
 \r
         void handleControlButtonUpDown (BlocksProtocol::TopologyIndex deviceIndex, uint32 timestamp,\r
@@ -597,36 +625,25 @@ struct PhysicalTopologySource::Internal
             touch.startY = startPos.y;\r
         }\r
 \r
-        void handlePacketACK (BlocksProtocol::TopologyIndex deviceIndex,\r
-                              BlocksProtocol::PacketCounter counter)\r
+        void handlePacketACK (BlocksProtocol::TopologyIndex deviceIndex, BlocksProtocol::PacketCounter counter)\r
         {\r
             if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
-            {\r
                 detector.handleSharedDataACK (deviceID, counter);\r
-                updateApiPing (deviceID);\r
-            }\r
         }\r
 \r
-        void handleFirmwareUpdateACK (BlocksProtocol::TopologyIndex deviceIndex,\r
-                                      BlocksProtocol::FirmwareUpdateACKCode resultCode,\r
-                                      BlocksProtocol::FirmwareUpdateACKDetail resultDetail)\r
+        void handleFirmwareUpdateACK (BlocksProtocol::TopologyIndex deviceIndex, BlocksProtocol::FirmwareUpdateACKCode resultCode, BlocksProtocol::FirmwareUpdateACKDetail resultDetail)\r
         {\r
             if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
-            {\r
                 detector.handleFirmwareUpdateACK (deviceID, (uint8) resultCode.get(), (uint32) resultDetail.get());\r
-                updateApiPing (deviceID);\r
-            }\r
         }\r
 \r
-        void handleConfigUpdateMessage (BlocksProtocol::TopologyIndex deviceIndex,\r
-                                        int32 item, int32 value, int32 min, int32 max)\r
+        void handleConfigUpdateMessage (BlocksProtocol::TopologyIndex deviceIndex, int32 item, int32 value, int32 min, int32 max)\r
         {\r
             if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
                 detector.handleConfigUpdateMessage (deviceID, item, value, min, max);\r
         }\r
 \r
-        void handleConfigSetMessage (BlocksProtocol::TopologyIndex deviceIndex,\r
-                                     int32 item, int32 value)\r
+        void handleConfigSetMessage (BlocksProtocol::TopologyIndex deviceIndex, int32 item, int32 value)\r
         {\r
             if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
                 detector.handleConfigSetMessage (deviceID, item, value);\r
@@ -638,12 +655,6 @@ struct PhysicalTopologySource::Internal
                 detector.handleConfigFactorySyncEndMessage (deviceID);\r
         }\r
 \r
-        void handleConfigFactorySyncResetMessage (BlocksProtocol::TopologyIndex deviceIndex)\r
-        {\r
-            if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
-                detector.handleConfigFactorySyncResetMessage (deviceID);\r
-        }\r
-\r
         void handleLogMessage (BlocksProtocol::TopologyIndex deviceIndex, const String& message)\r
         {\r
             if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
@@ -665,91 +676,52 @@ struct PhysicalTopologySource::Internal
             return false;\r
         }\r
 \r
-        DeviceConnection* getDeviceConnection()\r
+        bool sendCommandMessage (BlocksProtocol::TopologyIndex deviceIndex, uint32 commandID) const\r
         {\r
-            return deviceConnection.get();\r
+            BlocksProtocol::HostPacketBuilder<64> p;\r
+            p.writePacketSysexHeaderBytes (deviceIndex);\r
+            p.deviceControlMessage (commandID);\r
+            p.writePacketSysexFooter();\r
+            return sendMessageToDevice (p);\r
         }\r
 \r
-        juce::Array<DeviceInfo> getCurrentDeviceInfo()\r
+        bool broadcastCommandMessage (uint32 commandID) const\r
         {\r
-            auto blocks = currentDeviceInfo;\r
-            blocks.removeIf ([this] (DeviceInfo& info) { return ! isApiConnected (info.uid); });\r
-            return blocks;\r
+            return sendCommandMessage (BlocksProtocol::topologyIndexForBroadcast, commandID);\r
         }\r
 \r
-        juce::Array<BlockDeviceConnection> getCurrentDeviceConnections()\r
+        DeviceConnection* getDeviceConnection()\r
         {\r
-            auto connections = currentDeviceConnections;\r
-            connections.removeIf ([this] (BlockDeviceConnection& c) { return ! isApiConnected (c.device1) || ! isApiConnected (c.device2); });\r
-            return connections;\r
+            return deviceConnection.get();\r
         }\r
 \r
         Detector& detector;\r
         juce::String deviceName;\r
 \r
+        juce::Array<DeviceInfo> currentDeviceInfo;\r
+        juce::Array<BlockDeviceConnection> currentDeviceConnections;\r
+\r
         static constexpr double pingTimeoutSeconds = 6.0;\r
 \r
     private:\r
         //==============================================================================\r
-        juce::Array<DeviceInfo> currentDeviceInfo;\r
-        juce::Array<BlockDeviceConnection> currentDeviceConnections;\r
         std::unique_ptr<DeviceConnection> deviceConnection;\r
 \r
         juce::Array<BlocksProtocol::DeviceStatus> incomingTopologyDevices, currentTopologyDevices;\r
-        juce::Array<BlocksProtocol::DeviceConnection> incomingTopologyConnections;\r
+        juce::Array<BlocksProtocol::DeviceConnection> incomingTopologyConnections, currentTopologyConnections;\r
 \r
         juce::CriticalSection incomingPacketLock;\r
         juce::Array<juce::MemoryBlock> incomingPackets;\r
 \r
-        struct TouchStart { float x, y; };\r
-        TouchList<TouchStart> touchStartPositions;\r
-\r
-        //==============================================================================\r
-        juce::Time lastTopologyRequestTime, lastTopologyReceiveTime;\r
-        int numTopologyRequestsSent = 0;\r
-\r
-        void scheduleNewTopologyRequest()\r
-        {\r
-            numTopologyRequestsSent = 0;\r
-            lastTopologyReceiveTime = juce::Time();\r
-            lastTopologyRequestTime = juce::Time::getCurrentTime();\r
-        }\r
-\r
-        void sendTopologyRequest()\r
-        {\r
-            ++numTopologyRequestsSent;\r
-            lastTopologyRequestTime = juce::Time::getCurrentTime();\r
-            sendCommandMessage (0, BlocksProtocol::requestTopologyMessage);\r
-        }\r
-\r
-        void timerCallback() override\r
+        struct TouchStart\r
         {\r
-            const auto now = juce::Time::getCurrentTime();\r
-\r
-            if ((now > lastTopologyReceiveTime + juce::RelativeTime::seconds (30.0))\r
-                && now > lastTopologyRequestTime + juce::RelativeTime::seconds (1.0)\r
-                && numTopologyRequestsSent < 4)\r
-                sendTopologyRequest();\r
-\r
-            checkApiTimeouts (now);\r
-            startApiModeOnConnectedBlocks();\r
-        }\r
+            float x, y;\r
+        };\r
 \r
-        bool failedToGetTopology() const noexcept\r
-        {\r
-            return numTopologyRequestsSent > 4 && lastTopologyReceiveTime == juce::Time();\r
-        }\r
+        TouchList<TouchStart> touchStartPositions;\r
 \r
-        bool sendCommandMessage (BlocksProtocol::TopologyIndex deviceIndex, uint32 commandID) const\r
-        {\r
-            BlocksProtocol::HostPacketBuilder<64> p;\r
-            p.writePacketSysexHeaderBytes (deviceIndex);\r
-            p.deviceControlMessage (commandID);\r
-            p.writePacketSysexFooter();\r
-            return sendMessageToDevice (p);\r
-        }\r
+        juce::Time lastGlobalPingTime;\r
 \r
-        //==============================================================================\r
         struct BlockPingTime\r
         {\r
             Block::UID blockUID;\r
@@ -758,105 +730,30 @@ struct PhysicalTopologySource::Internal
 \r
         juce::Array<BlockPingTime> blockPings;\r
 \r
-        void updateApiPing (Block::UID uid)\r
+        Block::UID getDeviceIDFromMessageIndex (BlocksProtocol::TopologyIndex index) noexcept\r
         {\r
-            const auto now = juce::Time::getCurrentTime();\r
+            auto uid = getDeviceIDFromIndex (index);\r
 \r
-            if (auto* ping = getPing (uid))\r
+            if (uid == Block::UID())\r
             {\r
-                LOG_PING ("Ping: " << uid << " " << now.formatted ("%Mm %Ss"));\r
-                ping->lastPing = now;\r
+                scheduleNewTopologyRequest(); // force a re-request of the topology when we\r
+                                              // get an event from a block that we don't know about\r
             }\r
             else\r
             {\r
-                LOG_CONNECTIVITY ("API Connected " << uid);\r
-                blockPings.add ({ uid, now });\r
-                detector.handleTopologyChange();\r
-            }\r
-        }\r
+                auto now = juce::Time::getCurrentTime();\r
 \r
-        BlockPingTime* getPing (Block::UID uid)\r
-        {\r
-            for (auto& ping : blockPings)\r
-                if (uid == ping.blockUID)\r
-                    return &ping;\r
-\r
-            return nullptr;\r
-        }\r
-\r
-        void removeDeviceInfo (Block::UID uid)\r
-        {\r
-            currentDeviceInfo.removeIf ([uid] (DeviceInfo& info) { return uid == info.uid; });\r
-        }\r
-\r
-        bool isApiConnected (Block::UID uid)\r
-        {\r
-            return getPing (uid) != nullptr;\r
-        }\r
-\r
-        void forceApiDisconnected (Block::UID uid)\r
-        {\r
-            if (isApiConnected (uid))\r
-            {\r
-                // Clear all known API connections and broadcast an empty topology,\r
-                // as DNA blocks connected to the restarting block may be offline.\r
-                LOG_CONNECTIVITY ("API Disconnected " << uid << ", re-probing topology");\r
-                currentDeviceInfo.clearQuick();\r
-                blockPings.clearQuick();\r
-                detector.handleTopologyChange();\r
-                scheduleNewTopologyRequest();\r
-            }\r
-        }\r
-\r
-        void checkApiTimeouts (juce::Time now)\r
-        {\r
-            const auto timedOut = [this, now] (BlockPingTime& ping)\r
-            {\r
-                if (ping.lastPing >= now - juce::RelativeTime::seconds (pingTimeoutSeconds))\r
-                    return false;\r
-\r
-                LOG_CONNECTIVITY ("Ping timeout: " << ping.blockUID);\r
-                removeDeviceInfo (ping.blockUID);\r
-                return true;\r
-            };\r
-\r
-            if (blockPings.removeIf (timedOut) > 0)\r
-            {\r
-                scheduleNewTopologyRequest();\r
-                detector.handleTopologyChange();\r
-            }\r
-        }\r
-\r
-        void startApiModeOnConnectedBlocks()\r
-        {\r
-            for (auto& info : currentDeviceInfo)\r
-            {\r
-                if (! isApiConnected (info.uid))\r
+                for (auto& ping : blockPings)\r
                 {\r
-                    LOG_CONNECTIVITY ("API Try " << info.uid);\r
-                    sendCommandMessage (info.index, BlocksProtocol::endAPIMode);\r
-                    sendCommandMessage (info.index, BlocksProtocol::beginAPIMode);\r
+                    if (ping.blockUID == uid)\r
+                    {\r
+                        ping.lastPing = now;\r
+                        return uid;\r
+                    }\r
                 }\r
-            }\r
-        }\r
-\r
-        //==============================================================================\r
-        Block::UID getDeviceIDFromIndex (BlocksProtocol::TopologyIndex index) const noexcept\r
-        {\r
-            for (auto& d : currentDeviceInfo)\r
-                if (d.index == index)\r
-                    return d.uid;\r
-\r
-            return {};\r
-        }\r
-\r
-        Block::UID getDeviceIDFromMessageIndex (BlocksProtocol::TopologyIndex index) noexcept\r
-        {\r
-            const auto uid = getDeviceIDFromIndex (index);\r
 \r
-            // re-request topology if we get an event from an unknown block\r
-            if (uid == Block::UID())\r
-                scheduleNewTopologyRequest();\r
+                blockPings.add ({ uid, now });\r
+            }\r
 \r
             return uid;\r
         }\r
@@ -870,10 +767,6 @@ struct PhysicalTopologySource::Internal
                 BlockDeviceConnection dc;\r
                 dc.device1 = getDeviceIDFromIndex (c.device1);\r
                 dc.device2 = getDeviceIDFromIndex (c.device2);\r
-\r
-                if (dc.device1 <= 0 || dc.device2 <= 0)\r
-                    continue;\r
-\r
                 dc.connectionPortOnDevice1 = convertConnectionPort (dc.device1, c.port1);\r
                 dc.connectionPortOnDevice2 = convertConnectionPort (dc.device2, c.port2);\r
 \r
@@ -926,6 +819,8 @@ struct PhysicalTopologySource::Internal
                 BlocksProtocol::HostPacketDecoder<ConnectedDeviceGroup>\r
                     ::processNextPacket (*this, *data, data + 1, (int) packet.getSize() - 1);\r
             }\r
+\r
+            lastGlobalPingTime = juce::Time::getCurrentTime();\r
         }\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConnectedDeviceGroup)\r
@@ -938,17 +833,20 @@ struct PhysicalTopologySource::Internal
     {\r
         Detector()  : defaultDetector (new MIDIDeviceDetector()), deviceDetector (*defaultDetector)\r
         {\r
+            topologyBroadcastThrottle.detector = this;\r
             startTimer (10);\r
         }\r
 \r
         Detector (DeviceDetector& dd)  : deviceDetector (dd)\r
         {\r
+            topologyBroadcastThrottle.detector = this;\r
             startTimer (10);\r
         }\r
 \r
         ~Detector()\r
         {\r
             jassert (activeTopologySources.isEmpty());\r
+            jassert (activeControlButtons.isEmpty());\r
         }\r
 \r
         using Ptr = juce::ReferenceCountedObjectPtr<Detector>;\r
@@ -980,7 +878,7 @@ struct PhysicalTopologySource::Internal
                         bi->sendCommandMessage (BlocksProtocol::endAPIMode);\r
 \r
                 currentTopology = {};\r
-                lastTopology = {};\r
+                topologyBroadcastThrottle.lastTopology = {};\r
 \r
                 auto& d = getDefaultDetectorPointer();\r
 \r
@@ -1019,77 +917,66 @@ struct PhysicalTopologySource::Internal
 \r
                 for (auto d : connectedDeviceGroups)\r
                 {\r
-                    newDeviceInfo.addArray (d->getCurrentDeviceInfo());\r
-                    newDeviceConnections.addArray (d->getCurrentDeviceConnections());\r
+                    newDeviceInfo.addArray (d->currentDeviceInfo);\r
+                    newDeviceConnections.addArray (d->currentDeviceConnections);\r
                 }\r
 \r
                 for (int i = currentTopology.blocks.size(); --i >= 0;)\r
                 {\r
-                    auto currentBlock = currentTopology.blocks.getUnchecked (i);\r
-\r
-                    auto newDeviceIter = std::find_if (newDeviceInfo.begin(), newDeviceInfo.end(),\r
-                                                       [&] (DeviceInfo& info) { return info.uid == currentBlock->uid; });\r
-\r
-                    auto* blockImpl = BlockImplementation::getFrom (*currentBlock);\r
+                    auto block = currentTopology.blocks.getUnchecked (i);\r
 \r
-                    if (newDeviceIter == newDeviceInfo.end())\r
+                    if (! containsBlockWithUID (newDeviceInfo, block->uid))\r
                     {\r
-                        if (blockImpl != nullptr)\r
-                            blockImpl->markDisconnected();\r
+                        if (auto bi = BlockImplementation::getFrom (*block))\r
+                            bi->invalidate();\r
 \r
-                        disconnectedBlocks.addIfNotAlreadyThere (currentTopology.blocks.removeAndReturn (i).get());\r
+                        currentTopology.blocks.remove (i);\r
                     }\r
                     else\r
                     {\r
-                        if (blockImpl != nullptr && blockImpl->wasPowerCycled())\r
-                        {\r
-                            blockImpl->resetPowerCycleFlag();\r
-                            blockImpl->markReconnected (newDeviceIter->version, newDeviceIter->name, newDeviceIter->isMaster);\r
-                        }\r
+                        if (versionNumberAddedToBlock (newDeviceInfo, block->uid, block->versionNumber))\r
+                            setVersionNumberForBlock (newDeviceInfo, *block);\r
 \r
-                        updateCurrentBlockInfo (currentBlock, *newDeviceIter);\r
+                        if (nameAddedToBlock (newDeviceInfo, block->uid))\r
+                            setNameForBlock (newDeviceInfo, *block);\r
                     }\r
                 }\r
 \r
-                static const int maxBlocksToSave = 100;\r
-\r
-                if (disconnectedBlocks.size() > maxBlocksToSave)\r
-                    disconnectedBlocks.removeRange (0, 2 * (disconnectedBlocks.size() - maxBlocksToSave));\r
-\r
                 for (auto& info : newDeviceInfo)\r
-                    if (info.serial.isValid() && ! containsBlockWithUID (currentTopology.blocks, getBlockUIDFromSerialNumber (info.serial)))\r
-                        addBlock (info);\r
+                    if (info.serial.isValid())\r
+                        if (! containsBlockWithUID (currentTopology.blocks, getBlockUIDFromSerialNumber (info.serial)))\r
+                            currentTopology.blocks.add (new BlockImplementation (info.serial, *this, info.version, info.name, info.isMaster));\r
 \r
                 currentTopology.connections.swapWith (newDeviceConnections);\r
             }\r
 \r
-            broadcastTopology();\r
-        }\r
-\r
-        void notifyBlockIsRestarting (Block::UID deviceID)\r
-        {\r
-            for (auto& group : connectedDeviceGroups)\r
-                group->notifyBlockIsRestarting (deviceID);\r
+            topologyBroadcastThrottle.scheduleTopologyChangeCallback();\r
         }\r
 \r
         void handleSharedDataACK (Block::UID deviceID, uint32 packetCounter) const\r
         {\r
             JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                bi->handleSharedDataACK (packetCounter);\r
+            for (auto&& b : currentTopology.blocks)\r
+                if (b->uid == deviceID)\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                        bi->handleSharedDataACK (packetCounter);\r
         }\r
 \r
         void handleFirmwareUpdateACK (Block::UID deviceID, uint8 resultCode, uint32 resultDetail)\r
         {\r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                bi->handleFirmwareUpdateACK (resultCode, resultDetail);\r
+            for (auto&& b : currentTopology.blocks)\r
+                if (b->uid == deviceID)\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                        bi->handleFirmwareUpdateACK (resultCode, resultDetail);\r
         }\r
 \r
         void handleConfigUpdateMessage (Block::UID deviceID, int32 item, int32 value, int32 min, int32 max)\r
         {\r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                bi->handleConfigUpdateMessage (item, value, min, max);\r
+            for (auto&& b : currentTopology.blocks)\r
+                if (b->uid == deviceID)\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                        bi->handleConfigUpdateMessage (item, value, min, max);\r
         }\r
 \r
         void notifyBlockOfConfigChange (BlockImplementation& bi, uint32 item)\r
@@ -1105,44 +992,53 @@ struct PhysicalTopologySource::Internal
 \r
         void handleConfigSetMessage (Block::UID deviceID, int32 item, int32 value)\r
         {\r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
+            for (auto&& b : currentTopology.blocks)\r
             {\r
-                bi->handleConfigSetMessage (item, value);\r
-                notifyBlockOfConfigChange (*bi, uint32 (item));\r
+                if (b->uid == deviceID)\r
+                {\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                    {\r
+                        bi->handleConfigSetMessage (item, value);\r
+                        notifyBlockOfConfigChange (*bi, uint32 (item));\r
+                    }\r
+                }\r
             }\r
         }\r
 \r
         void handleConfigFactorySyncEndMessage (Block::UID deviceID)\r
         {\r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                notifyBlockOfConfigChange (*bi, bi->getMaxConfigIndex());\r
-        }\r
-\r
-        void handleConfigFactorySyncResetMessage (Block::UID deviceID)\r
-        {\r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                bi->resetConfigListActiveStatus();\r
+            for (auto&& b : currentTopology.blocks)\r
+                if (b->uid == deviceID)\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                        notifyBlockOfConfigChange (*bi, bi->getMaxConfigIndex());\r
         }\r
 \r
         void handleLogMessage (Block::UID deviceID, const String& message) const\r
         {\r
             JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                bi->handleLogMessage (message);\r
+            for (auto&& b : currentTopology.blocks)\r
+                if (b->uid == deviceID)\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                        bi->handleLogMessage (message);\r
         }\r
 \r
         void handleButtonChange (Block::UID deviceID, Block::Timestamp timestamp, uint32 buttonIndex, bool isDown) const\r
         {\r
             JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
+            for (auto b : activeControlButtons)\r
             {\r
-                bi->pingFromDevice();\r
+                if (b->block.uid == deviceID)\r
+                {\r
+                    if (auto bi = BlockImplementation::getFrom (b->block))\r
+                    {\r
+                        bi->pingFromDevice();\r
 \r
-                if (isPositiveAndBelow (buttonIndex, bi->getButtons().size()))\r
-                    if (auto* cbi = dynamic_cast<ControlButtonImplementation*> (bi->getButtons().getUnchecked (int (buttonIndex))))\r
-                        cbi->broadcastButtonChange (timestamp, bi->modelData.buttons[(int) buttonIndex].type, isDown);\r
+                        if (buttonIndex < (uint32) bi->modelData.buttons.size())\r
+                            b->broadcastButtonChange (timestamp, bi->modelData.buttons[(int) buttonIndex].type, isDown);\r
+                    }\r
+                }\r
             }\r
         }\r
 \r
@@ -1150,34 +1046,34 @@ struct PhysicalTopologySource::Internal
         {\r
             JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
-            auto block = currentTopology.getBlockWithUID (deviceID);\r
-            if (block != nullptr)\r
+            for (auto t : activeTouchSurfaces)\r
             {\r
-                if (auto* surface = dynamic_cast<TouchSurfaceImplementation*> (block->getTouchSurface()))\r
+                if (t->block.uid == deviceID)\r
                 {\r
                     TouchSurface::Touch scaledEvent (touchEvent);\r
 \r
-                    scaledEvent.x      *= block->getWidth();\r
-                    scaledEvent.y      *= block->getHeight();\r
-                    scaledEvent.startX *= block->getWidth();\r
-                    scaledEvent.startY *= block->getHeight();\r
+                    scaledEvent.x      *= t->block.getWidth();\r
+                    scaledEvent.y      *= t->block.getHeight();\r
+                    scaledEvent.startX *= t->block.getWidth();\r
+                    scaledEvent.startY *= t->block.getHeight();\r
 \r
-                    surface->broadcastTouchChange (scaledEvent);\r
+                    t->broadcastTouchChange (scaledEvent);\r
                 }\r
             }\r
         }\r
 \r
         void cancelAllActiveTouches() noexcept\r
         {\r
-            for (auto& block : currentTopology.blocks)\r
-                if (auto* surface = block->getTouchSurface())\r
-                    surface->cancelAllActiveTouches();\r
+            for (auto surface : activeTouchSurfaces)\r
+                surface->cancelAllActiveTouches();\r
         }\r
 \r
         void handleCustomMessage (Block::UID deviceID, Block::Timestamp timestamp, const int32* data)\r
         {\r
-            if (auto* bi = getBlockImplementationWithUID (deviceID))\r
-                bi->handleCustomMessage (timestamp, data);\r
+            for (auto&& b : currentTopology.blocks)\r
+                if (b->uid == deviceID)\r
+                    if (auto bi = BlockImplementation::getFrom (*b))\r
+                        bi->handleCustomMessage (timestamp, data);\r
         }\r
 \r
         //==============================================================================\r
@@ -1207,7 +1103,7 @@ struct PhysicalTopologySource::Internal
         static Detector* getFrom (Block& b) noexcept\r
         {\r
             if (auto* bi = BlockImplementation::getFrom (b))\r
-                return (bi->detector);\r
+                return &(bi->detector);\r
 \r
             jassertfalse;\r
             return nullptr;\r
@@ -1217,21 +1113,7 @@ struct PhysicalTopologySource::Internal
         {\r
             for (const auto& d : connectedDeviceGroups)\r
             {\r
-                for (const auto& info : d->getCurrentDeviceInfo())\r
-                {\r
-                    if (info.uid == b.uid)\r
-                        return d->getDeviceConnection();\r
-                }\r
-            }\r
-\r
-            return nullptr;\r
-        }\r
-\r
-        const DeviceConnection* getDeviceConnectionFor (const Block& b) const\r
-        {\r
-            for (const auto& d : connectedDeviceGroups)\r
-            {\r
-                for (const auto& info : d->getCurrentDeviceInfo())\r
+                for (const auto& info : d->currentDeviceInfo)\r
                 {\r
                     if (info.uid == b.uid)\r
                         return d->getDeviceConnection();\r
@@ -1245,9 +1127,10 @@ struct PhysicalTopologySource::Internal
         DeviceDetector& deviceDetector;\r
 \r
         juce::Array<PhysicalTopologySource*> activeTopologySources;\r
+        juce::Array<ControlButtonImplementation*> activeControlButtons;\r
+        juce::Array<TouchSurfaceImplementation*> activeTouchSurfaces;\r
 \r
-        BlockTopology currentTopology, lastTopology;\r
-        juce::ReferenceCountedArray<Block, CriticalSection> disconnectedBlocks;\r
+        BlockTopology currentTopology;\r
 \r
     private:\r
         void timerCallback() override\r
@@ -1275,227 +1158,80 @@ struct PhysicalTopologySource::Internal
 \r
             if (anyDevicesRemoved)\r
                 handleTopologyChange();\r
-        }\r
-\r
-        void handleDevicesAdded (const juce::StringArray& detectedDevices)\r
-        {\r
-            for (const auto& devName : detectedDevices)\r
-            {\r
-                if (! hasDeviceFor (devName))\r
-                {\r
-                    if (auto d = deviceDetector.openDevice (detectedDevices.indexOf (devName)))\r
-                    {\r
-                        connectedDeviceGroups.add (new ConnectedDeviceGroup (*this, devName, d));\r
-                    }\r
-                }\r
-            }\r
-        }\r
-\r
-        bool hasDeviceFor (const juce::String& devName) const\r
-        {\r
-            for (auto d : connectedDeviceGroups)\r
-                if (d->deviceName == devName)\r
-                    return true;\r
-\r
-            return false;\r
-        }\r
-\r
-        void addBlock (DeviceInfo info)\r
-        {\r
-            if (! reactivateBlockIfKnown (info))\r
-                addNewBlock (info);\r
-        }\r
-\r
-        bool reactivateBlockIfKnown (DeviceInfo info)\r
-        {\r
-            const auto uid = getBlockUIDFromSerialNumber (info.serial);\r
-\r
-            for (int i = disconnectedBlocks.size(); --i >= 0;)\r
-            {\r
-                if (uid != disconnectedBlocks.getUnchecked (i)->uid)\r
-                    continue;\r
-\r
-                auto block = disconnectedBlocks.removeAndReturn (i);\r
-\r
-                if (auto* blockImpl = BlockImplementation::getFrom (*block))\r
-                {\r
-                    blockImpl->markReconnected (info.version, info.name, info.isMaster);\r
-                    currentTopology.blocks.add (block);\r
-                    return true;\r
-                }\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        void addNewBlock (DeviceInfo info)\r
-        {\r
-            currentTopology.blocks.add (new BlockImplementation (info.serial, *this, info.version,\r
-                                                                 info.name, info.isMaster));\r
-        }\r
-\r
-        void updateCurrentBlockInfo (Block::Ptr blockToUpdate, DeviceInfo& updatedInfo)\r
-        {\r
-            if (versionNumberChanged (updatedInfo, blockToUpdate->versionNumber))\r
-                setVersionNumberForBlock (updatedInfo, *blockToUpdate);\r
-\r
-            if (nameIsValid (updatedInfo))\r
-                setNameForBlock (updatedInfo, *blockToUpdate);\r
-\r
-            if (updatedInfo.isMaster != blockToUpdate->isMasterBlock())\r
-                BlockImplementation::getFrom (*blockToUpdate)->setToMaster (updatedInfo.isMaster);\r
-        }\r
-\r
-        BlockImplementation* getBlockImplementationWithUID (Block::UID deviceID) const noexcept\r
-        {\r
-            if (auto&& block = currentTopology.getBlockWithUID (deviceID))\r
-                return BlockImplementation::getFrom (*block);\r
-\r
-            return nullptr;\r
-        }\r
-\r
-        juce::OwnedArray<ConnectedDeviceGroup> connectedDeviceGroups;\r
-\r
-        //==============================================================================\r
-        void broadcastTopology()\r
-        {\r
-            if (currentTopology != lastTopology)\r
-            {\r
-                lastTopology = currentTopology;\r
-\r
-                BlocksTraverser traverser;\r
-                traverser.traverseBlockArray (currentTopology);\r
-\r
-                for (auto* d : activeTopologySources)\r
-                    d->listeners.call ([] (TopologySource::Listener& l) { l.topologyChanged(); });\r
-\r
-               #if DUMP_TOPOLOGY\r
-                dumpTopology (lastTopology);\r
-               #endif\r
-            }\r
-        }\r
-\r
-        JUCE_DECLARE_WEAK_REFERENCEABLE (Detector)\r
-        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Detector)\r
-    };\r
+        }\r
 \r
-    //==============================================================================\r
-    /** This is a friend of the BlocksImplementation that will scan and set the\r
-        physical positions of the blocks */\r
-    struct BlocksTraverser\r
-    {\r
-        void traverseBlockArray (const BlockTopology& topology)\r
+        void handleDevicesAdded (const juce::StringArray& detectedDevices)\r
         {\r
-            juce::Array<Block::UID> visited;\r
+            bool anyDevicesAdded = false;\r
 \r
-            for (auto& block : topology.blocks)\r
+            for (const auto& devName : detectedDevices)\r
             {\r
-                if (block->isMasterBlock() && ! visited.contains (block->uid))\r
+                if (! hasDeviceFor (devName))\r
                 {\r
-                    if (auto* bi = dynamic_cast<BlockImplementation*> (block))\r
+                    if (auto d = deviceDetector.openDevice (detectedDevices.indexOf (devName)))\r
                     {\r
-                        bi->masterUID = {};\r
-                        bi->position = {};\r
-                        bi->rotation = 0;\r
+                        connectedDeviceGroups.add (new ConnectedDeviceGroup (*this, devName, d));\r
+                        anyDevicesAdded = true;\r
                     }\r
-\r
-                    layoutNeighbours (*block, topology, block->uid, visited);\r
                 }\r
             }\r
+\r
+            if (anyDevicesAdded)\r
+                handleTopologyChange();\r
         }\r
 \r
-        // returns the distance from corner clockwise\r
-        int getUnitForIndex (Block::Ptr block, Block::ConnectionPort::DeviceEdge edge, int index)\r
+        bool hasDeviceFor (const juce::String& devName) const\r
         {\r
-            if (block->getType() == Block::seaboardBlock)\r
-            {\r
-                if (edge == Block::ConnectionPort::DeviceEdge::north)\r
-                {\r
-                    if (index == 0) return 1;\r
-                    if (index == 1) return 4;\r
-                }\r
-                else if (edge != Block::ConnectionPort::DeviceEdge::south)\r
-                {\r
-                    return 1;\r
-                }\r
-            }\r
-\r
-            if (edge == Block::ConnectionPort::DeviceEdge::south)\r
-                return block->getWidth() - (index + 1);\r
-\r
-            if (edge == Block::ConnectionPort::DeviceEdge::west)\r
-                return block->getHeight() - (index + 1);\r
+            for (auto d : connectedDeviceGroups)\r
+                if (d->deviceName == devName)\r
+                    return true;\r
 \r
-            return index;\r
+            return false;\r
         }\r
 \r
-        // returns how often north needs to rotate by 90 degrees\r
-        int getRotationForEdge (Block::ConnectionPort::DeviceEdge edge)\r
+        juce::OwnedArray<ConnectedDeviceGroup> connectedDeviceGroups;\r
+\r
+        //==============================================================================\r
+        /** Flurries of topology messages sometimes arrive due to loose connections.\r
+            Avoid informing listeners until they've stabilised.\r
+        */\r
+        struct TopologyBroadcastThrottle  : private juce::Timer\r
         {\r
-            switch (edge)\r
+            TopologyBroadcastThrottle() = default;\r
+\r
+            void scheduleTopologyChangeCallback()\r
             {\r
-                case Block::ConnectionPort::DeviceEdge::north:  return 0;\r
-                case Block::ConnectionPort::DeviceEdge::east:   return 1;\r
-                case Block::ConnectionPort::DeviceEdge::south:  return 2;\r
-                case Block::ConnectionPort::DeviceEdge::west:   return 3;\r
+               #ifdef JUCE_BLOCKS_TOPOLOGY_BROADCAST_THROTTLE_TIME\r
+                startTimer (JUCE_BLOCKS_TOPOLOGY_BROADCAST_THROTTLE_TIME);\r
+               #else\r
+                startTimer (750);\r
+               #endif\r
             }\r
 \r
-            jassertfalse;\r
-            return 0;\r
-        }\r
-\r
-        void layoutNeighbours (Block::Ptr block, const BlockTopology& topology,\r
-                               Block::UID masterUid, juce::Array<Block::UID>& visited)\r
-        {\r
-            visited.add (block->uid);\r
-\r
-            for (auto& connection : topology.connections)\r
+            void timerCallback() override\r
             {\r
-                if ((connection.device1 == block->uid && ! visited.contains (connection.device2))\r
-                     || (connection.device2 == block->uid && ! visited.contains (connection.device1)))\r
+                if (detector->currentTopology != lastTopology)\r
                 {\r
-                    const auto theirUid = connection.device1 == block->uid ? connection.device2 : connection.device1;\r
-                    const auto neighbourPtr = topology.getBlockWithUID (theirUid);\r
+                    lastTopology = detector->currentTopology;\r
 \r
-                    if (auto* neighbour = dynamic_cast<BlockImplementation*> (neighbourPtr.get()))\r
-                    {\r
-                        const auto  myBounds    = block->getBlockAreaWithinLayout();\r
-                        const auto& myPort      = connection.device1 == block->uid ? connection.connectionPortOnDevice1 : connection.connectionPortOnDevice2;\r
-                        const auto& theirPort   = connection.device1 == block->uid ? connection.connectionPortOnDevice2 : connection.connectionPortOnDevice1;\r
-                        const auto  myOffset    = getUnitForIndex (block, myPort.edge, myPort.index);\r
-                        const auto  theirOffset = getUnitForIndex (neighbourPtr, theirPort.edge, theirPort.index);\r
+                    for (auto* d : detector->activeTopologySources)\r
+                        d->listeners.call ([] (TopologySource::Listener& l) { l.topologyChanged(); });\r
 \r
-                        neighbour->masterUID = masterUid;\r
-                        neighbour->rotation = (2 + block->getRotation()\r
-                                                 + getRotationForEdge (myPort.edge)\r
-                                                 - getRotationForEdge (theirPort.edge)) % 4;\r
+                   #if DUMP_TOPOLOGY\r
+                    dumpTopology (lastTopology);\r
+                   #endif\r
+                }\r
 \r
-                        Point<int> delta;\r
-                        const auto theirBounds = neighbour->getBlockAreaWithinLayout();\r
+                stopTimer();\r
+            }\r
 \r
-                        switch ((block->getRotation() + getRotationForEdge (myPort.edge)) % 4)\r
-                        {\r
-                            case 0: // over me\r
-                                delta = { myOffset - (theirBounds.getWidth() - (theirOffset + 1)), -theirBounds.getHeight() };\r
-                                break;\r
-                            case 1: // right of me\r
-                                delta = { myBounds.getWidth(), myOffset - (theirBounds.getHeight() - (theirOffset + 1)) };\r
-                                break;\r
-                            case 2: // under me\r
-                                delta = { (myBounds.getWidth() - (myOffset + 1)) - theirOffset, myBounds.getHeight() };\r
-                                break;\r
-                            case 3: // left of me\r
-                                delta = { -theirBounds.getWidth(), (myBounds.getHeight() - (myOffset + 1)) - theirOffset };\r
-                                break;\r
-                        }\r
+            Detector* detector = nullptr;\r
+            BlockTopology lastTopology;\r
+        };\r
 \r
-                        neighbour->position = myBounds.getPosition() + delta;\r
-                    }\r
+        TopologyBroadcastThrottle topologyBroadcastThrottle;\r
 \r
-                    layoutNeighbours (neighbourPtr, topology, masterUid, visited);\r
-                }\r
-            }\r
-        }\r
+        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Detector)\r
     };\r
 \r
     //==============================================================================\r
@@ -1503,24 +1239,21 @@ struct PhysicalTopologySource::Internal
                                   private MIDIDeviceConnection::Listener,\r
                                   private Timer\r
     {\r
-        BlockImplementation (const BlocksProtocol::BlockSerialNumber& serial,\r
-                             Detector& detectorToUse,\r
-                             BlocksProtocol::VersionNumber version,\r
-                             BlocksProtocol::BlockName blockName,\r
-                             bool isMasterBlock)\r
-            : Block (juce::String ((const char*) serial.serial,   sizeof (serial.serial)),\r
+        BlockImplementation (const BlocksProtocol::BlockSerialNumber& serial, Detector& detectorToUse, BlocksProtocol::VersionNumber version, BlocksProtocol::BlockName name, bool master)\r
+            : Block (juce::String ((const char*) serial.serial, sizeof (serial.serial)),\r
                      juce::String ((const char*) version.version, version.length),\r
-                     juce::String ((const char*) blockName.name,  blockName.length)),\r
+                     juce::String ((const char*) name.name, name.length)),\r
               modelData (serial),\r
               remoteHeap (modelData.programAndHeapSize),\r
-              detector (&detectorToUse),\r
-              isMaster (isMasterBlock)\r
+              detector (detectorToUse),\r
+              isMaster (master)\r
         {\r
+            sendCommandMessage (BlocksProtocol::beginAPIMode);\r
+\r
             if (modelData.hasTouchSurface)\r
                 touchSurface.reset (new TouchSurfaceImplementation (*this));\r
 \r
             int i = 0;\r
-\r
             for (auto&& b : modelData.buttons)\r
                 controlButtons.add (new ControlButtonImplementation (*this, i++, b));\r
 \r
@@ -1530,7 +1263,15 @@ struct PhysicalTopologySource::Internal
             for (auto&& s : modelData.statusLEDs)\r
                 statusLights.add (new StatusLightImplementation (*this, s));\r
 \r
-            updateMidiConnectionListener();\r
+            if (modelData.numLEDRowLEDs > 0)\r
+                ledRow.reset (new LEDRowImplementation (*this));\r
+\r
+            listenerToMidiConnection = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this));\r
+\r
+            if (listenerToMidiConnection != nullptr)\r
+                listenerToMidiConnection->addListener (this);\r
+\r
+            config.setDeviceComms (listenerToMidiConnection);\r
         }\r
 \r
         ~BlockImplementation()\r
@@ -1542,43 +1283,9 @@ struct PhysicalTopologySource::Internal
             }\r
         }\r
 \r
-        void markDisconnected()\r
-        {\r
-            if (auto surface = dynamic_cast<TouchSurfaceImplementation*> (touchSurface.get()))\r
-                surface->disableTouchSurface();\r
-        }\r
-\r
-        void markReconnected (BlocksProtocol::VersionNumber newVersion, BlocksProtocol::BlockName newName, bool master)\r
-        {\r
-            versionNumber = getVersionString (newVersion);\r
-            name = getNameString (newName);\r
-            isMaster = master;\r
-\r
-            setProgram (nullptr);\r
-            remoteHeap.resetDeviceStateToUnknown();\r
-\r
-            if (auto surface = dynamic_cast<TouchSurfaceImplementation*> (touchSurface.get()))\r
-                surface->activateTouchSurface();\r
-\r
-            updateMidiConnectionListener();\r
-        }\r
-\r
-        void setToMaster (bool shouldBeMaster)\r
+        void invalidate()\r
         {\r
-            isMaster = shouldBeMaster;\r
-        }\r
-\r
-        void updateMidiConnectionListener()\r
-        {\r
-            if (detector == nullptr)\r
-                return;\r
-\r
-            listenerToMidiConnection = dynamic_cast<MIDIDeviceConnection*> (detector->getDeviceConnectionFor (*this));\r
-\r
-            if (listenerToMidiConnection != nullptr)\r
-                listenerToMidiConnection->addListener (this);\r
-\r
-            config.setDeviceComms (listenerToMidiConnection);\r
+            isStillConnected = false;\r
         }\r
 \r
         Type getType() const override                                   { return modelData.apiType; }\r
@@ -1588,29 +1295,12 @@ struct PhysicalTopologySource::Internal
         float getMillimetersPerUnit() const override                    { return 47.0f; }\r
         bool isHardwareBlock() const override                           { return true; }\r
         juce::Array<Block::ConnectionPort> getPorts() const override    { return modelData.ports; }\r
-        bool isConnected() const override                               { return detector && detector->isConnected (uid); }\r
+        bool isConnected() const override                               { return isStillConnected && detector.isConnected (uid); }\r
         bool isMasterBlock() const override                             { return isMaster; }\r
-        Block::UID getConnectedMasterUID() const override               { return masterUID; }\r
-        int getRotation() const override                                { return rotation; }\r
-\r
-        Rectangle<int> getBlockAreaWithinLayout() const override\r
-        {\r
-            if (rotation % 2 == 0)\r
-                return { position.getX(), position.getY(), modelData.widthUnits, modelData.heightUnits };\r
-\r
-            return { position.getX(), position.getY(), modelData.heightUnits, modelData.widthUnits };\r
-        }\r
 \r
         TouchSurface* getTouchSurface() const override                  { return touchSurface.get(); }\r
         LEDGrid* getLEDGrid() const override                            { return ledGrid.get(); }\r
-\r
-        LEDRow* getLEDRow() override\r
-        {\r
-            if (ledRow == nullptr && modelData.numLEDRowLEDs > 0)\r
-                ledRow.reset (new LEDRowImplementation (*this));\r
-\r
-            return ledRow.get();\r
-        }\r
+        LEDRow* getLEDRow() const override                              { return ledRow.get(); }\r
 \r
         juce::Array<ControlButton*> getButtons() const override\r
         {\r
@@ -1628,10 +1318,7 @@ struct PhysicalTopologySource::Internal
 \r
         float getBatteryLevel() const override\r
         {\r
-            if (detector == nullptr)\r
-                return 0.0f;\r
-\r
-            if (auto status = detector->getLastStatus (uid))\r
+            if (auto status = detector.getLastStatus (uid))\r
                 return status->batteryLevel.toUnipolarFloat();\r
 \r
             return 0.0f;\r
@@ -1639,10 +1326,7 @@ struct PhysicalTopologySource::Internal
 \r
         bool isBatteryCharging() const override\r
         {\r
-            if (detector == nullptr)\r
-                return false;\r
-\r
-            if (auto status = detector->getLastStatus (uid))\r
+            if (auto status = detector.getLastStatus (uid))\r
                 return status->batteryCharging.get() != 0;\r
 \r
             return false;\r
@@ -1655,28 +1339,29 @@ struct PhysicalTopologySource::Internal
 \r
         int getDeviceIndex() const noexcept\r
         {\r
-            if (detector == nullptr)\r
-                return -1;\r
-\r
-            return isConnected() ? detector->getIndexFromDeviceID (uid) : -1;\r
+            return isConnected() ? detector.getIndexFromDeviceID (uid) : -1;\r
         }\r
 \r
         template <typename PacketBuilder>\r
         bool sendMessageToDevice (const PacketBuilder& builder)\r
         {\r
-            if (detector != nullptr)\r
-            {\r
-                lastMessageSendTime = juce::Time::getCurrentTime();\r
-                return detector->sendMessageToDevice (uid, builder);\r
-            }\r
-\r
-            return false;\r
+            lastMessageSendTime = juce::Time::getCurrentTime();\r
+            return detector.sendMessageToDevice (uid, builder);\r
         }\r
 \r
         bool sendCommandMessage (uint32 commandID)\r
         {\r
-            return buildAndSendPacket<64> ([commandID] (BlocksProtocol::HostPacketBuilder<64>& p)\r
-                                           { return p.deviceControlMessage (commandID); });\r
+            int index = getDeviceIndex();\r
+\r
+            if (index < 0)\r
+                return false;\r
+\r
+            BlocksProtocol::HostPacketBuilder<64> p;\r
+            p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+            p.deviceControlMessage (commandID);\r
+            p.writePacketSysexFooter();\r
+\r
+            return sendMessageToDevice (p);\r
         }\r
 \r
         void handleCustomMessage (Block::Timestamp, const int32* data)\r
@@ -1691,8 +1376,21 @@ struct PhysicalTopologySource::Internal
 \r
         static BlockImplementation* getFrom (Block& b) noexcept\r
         {\r
-            jassert (dynamic_cast<BlockImplementation*> (&b) != nullptr);\r
-            return dynamic_cast<BlockImplementation*> (&b);\r
+            if (auto bi = dynamic_cast<BlockImplementation*> (&b))\r
+                return bi;\r
+\r
+            jassertfalse;\r
+            return nullptr;\r
+        }\r
+\r
+        bool isControlBlock() const\r
+        {\r
+            auto type = getType();\r
+\r
+            return type == Block::Type::liveBlock\r
+                || type == Block::Type::loopBlock\r
+                || type == Block::Type::touchBlock\r
+                || type == Block::Type::developerControlBlock;\r
         }\r
 \r
         //==============================================================================\r
@@ -1712,65 +1410,64 @@ struct PhysicalTopologySource::Internal
         //==============================================================================\r
         juce::Result setProgram (Program* newProgram) override\r
         {\r
-            if (newProgram != nullptr && program.get() == newProgram)\r
-            {\r
-                jassertfalse;\r
-                return juce::Result::ok();\r
-            }\r
-\r
-            stopTimer();\r
-\r
+            if (newProgram == nullptr || program.get() != newProgram)\r
             {\r
-                std::unique_ptr<Program> p (newProgram);\r
-\r
-                if (program != nullptr\r
-                    && newProgram != nullptr\r
-                    && program->getLittleFootProgram() == newProgram->getLittleFootProgram())\r
-                    return juce::Result::ok();\r
-\r
-                std::swap (program, p);\r
-            }\r
+                {\r
+                    std::unique_ptr<Program> p (newProgram);\r
 \r
-            programSize = 0;\r
-            isProgramLoaded = shouldSaveProgramAsDefault = false;\r
+                    if (program != nullptr\r
+                         && newProgram != nullptr\r
+                         && program->getLittleFootProgram() == newProgram->getLittleFootProgram())\r
+                        return juce::Result::ok();\r
 \r
-            if (program == nullptr)\r
-            {\r
-                remoteHeap.clear();\r
-                return juce::Result::ok();\r
-            }\r
+                    stopTimer();\r
+                    std::swap (program, p);\r
+                }\r
 \r
-            littlefoot::Compiler compiler;\r
-            compiler.addNativeFunctions (PhysicalTopologySource::getStandardLittleFootFunctions());\r
+                stopTimer();\r
+                programSize = 0;\r
 \r
-            const auto err = compiler.compile (program->getLittleFootProgram(), 512, program->getSearchPaths());\r
+                if (program != nullptr)\r
+                {\r
+                    littlefoot::Compiler compiler;\r
+                    compiler.addNativeFunctions (PhysicalTopologySource::getStandardLittleFootFunctions());\r
 \r
-            if (err.failed())\r
-                return err;\r
+                    auto err = compiler.compile (program->getLittleFootProgram(), 512);\r
 \r
-            DBG ("Compiled littlefoot program, space needed: "\r
-                 << (int) compiler.getCompiledProgram().getTotalSpaceNeeded() << " bytes");\r
+                    if (err.failed())\r
+                        return err;\r
 \r
-            if (compiler.getCompiledProgram().getTotalSpaceNeeded() > getMemorySize())\r
-                return Result::fail ("Program too large!");\r
+                    DBG ("Compiled littlefoot program, space needed: "\r
+                            << (int) compiler.getCompiledProgram().getTotalSpaceNeeded() << " bytes");\r
 \r
-            const auto size = (size_t) compiler.compiledObjectCode.size();\r
-            programSize = (uint32) size;\r
+                    if (compiler.getCompiledProgram().getTotalSpaceNeeded() > getMemorySize())\r
+                        return Result::fail ("Program too large!");\r
 \r
-            remoteHeap.resetDataRangeToUnknown (0, remoteHeap.blockSize);\r
-            remoteHeap.clear();\r
-            remoteHeap.sendChanges (*this, true);\r
+                    auto size = (size_t) compiler.compiledObjectCode.size();\r
+                    programSize = (uint32) size;\r
 \r
-            remoteHeap.resetDataRangeToUnknown (0, (uint32) size);\r
-            remoteHeap.setBytes (0, compiler.compiledObjectCode.begin(), size);\r
-            remoteHeap.sendChanges (*this, true);\r
+                    remoteHeap.resetDataRangeToUnknown (0, remoteHeap.blockSize);\r
+                    remoteHeap.clear();\r
+                    remoteHeap.sendChanges (*this, true);\r
 \r
-            this->resetConfigListActiveStatus();\r
+                    remoteHeap.resetDataRangeToUnknown (0, (uint32) size);\r
+                    remoteHeap.setBytes (0, compiler.compiledObjectCode.begin(), size);\r
+                    remoteHeap.sendChanges (*this, true);\r
 \r
-            if (auto changeCallback = this->configChangedCallback)\r
-                changeCallback (*this, {}, this->getMaxConfigIndex());\r
+                    this->resetConfigListActiveStatus();\r
 \r
-            startTimer (20);\r
+                    if (auto changeCallback = this->configChangedCallback)\r
+                        changeCallback (*this, {}, this->getMaxConfigIndex());\r
+                }\r
+                else\r
+                {\r
+                    remoteHeap.clear();\r
+                }\r
+            }\r
+            else\r
+            {\r
+                jassertfalse;\r
+            }\r
 \r
             return juce::Result::ok();\r
         }\r
@@ -1784,8 +1481,23 @@ struct PhysicalTopologySource::Internal
 \r
             if (remoteHeap.isProgramLoaded())\r
             {\r
-                buildAndSendPacket<128> ([&message] (BlocksProtocol::HostPacketBuilder<128>& p)\r
-                                         { return p.addProgramEventMessage (message.values); });\r
+                auto index = getDeviceIndex();\r
+\r
+                if (index >= 0)\r
+                {\r
+                    BlocksProtocol::HostPacketBuilder<128> p;\r
+                    p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+\r
+                    if (p.addProgramEventMessage (message.values))\r
+                    {\r
+                        p.writePacketSysexFooter();\r
+                        sendMessageToDevice (p);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    jassertfalse;\r
+                }\r
             }\r
         }\r
 \r
@@ -1793,14 +1505,8 @@ struct PhysicalTopologySource::Internal
         {\r
             if (remoteHeap.isFullySynced() && remoteHeap.isProgramLoaded())\r
             {\r
-                isProgramLoaded = true;\r
                 stopTimer();\r
-\r
-                if (shouldSaveProgramAsDefault)\r
-                    doSaveProgramAsDefault();\r
-\r
-                if (programLoadedCallback != nullptr)\r
-                    programLoadedCallback (*this);\r
+                sendCommandMessage (BlocksProtocol::saveProgramAsDefault);\r
             }\r
             else\r
             {\r
@@ -1810,10 +1516,7 @@ struct PhysicalTopologySource::Internal
 \r
         void saveProgramAsDefault() override\r
         {\r
-            shouldSaveProgramAsDefault = true;\r
-\r
-            if (! isTimerRunning() && isProgramLoaded)\r
-                doSaveProgramAsDefault();\r
+            startTimer (10);\r
         }\r
 \r
         uint32 getMemorySize() override\r
@@ -1821,12 +1524,6 @@ struct PhysicalTopologySource::Internal
             return modelData.programAndHeapSize;\r
         }\r
 \r
-        uint32 getHeapMemorySize() override\r
-        {\r
-            jassert (isPositiveAndNotGreaterThan (programSize, modelData.programAndHeapSize));\r
-            return modelData.programAndHeapSize - programSize;\r
-        }\r
-\r
         void setDataByte (size_t offset, uint8 value) override\r
         {\r
             remoteHeap.setByte (programSize + offset, value);\r
@@ -1857,11 +1554,27 @@ struct PhysicalTopologySource::Internal
         {\r
             firmwarePacketAckCallback = {};\r
 \r
-            if (buildAndSendPacket<256> ([data, size] (BlocksProtocol::HostPacketBuilder<256>& p)\r
-                                         { return p.addFirmwareUpdatePacket (data, size); }))\r
+            auto index = getDeviceIndex();\r
+\r
+            if (index >= 0)\r
             {\r
-                firmwarePacketAckCallback = callback;\r
-                return true;\r
+                BlocksProtocol::HostPacketBuilder<256> p;\r
+                p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+\r
+                if (p.addFirmwareUpdatePacket (data, size))\r
+                {\r
+                    p.writePacketSysexFooter();\r
+\r
+                    if (sendMessageToDevice (p))\r
+                    {\r
+                        firmwarePacketAckCallback = callback;\r
+                        return true;\r
+                    }\r
+                }\r
+            }\r
+            else\r
+            {\r
+                jassertfalse;\r
             }\r
 \r
             return false;\r
@@ -1907,6 +1620,15 @@ struct PhysicalTopologySource::Internal
 \r
         void handleTimerTick()\r
         {\r
+            if (++resetMessagesSent < 3)\r
+            {\r
+                if (resetMessagesSent == 1)\r
+                    sendCommandMessage (BlocksProtocol::endAPIMode);\r
+\r
+                sendCommandMessage (BlocksProtocol::beginAPIMode);\r
+                return;\r
+            }\r
+\r
             if (ledGrid != nullptr)\r
                 if (auto renderer = ledGrid->getRenderer())\r
                     renderer->renderLEDGrid (*ledGrid);\r
@@ -1979,40 +1701,69 @@ struct PhysicalTopologySource::Internal
 \r
         void setConfigChangedCallback (std::function<void(Block&, const ConfigMetaData&, uint32)> configChanged) override\r
         {\r
-            configChangedCallback = std::move (configChanged);\r
+            configChangedCallback = configChanged;\r
         }\r
 \r
-        void setProgramLoadedCallback (std::function<void(Block&)> programLoaded) override\r
+        void factoryReset() override\r
         {\r
-            programLoadedCallback = std::move (programLoaded);\r
-        }\r
+            auto index = getDeviceIndex();\r
 \r
-        bool setName (const juce::String& newName) override\r
-        {\r
-            return buildAndSendPacket<128> ([&newName] (BlocksProtocol::HostPacketBuilder<128>& p)\r
-                                            { return p.addSetBlockName (newName); });\r
+            if (index >= 0)\r
+            {\r
+                BlocksProtocol::HostPacketBuilder<32> p;\r
+                p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+                p.addFactoryReset();\r
+                p.writePacketSysexFooter();\r
+                sendMessageToDevice (p);\r
+            }\r
+            else\r
+            {\r
+                jassertfalse;\r
+            }\r
         }\r
 \r
-        void factoryReset() override\r
+        void blockReset() override\r
         {\r
-            buildAndSendPacket<32> ([] (BlocksProtocol::HostPacketBuilder<32>& p)\r
-                                    { return p.addFactoryReset(); });\r
+            auto index = getDeviceIndex();\r
+\r
+            if (index >= 0)\r
+            {\r
+                BlocksProtocol::HostPacketBuilder<32> p;\r
+                p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+                p.addBlockReset();\r
+                p.writePacketSysexFooter();\r
+                sendMessageToDevice (p);\r
+            }\r
+            else\r
+            {\r
+                jassertfalse;\r
+            }\r
         }\r
 \r
-        void blockReset() override\r
+        bool setName (const juce::String& newName) override\r
         {\r
-            if (buildAndSendPacket<32> ([] (BlocksProtocol::HostPacketBuilder<32>& p)\r
-                                        { return p.addBlockReset(); }))\r
+            auto index = getDeviceIndex();\r
+\r
+            if (index >= 0)\r
             {\r
-                hasBeenPowerCycled = true;\r
+                BlocksProtocol::HostPacketBuilder<128> p;\r
+                p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+\r
+                if (p.addSetBlockName (newName))\r
+                {\r
+                    p.writePacketSysexFooter();\r
 \r
-                if (detector != nullptr)\r
-                    detector->notifyBlockIsRestarting (uid);\r
+                    if (sendMessageToDevice (p))\r
+                        return true;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                jassertfalse;\r
             }\r
-        }\r
 \r
-        bool wasPowerCycled() const { return hasBeenPowerCycled; }\r
-        void resetPowerCycleFlag()  { hasBeenPowerCycled = false; }\r
+            return false;\r
+        }\r
 \r
         //==============================================================================\r
         std::unique_ptr<TouchSurface> touchSurface;\r
@@ -2036,30 +1787,21 @@ struct PhysicalTopologySource::Internal
         using RemoteHeapType = littlefoot::LittleFootRemoteHeap<BlockImplementation>;\r
         RemoteHeapType remoteHeap;\r
 \r
-        WeakReference<Detector> detector;\r
+        Detector& detector;\r
         juce::Time lastMessageSendTime, lastMessageReceiveTime;\r
 \r
         BlockConfigManager config;\r
         std::function<void(Block&, const ConfigMetaData&, uint32)> configChangedCallback;\r
 \r
-        std::function<void(Block&)> programLoadedCallback;\r
-\r
     private:\r
         std::unique_ptr<Program> program;\r
         uint32 programSize = 0;\r
 \r
         std::function<void(uint8, uint32)> firmwarePacketAckCallback;\r
 \r
+        uint32 resetMessagesSent = 0;\r
+        bool isStillConnected = true;\r
         bool isMaster = false;\r
-        Block::UID masterUID = {};\r
-\r
-        Point<int> position;\r
-        int rotation = 0;\r
-        friend BlocksTraverser;\r
-\r
-        bool isProgramLoaded = false;\r
-        bool shouldSaveProgramAsDefault = false;\r
-        bool hasBeenPowerCycled = false;\r
 \r
         void initialiseDeviceIndexAndConnection()\r
         {\r
@@ -2069,9 +1811,8 @@ struct PhysicalTopologySource::Internal
 \r
         const juce::MidiInput* getMidiInput() const\r
         {\r
-            if (detector != nullptr)\r
-                if (auto c = dynamic_cast<const MIDIDeviceConnection*> (detector->getDeviceConnectionFor (*this)))\r
-                    return c->midiInput.get();\r
+            if (auto c = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this)))\r
+                return c->midiInput.get();\r
 \r
             jassertfalse;\r
             return nullptr;\r
@@ -2084,9 +1825,8 @@ struct PhysicalTopologySource::Internal
 \r
         const juce::MidiOutput* getMidiOutput() const\r
         {\r
-            if (detector != nullptr)\r
-                if (auto c = dynamic_cast<const MIDIDeviceConnection*> (detector->getDeviceConnectionFor (*this)))\r
-                    return c->midiOutput.get();\r
+            if (auto c = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this)))\r
+                return c->midiOutput.get();\r
 \r
             jassertfalse;\r
             return nullptr;\r
@@ -2112,32 +1852,6 @@ struct PhysicalTopologySource::Internal
             config.setDeviceComms (nullptr);\r
         }\r
 \r
-        void doSaveProgramAsDefault()\r
-        {\r
-            sendCommandMessage (BlocksProtocol::saveProgramAsDefault);\r
-        }\r
-\r
-        template<int packetBytes, typename PacketBuilderFn>\r
-        bool buildAndSendPacket (PacketBuilderFn buildFn)\r
-        {\r
-            auto index = getDeviceIndex();\r
-\r
-            if (index < 0)\r
-            {\r
-                jassertfalse;\r
-                return false;\r
-            }\r
-\r
-            BlocksProtocol::HostPacketBuilder<packetBytes> p;\r
-            p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
-\r
-            if (! buildFn (p))\r
-                return false;\r
-\r
-            p.writePacketSysexFooter();\r
-            return sendMessageToDevice (p);\r
-        }\r
-\r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BlockImplementation)\r
     };\r
 \r
@@ -2283,22 +1997,16 @@ struct PhysicalTopologySource::Internal
     {\r
         TouchSurfaceImplementation (BlockImplementation& b)  : TouchSurface (b), blockImpl (b)\r
         {\r
-            activateTouchSurface();\r
-        }\r
-\r
-        ~TouchSurfaceImplementation()\r
-        {\r
-            disableTouchSurface();\r
-        }\r
+            if (auto det = Detector::getFrom (block))\r
+                det->activeTouchSurfaces.add (this);\r
 \r
-        void activateTouchSurface()\r
-        {\r
             startTimer (500);\r
         }\r
 \r
-        void disableTouchSurface()\r
+        ~TouchSurfaceImplementation()\r
         {\r
-            stopTimer();\r
+            if (auto det = Detector::getFrom (block))\r
+                det->activeTouchSurfaces.removeFirstMatchingValue (this);\r
         }\r
 \r
         int getNumberOfKeywaves() const noexcept override\r
@@ -2402,10 +2110,14 @@ struct PhysicalTopologySource::Internal
         ControlButtonImplementation (BlockImplementation& b, int index, BlocksProtocol::BlockDataSheet::ButtonInfo info)\r
             : ControlButton (b), blockImpl (b), buttonInfo (info), buttonIndex (index)\r
         {\r
+            if (auto det = Detector::getFrom (block))\r
+                det->activeControlButtons.add (this);\r
         }\r
 \r
         ~ControlButtonImplementation()\r
         {\r
+            if (auto det = Detector::getFrom (block))\r
+                det->activeControlButtons.removeFirstMatchingValue (this);\r
         }\r
 \r
         ButtonFunction getType() const override         { return buttonInfo.type; }\r
@@ -2602,84 +2314,38 @@ struct PhysicalTopologySource::DetectorHolder  : private juce::Timer
 };\r
 \r
 //==============================================================================\r
-PhysicalTopologySource::PhysicalTopologySource (bool startDetached)\r
+PhysicalTopologySource::PhysicalTopologySource()\r
+    : detector (new DetectorHolder (*this))\r
 {\r
-    if (! startDetached)\r
-        setActive (true);\r
+    detector->detector->activeTopologySources.add (this);\r
 }\r
 \r
-PhysicalTopologySource::PhysicalTopologySource (DeviceDetector& detectorToUse, bool startDetached)\r
-    : customDetector (&detectorToUse)\r
+PhysicalTopologySource::PhysicalTopologySource (DeviceDetector& detectorToUse)\r
+    : detector (new DetectorHolder (*this, detectorToUse))\r
 {\r
-    if (! startDetached)\r
-        setActive (true);\r
+    detector->detector->activeTopologySources.add (this);\r
 }\r
 \r
 PhysicalTopologySource::~PhysicalTopologySource()\r
 {\r
-    setActive (false);\r
-}\r
-\r
-void PhysicalTopologySource::setActive (bool shouldBeActive)\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
-    if (isActive() == shouldBeActive)\r
-        return;\r
-\r
-    if (shouldBeActive)\r
-    {\r
-        if (customDetector == nullptr)\r
-            detector = std::make_unique<DetectorHolder>(*this);\r
-        else\r
-            detector = std::make_unique<DetectorHolder>(*this, *customDetector);\r
-\r
-        detector->detector->activeTopologySources.add (this);\r
-    }\r
-    else\r
-    {\r
-        detector->detector->detach (this);\r
-        detector.reset();\r
-    }\r
-\r
-    listeners.call ([](TopologySource::Listener& l){ l.topologyChanged(); });\r
-}\r
-\r
-bool PhysicalTopologySource::isActive() const\r
-{\r
-    return detector != nullptr;\r
-}\r
-\r
-bool PhysicalTopologySource::isLockedFromOutside() const\r
-{\r
-    if (detector != nullptr && detector->detector != nullptr)\r
-        return detector->detector->deviceDetector.isLockedFromOutside();\r
-\r
-    return false;\r
+    detector->detector->detach (this);\r
+    detector = nullptr;\r
 }\r
 \r
 BlockTopology PhysicalTopologySource::getCurrentTopology() const\r
 {\r
     JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED // This method must only be called from the message thread!\r
 \r
-    if (detector != nullptr)\r
-        return detector->detector->currentTopology;\r
-\r
-    return {};\r
+    return detector->detector->currentTopology;\r
 }\r
 \r
 void PhysicalTopologySource::cancelAllActiveTouches() noexcept\r
 {\r
-    if (detector != nullptr)\r
-        detector->detector->cancelAllActiveTouches();\r
+    detector->detector->cancelAllActiveTouches();\r
 }\r
 \r
 bool PhysicalTopologySource::hasOwnServiceTimer() const     { return false; }\r
-void PhysicalTopologySource::handleTimerTick()\r
-{\r
-    if (detector != nullptr)\r
-        detector->handleTimerTick();\r
-}\r
+void PhysicalTopologySource::handleTimerTick()              { detector->handleTimerTick(); }\r
 \r
 PhysicalTopologySource::DeviceConnection::DeviceConnection() {}\r
 PhysicalTopologySource::DeviceConnection::~DeviceConnection() {}\r
index dc637e8ed67c59dcd3ce6fdd5b9098358bfa5712..8e4ea6120da780da7dff1a4a9fb39f7f9719a92d 100644 (file)
@@ -34,7 +34,7 @@ class PhysicalTopologySource  : public TopologySource
 {\r
 public:\r
     /** Constructor. */\r
-    PhysicalTopologySource (bool startDetached = false);\r
+    PhysicalTopologySource();\r
 \r
     /** Destructor. */\r
     ~PhysicalTopologySource();\r
@@ -45,14 +45,6 @@ public:
     /** Reset all touches */\r
     void cancelAllActiveTouches() noexcept override;\r
 \r
-    /** Sets the TopologySource as active, occupying the midi port and trying to connect to the block devices */\r
-    void setActive (bool shouldBeActive) override;\r
-\r
-    /** Returns true, if the TopologySource is currently trying to connect the block devices */\r
-    bool isActive() const override;\r
-\r
-    /** This method will tell, if an other PhysicalTopologySource has locked the Midi connection */\r
-    bool isLockedFromOutside() const;\r
 \r
     //==========================================================================\r
     /** For custom transport systems, this represents a connected device */\r
@@ -73,11 +65,10 @@ public:
 \r
         virtual juce::StringArray scanForDevices() = 0;\r
         virtual DeviceConnection* openDevice (int index) = 0;\r
-        virtual bool isLockedFromOutside() const { return false; }\r
     };\r
 \r
     /** Constructor for custom transport systems. */\r
-    PhysicalTopologySource (DeviceDetector& detectorToUse, bool startDetached = false);\r
+    PhysicalTopologySource (DeviceDetector& detectorToUse);\r
 \r
     static const char* const* getStandardLittleFootFunctions() noexcept;\r
 \r
@@ -87,7 +78,6 @@ protected:
 \r
 private:\r
     //==========================================================================\r
-    DeviceDetector* customDetector = nullptr;\r
     struct Internal;\r
     struct DetectorHolder;\r
     std::unique_ptr<DetectorHolder> detector;\r
index 088db2090bddd63c7332bd8aba2c3ce9e831782b..0074034318d9e2e61894f25290c2a80f1155488d 100644 (file)
@@ -79,16 +79,6 @@ struct RuleBasedTopologySource::Internal  : public TopologySource::Listener,
         }\r
     }\r
 \r
-    void setActive (bool shouldBeActive)\r
-    {\r
-        detector.setActive (shouldBeActive);\r
-    }\r
-\r
-    bool isActive() const\r
-    {\r
-        return detector.isActive();\r
-    }\r
-\r
     RuleBasedTopologySource& owner;\r
     TopologySource& detector;\r
 \r
@@ -113,14 +103,4 @@ BlockTopology RuleBasedTopologySource::getCurrentTopology() const             {
 void RuleBasedTopologySource::clearRules()                                    { internal->clearRules(); }\r
 void RuleBasedTopologySource::addRule (Rule* r)                               { internal->addRule (r); }\r
 \r
-void RuleBasedTopologySource::setActive (bool shouldBeActive)\r
-{\r
-    internal->setActive (shouldBeActive);\r
-}\r
-\r
-bool RuleBasedTopologySource::isActive() const\r
-{\r
-    return internal->isActive();\r
-}\r
-\r
 } // namespace juce\r
index 1d47bf3e07f6be32a3be4dd841595fe81e22d61d..975e08e0a30ac79d16848d850b1df63db3f6d946 100644 (file)
@@ -45,7 +45,7 @@ public:
 \r
     //==========================================================================\r
     /** Returns the currently active topology. */\r
-    BlockTopology getCurrentTopology() const override;\r
+    BlockTopology getCurrentTopology() const;\r
 \r
     /** A rule that can transform parts of a topology. */\r
     struct Rule\r
@@ -73,12 +73,6 @@ public:
     */\r
     void addRule (Rule*);\r
 \r
-    /** Sets the TopologySource as active, occupying the midi port and trying to connect to the block devices */\r
-    void setActive (bool shouldBeActive) override;\r
-\r
-    /** Returns true, if the TopologySource is currently trying to connect the block devices */\r
-    bool isActive() const override;\r
-\r
 private:\r
     //==========================================================================\r
     struct Internal;\r
index 36e86f1817a26721541d6a4d17ad8b454b145e28..8f0868c15b6196aff00a975144dbd24ce6e3ddb1 100644 (file)
@@ -48,24 +48,6 @@ struct BlockTopology
 \r
     bool operator== (const BlockTopology&) const noexcept;\r
     bool operator!= (const BlockTopology&) const noexcept;\r
-\r
-    Block::Ptr getBlockWithUID (Block::UID deviceID)\r
-    {\r
-        for (auto&& block : blocks)\r
-            if (block->uid == deviceID)\r
-                return block;\r
-\r
-        return {};\r
-    }\r
-\r
-    const Block::Ptr getBlockWithUID (Block::UID deviceID) const\r
-    {\r
-        for (auto&& block : blocks)\r
-            if (block->uid == deviceID)\r
-                return block;\r
-\r
-        return {};\r
-    }\r
 };\r
 \r
 } // namespace juce\r
index 065bc9b0c8a2042a985e2596ea47fcbc1c399894..f558c6decbca128291093d3417f0497b8cbd9a9d 100644 (file)
@@ -37,12 +37,6 @@ public:
     /** Returns the current topology that this object manages. */\r
     virtual BlockTopology getCurrentTopology() const = 0;\r
 \r
-    /** Sets the TopologySource as active, occupying the midi port and trying to connect to the block devices */\r
-    virtual void setActive (bool shouldBeActive) = 0;\r
-\r
-    /** Returns true, if the TopologySource is currently trying to connect the block devices */\r
-    virtual bool isActive() const = 0;\r
-\r
     //==========================================================================\r
     /** Used to receive callbacks for topology changes */\r
     struct Listener\r
index 7389fc0b2b863db405237c4377dd2d1e1fcd1e7a..11785b1eee9d66d3f1a7f06aaa5a88af63833fe4 100644 (file)
@@ -29,7 +29,7 @@ b2DynamicTree::b2DynamicTree()
        m_nodeCapacity = 16;\r
        m_nodeCount = 0;\r
        m_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode));\r
-       memset((void*)m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode));\r
+       memset(m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode));\r
 \r
        // Build a linked list for the free list.\r
        for (int32 i = 0; i < m_nodeCapacity - 1; ++i)\r
index a6a948bac81fb8852cedce0778ad91d8305b01b3..fb6acae8a275e77188eab698f3d96f772a5893b4 100644 (file)
@@ -37,9 +37,6 @@
  #pragma clang diagnostic push\r
  #pragma clang diagnostic ignored "-Wsign-conversion"\r
  #pragma clang diagnostic ignored "-Wfloat-conversion"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
-  #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
 #elif defined (__GNUC__)\r
  #pragma GCC diagnostic push\r
  #pragma GCC diagnostic ignored "-Wunused-but-set-variable"\r
index a6172b9431c70220e8d9181a4b610b23678c10d6..d8d477a0cfa0ed62981773d9d28909834d2cda5e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_box2d\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE wrapper for the Box2D physics engine\r
   description:      The Box2D physics engine and some utility classes.\r
   website:          http://www.juce.com/juce\r
 #ifdef __GNUC__\r
  #pragma GCC diagnostic push\r
  #pragma GCC diagnostic ignored "-Wconversion"\r
- #if defined (__clang__)\r
-  #if __has_warning("-Wzero-as-null-pointer-constant")\r
-   #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
-  #endif\r
- #endif\r
 #endif\r
 \r
 #include <climits>\r
index 6a8c736eac63d3cea38a8ab31694df2ace2ef45e..f3911dba4e2db768240165c2c86fd15d623c2438 100644 (file)
@@ -60,40 +60,51 @@ private:
 public:\r
     //==============================================================================\r
     /** Creates an empty array. */\r
-    Array() = default;\r
+    Array() noexcept\r
+    {\r
+    }\r
 \r
     /** Creates a copy of another array.\r
         @param other    the array to copy\r
     */\r
-    Array (const Array& other)\r
+    Array (const Array<ElementType, TypeOfCriticalSectionToUse>& other)\r
     {\r
         const ScopedLockType lock (other.getLock());\r
-        values.addArray (other.values.begin(), other.values.size());\r
+        numUsed = other.numUsed;\r
+        data.setAllocatedSize (other.numUsed);\r
+\r
+        for (int i = 0; i < numUsed; ++i)\r
+            new (data.elements + i) ElementType (other.data.elements[i]);\r
     }\r
 \r
-    Array (Array&& other) noexcept\r
-        : values (std::move (other.values))\r
+    Array (Array<ElementType, TypeOfCriticalSectionToUse>&& other) noexcept\r
+        : data (static_cast<ArrayAllocationBase<ElementType, TypeOfCriticalSectionToUse>&&> (other.data)),\r
+          numUsed (other.numUsed)\r
     {\r
+        other.numUsed = 0;\r
     }\r
 \r
     /** Initalises from a null-terminated raw array of values.\r
-        @param data   the data to copy from\r
+        @param values   the array to copy from\r
     */\r
     template <typename TypeToCreateFrom>\r
-    explicit Array (const TypeToCreateFrom* data)\r
+    explicit Array (const TypeToCreateFrom* values)\r
     {\r
         while (*values != TypeToCreateFrom())\r
-            add (*data++);\r
+            add (*values++);\r
     }\r
 \r
     /** Initalises from a raw array of values.\r
-        @param data         the data to copy from\r
+        @param values       the array to copy from\r
         @param numValues    the number of values in the array\r
     */\r
     template <typename TypeToCreateFrom>\r
-    Array (const TypeToCreateFrom* data, int numValues)\r
+    Array (const TypeToCreateFrom* values, int numValues)  : numUsed (numValues)\r
     {\r
-        values.addArray (data, numValues);\r
+        data.setAllocatedSize (numValues);\r
+\r
+        for (int i = 0; i < numValues; ++i)\r
+            new (data.elements + i) ElementType (values[i]);\r
     }\r
 \r
     /** Initalises an Array of size 1 containing a single element. */\r
@@ -105,21 +116,23 @@ public:
     /** Initalises an Array of size 1 containing a single element. */\r
     Array (ElementType&& singleElementToAdd)\r
     {\r
-        add (std::move (singleElementToAdd));\r
+        add (static_cast<ElementType&&> (singleElementToAdd));\r
     }\r
 \r
     /** Initalises an Array from a list of items. */\r
     template <typename... OtherElements>\r
     Array (const ElementType& firstNewElement, OtherElements... otherElements)\r
     {\r
-        values.add (firstNewElement, otherElements...);\r
+        data.setAllocatedSize (1 + (int) sizeof... (otherElements));\r
+        addAssumingCapacityIsReady (firstNewElement, otherElements...);\r
     }\r
 \r
     /** Initalises an Array from a list of items. */\r
     template <typename... OtherElements>\r
     Array (ElementType&& firstNewElement, OtherElements... otherElements)\r
     {\r
-        values.add (std::move (firstNewElement), otherElements...);\r
+        data.setAllocatedSize (1 + (int) sizeof... (otherElements));\r
+        addAssumingCapacityIsReady (static_cast<ElementType&&> (firstNewElement), otherElements...);\r
     }\r
 \r
     template <typename TypeToCreateFrom>\r
@@ -129,7 +142,10 @@ public:
     }\r
 \r
     /** Destructor. */\r
-    ~Array() = default;\r
+    ~Array()\r
+    {\r
+        deleteAllElements();\r
+    }\r
 \r
     /** Copies another array.\r
         @param other    the array to copy\r
@@ -148,7 +164,10 @@ public:
     Array& operator= (Array&& other) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values = std::move (other.values);\r
+        deleteAllElements();\r
+        data = static_cast<ArrayAllocationBase<ElementType, TypeOfCriticalSectionToUse>&&> (other.data);\r
+        numUsed = other.numUsed;\r
+        other.numUsed = 0;\r
         return *this;\r
     }\r
 \r
@@ -163,7 +182,15 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
         const typename OtherArrayType::ScopedLockType lock2 (other.getLock());\r
-        return values == other;\r
+\r
+        if (numUsed != other.numUsed)\r
+            return false;\r
+\r
+        for (int i = numUsed; --i >= 0;)\r
+            if (! (data.elements[i] == other.data.elements[i]))\r
+                return false;\r
+\r
+        return true;\r
     }\r
 \r
     /** Compares this array to another one.\r
@@ -188,8 +215,9 @@ public:
     void clear()\r
     {\r
         const ScopedLockType lock (getLock());\r
-        clearQuick();\r
-        values.setAllocatedSize (0);\r
+        deleteAllElements();\r
+        data.setAllocatedSize (0);\r
+        numUsed = 0;\r
     }\r
 \r
     /** Removes all elements from the array without freeing the array's allocated storage.\r
@@ -198,7 +226,8 @@ public:
     void clearQuick()\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.clear();\r
+        deleteAllElements();\r
+        numUsed = 0;\r
     }\r
 \r
     /** Fills the Array with the provided value. */\r
@@ -214,14 +243,13 @@ public:
     /** Returns the current number of elements in the array. */\r
     inline int size() const noexcept\r
     {\r
-        const ScopedLockType lock (getLock());\r
-        return values.size();\r
+        return numUsed;\r
     }\r
 \r
     /** Returns true if the array is empty, false otherwise. */\r
     inline bool isEmpty() const noexcept\r
     {\r
-        return size() == 0;\r
+        return numUsed == 0;\r
     }\r
 \r
     /** Returns one of the elements in the array.\r
@@ -234,10 +262,17 @@ public:
         @param index    the index of the element being requested (0 is the first element in the array)\r
         @see getUnchecked, getFirst, getLast\r
     */\r
-    ElementType operator[] (int index) const\r
+    ElementType operator[] (const int index) const\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getValueWithDefault (index);\r
+\r
+        if (isPositiveAndBelow (index, numUsed))\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[index];\r
+        }\r
+\r
+        return ElementType();\r
     }\r
 \r
     /** Returns one of the elements in the array, without checking the index passed in.\r
@@ -249,10 +284,11 @@ public:
         @param index    the index of the element being requested (0 is the first element in the array)\r
         @see operator[], getFirst, getLast\r
     */\r
-    inline ElementType getUnchecked (int index) const\r
+    inline ElementType getUnchecked (const int index) const\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values[index];\r
+        jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+        return data.elements[index];\r
     }\r
 \r
     /** Returns a direct reference to one of the elements in the array, without checking the index passed in.\r
@@ -264,29 +300,44 @@ public:
         @param index    the index of the element being requested (0 is the first element in the array)\r
         @see operator[], getFirst, getLast\r
     */\r
-    inline ElementType& getReference (int index) const noexcept\r
+    inline ElementType& getReference (const int index) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values[index];\r
+        jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+        return data.elements[index];\r
     }\r
 \r
     /** Returns the first element in the array, or a default value if the array is empty.\r
         @see operator[], getUnchecked, getLast\r
     */\r
-    inline ElementType getFirst() const noexcept\r
+    inline ElementType getFirst() const\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getFirst();\r
+\r
+        if (numUsed > 0)\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[0];\r
+        }\r
+\r
+        return ElementType();\r
     }\r
 \r
     /** Returns the last element in the array, or a default value if the array is empty.\r
 \r
         @see operator[], getUnchecked, getFirst\r
     */\r
-    inline ElementType getLast() const noexcept\r
+    inline ElementType getLast() const\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getLast();\r
+\r
+        if (numUsed > 0)\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[numUsed - 1];\r
+        }\r
+\r
+        return ElementType();\r
     }\r
 \r
     /** Returns a pointer to the actual array data.\r
@@ -295,7 +346,7 @@ public:
     */\r
     inline ElementType* getRawDataPointer() noexcept\r
     {\r
-        return values.begin();\r
+        return data.elements;\r
     }\r
 \r
     //==============================================================================\r
@@ -304,7 +355,7 @@ public:
     */\r
     inline ElementType* begin() const noexcept\r
     {\r
-        return values.begin();\r
+        return data.elements;\r
     }\r
 \r
     /** Returns a pointer to the element which follows the last element in the array.\r
@@ -312,15 +363,12 @@ public:
     */\r
     inline ElementType* end() const noexcept\r
     {\r
-        return values.end();\r
-    }\r
+       #if JUCE_DEBUG\r
+        if (data.elements == nullptr || numUsed <= 0) // (to keep static analysers happy)\r
+            return data.elements;\r
+       #endif\r
 \r
-    /** Returns a pointer to the first element in the array.\r
-        This method is provided for compatibility with the standard C++ containers.\r
-    */\r
-    inline ElementType* data() const noexcept\r
-    {\r
-        return begin();\r
+        return data.elements + numUsed;\r
     }\r
 \r
     //==============================================================================\r
@@ -335,12 +383,12 @@ public:
     int indexOf (ParameterType elementToLookFor) const\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto e = values.begin();\r
-        auto endPtr = values.end();\r
+        auto e = data.elements.get();\r
+        auto endPtr = e + numUsed;\r
 \r
         for (; e != endPtr; ++e)\r
             if (elementToLookFor == *e)\r
-                return static_cast<int> (e - values.begin());\r
+                return static_cast<int> (e - data.elements.get());\r
 \r
         return -1;\r
     }\r
@@ -353,8 +401,8 @@ public:
     bool contains (ParameterType elementToLookFor) const\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto e = values.begin();\r
-        auto endPtr = values.end();\r
+        auto e = data.elements.get();\r
+        auto endPtr = e + numUsed;\r
 \r
         for (; e != endPtr; ++e)\r
             if (elementToLookFor == *e)\r
@@ -371,7 +419,8 @@ public:
     void add (const ElementType& newElement)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.add (newElement);\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        new (data.elements + numUsed++) ElementType (newElement);\r
     }\r
 \r
     /** Appends a new element at the end of the array.\r
@@ -381,7 +430,8 @@ public:
     void add (ElementType&& newElement)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.add (std::move (newElement));\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        new (data.elements + numUsed++) ElementType (static_cast<ElementType&&> (newElement));\r
     }\r
 \r
     /** Appends multiple new elements at the end of the array. */\r
@@ -389,7 +439,8 @@ public:
     void add (const ElementType& firstNewElement, OtherElements... otherElements)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.add (firstNewElement, otherElements...);\r
+        data.ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
+        addAssumingCapacityIsReady (firstNewElement, otherElements...);\r
     }\r
 \r
     /** Appends multiple new elements at the end of the array. */\r
@@ -397,7 +448,8 @@ public:
     void add (ElementType&& firstNewElement, OtherElements... otherElements)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.add (std::move (firstNewElement), otherElements...);\r
+        data.ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
+        addAssumingCapacityIsReady (static_cast<ElementType&&> (firstNewElement), otherElements...);\r
     }\r
 \r
     /** Inserts a new element into the array at a given position.\r
@@ -415,7 +467,24 @@ public:
     void insert (int indexToInsertAt, ParameterType newElement)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.insert (indexToInsertAt, newElement, 1);\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        jassert (data.elements != nullptr);\r
+\r
+        if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+        {\r
+            auto* insertPos = data.elements + indexToInsertAt;\r
+            auto numberToMove = numUsed - indexToInsertAt;\r
+\r
+            if (numberToMove > 0)\r
+                memmove (insertPos + 1, insertPos, ((size_t) numberToMove) * sizeof (ElementType));\r
+\r
+            new (insertPos) ElementType (newElement);\r
+            ++numUsed;\r
+        }\r
+        else\r
+        {\r
+            new (data.elements + numUsed++) ElementType (newElement);\r
+        }\r
     }\r
 \r
     /** Inserts multiple copies of an element into the array at a given position.\r
@@ -436,7 +505,28 @@ public:
         if (numberOfTimesToInsertIt > 0)\r
         {\r
             const ScopedLockType lock (getLock());\r
-            values.insert (indexToInsertAt, newElement, numberOfTimesToInsertIt);\r
+            data.ensureAllocatedSize (numUsed + numberOfTimesToInsertIt);\r
+            ElementType* insertPos;\r
+\r
+            if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+            {\r
+                insertPos = data.elements + indexToInsertAt;\r
+                auto numberToMove = numUsed - indexToInsertAt;\r
+                memmove (insertPos + numberOfTimesToInsertIt, insertPos, ((size_t) numberToMove) * sizeof (ElementType));\r
+            }\r
+            else\r
+            {\r
+                insertPos = data.elements + numUsed;\r
+            }\r
+\r
+            numUsed += numberOfTimesToInsertIt;\r
+\r
+            while (--numberOfTimesToInsertIt >= 0)\r
+            {\r
+                new (insertPos) ElementType (newElement);\r
+                ++insertPos; // NB: this increment is done separately from the\r
+                             // new statement to avoid a compiler bug in VS2014\r
+            }\r
         }\r
     }\r
 \r
@@ -459,7 +549,24 @@ public:
         if (numberOfElements > 0)\r
         {\r
             const ScopedLockType lock (getLock());\r
-            values.insertArray (indexToInsertAt, newElements, numberOfElements);\r
+            data.ensureAllocatedSize (numUsed + numberOfElements);\r
+            ElementType* insertPos = data.elements;\r
+\r
+            if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+            {\r
+                insertPos += indexToInsertAt;\r
+                auto numberToMove = numUsed - indexToInsertAt;\r
+                memmove (insertPos + numberOfElements, insertPos, (size_t) numberToMove * sizeof (ElementType));\r
+            }\r
+            else\r
+            {\r
+                insertPos += numUsed;\r
+            }\r
+\r
+            numUsed += numberOfElements;\r
+\r
+            while (--numberOfElements >= 0)\r
+                new (insertPos++) ElementType (*newElements++);\r
         }\r
     }\r
 \r
@@ -492,20 +599,20 @@ public:
         @param newValue         the new value to set for this index.\r
         @see add, insert\r
     */\r
-    void set (int indexToChange, ParameterType newValue)\r
+    void set (const int indexToChange, ParameterType newValue)\r
     {\r
-        if (indexToChange >= 0)\r
-        {\r
-            const ScopedLockType lock (getLock());\r
+        jassert (indexToChange >= 0);\r
+        const ScopedLockType lock (getLock());\r
 \r
-            if (indexToChange < values.size())\r
-                values[indexToChange] = newValue;\r
-            else\r
-                values.add (newValue);\r
+        if (isPositiveAndBelow (indexToChange, numUsed))\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            data.elements[indexToChange] = newValue;\r
         }\r
-        else\r
+        else if (indexToChange >= 0)\r
         {\r
-            jassertfalse;\r
+            data.ensureAllocatedSize (numUsed + 1);\r
+            new (data.elements + numUsed++) ElementType (newValue);\r
         }\r
     }\r
 \r
@@ -518,11 +625,11 @@ public:
         @param newValue         the new value to set for this index.\r
         @see set, getUnchecked\r
     */\r
-    void setUnchecked (int indexToChange, ParameterType newValue)\r
+    void setUnchecked (const int indexToChange, ParameterType newValue)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        jassert (isPositiveAndBelow (indexToChange, values.size()));\r
-        values[indexToChange] = newValue;\r
+        jassert (isPositiveAndBelow (indexToChange, numUsed));\r
+        data.elements[indexToChange] = newValue;\r
     }\r
 \r
     /** Adds elements from an array to the end of this array.\r
@@ -538,14 +645,28 @@ public:
         const ScopedLockType lock (getLock());\r
 \r
         if (numElementsToAdd > 0)\r
-            values.addArray (elementsToAdd, numElementsToAdd);\r
+        {\r
+            data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+\r
+            while (--numElementsToAdd >= 0)\r
+            {\r
+                new (data.elements + numUsed) ElementType (*elementsToAdd++);\r
+                ++numUsed;\r
+            }\r
+        }\r
     }\r
 \r
     template <typename TypeToCreateFrom>\r
     void addArray (const std::initializer_list<TypeToCreateFrom>& items)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.addArray (items);\r
+        data.ensureAllocatedSize (numUsed + (int) items.size());\r
+\r
+        for (auto& item : items)\r
+        {\r
+            new (data.elements + numUsed) ElementType (item);\r
+            ++numUsed;\r
+        }\r
     }\r
 \r
     /** Adds elements from a null-terminated array of pointers to the end of this array.\r
@@ -575,21 +696,8 @@ public:
     {\r
         const ScopedLockType lock1 (getLock());\r
         const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());\r
-        values.swapWith (otherArray.values);\r
-    }\r
-\r
-    /** Adds elements from another array to the end of this array.\r
-\r
-        @param arrayToAddFrom       the array from which to copy the elements\r
-        @see add\r
-    */\r
-    template <class OtherArrayType>\r
-    void addArray (const OtherArrayType& arrayToAddFrom)\r
-    {\r
-        const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock());\r
-        const ScopedLockType lock2 (getLock());\r
-\r
-        values.addArray (arrayToAddFrom);\r
+        data.swapWith (otherArray.data);\r
+        std::swap (numUsed, otherArray.numUsed);\r
     }\r
 \r
     /** Adds elements from another array to the end of this array.\r
@@ -602,15 +710,29 @@ public:
         @see add\r
     */\r
     template <class OtherArrayType>\r
-    typename std::enable_if<! std::is_pointer<OtherArrayType>::value, void>::type\r
-    addArray (const OtherArrayType& arrayToAddFrom,\r
-              int startIndex,\r
-              int numElementsToAdd = -1)\r
+    void addArray (const OtherArrayType& arrayToAddFrom,\r
+                   int startIndex = 0,\r
+                   int numElementsToAdd = -1)\r
     {\r
         const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock());\r
-        const ScopedLockType lock2 (getLock());\r
 \r
-        values.addArray (arrayToAddFrom, startIndex, numElementsToAdd);\r
+        {\r
+            const ScopedLockType lock2 (getLock());\r
+\r
+            if (startIndex < 0)\r
+            {\r
+                jassertfalse;\r
+                startIndex = 0;\r
+            }\r
+\r
+            if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
+                numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
+\r
+            data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+\r
+            while (--numElementsToAdd >= 0)\r
+                addAssumingCapacityIsReady (arrayToAddFrom.getUnchecked (startIndex++));\r
+        }\r
     }\r
 \r
     /** This will enlarge or shrink the array to the given number of elements, by adding\r
@@ -620,13 +742,13 @@ public:
         until its size is as specified. If its size is larger than the target, items will be\r
         removed from its end to shorten it.\r
     */\r
-    void resize (int targetNumItems)\r
+    void resize (const int targetNumItems)\r
     {\r
         jassert (targetNumItems >= 0);\r
-        auto numToAdd = targetNumItems - values.size();\r
+        auto numToAdd = targetNumItems - numUsed;\r
 \r
         if (numToAdd > 0)\r
-            insertMultiple (values.size(), ElementType(), numToAdd);\r
+            insertMultiple (numUsed, ElementType(), numToAdd);\r
         else if (numToAdd < 0)\r
             removeRange (targetNumItems, -numToAdd);\r
     }\r
@@ -647,7 +769,7 @@ public:
     int addSorted (ElementComparator& comparator, ParameterType newElement)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto index = findInsertIndexInSortedArray (comparator, values.begin(), newElement, 0, values.size());\r
+        auto index = findInsertIndexInSortedArray (comparator, data.elements.get(), newElement, 0, numUsed);\r
         insert (index, newElement);\r
         return index;\r
     }\r
@@ -687,12 +809,12 @@ public:
 \r
         const ScopedLockType lock (getLock());\r
 \r
-        for (int s = 0, e = values.size();;)\r
+        for (int s = 0, e = numUsed;;)\r
         {\r
             if (s >= e)\r
                 return -1;\r
 \r
-            if (comparator.compareElements (elementToLookFor, values[s]) == 0)\r
+            if (comparator.compareElements (elementToLookFor, data.elements[s]) == 0)\r
                 return s;\r
 \r
             auto halfway = (s + e) / 2;\r
@@ -700,7 +822,7 @@ public:
             if (halfway == s)\r
                 return -1;\r
 \r
-            if (comparator.compareElements (elementToLookFor, values[halfway]) >= 0)\r
+            if (comparator.compareElements (elementToLookFor, data.elements[halfway]) >= 0)\r
                 s = halfway;\r
             else\r
                 e = halfway;\r
@@ -721,8 +843,11 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (isPositiveAndBelow (indexToRemove, values.size()))\r
+        if (isPositiveAndBelow (indexToRemove, numUsed))\r
+        {\r
+            jassert (data.elements != nullptr);\r
             removeInternal (indexToRemove);\r
+        }\r
     }\r
 \r
     /** Removes an element from the array.\r
@@ -739,14 +864,15 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (isPositiveAndBelow (indexToRemove, values.size()))\r
+        if (isPositiveAndBelow (indexToRemove, numUsed))\r
         {\r
-            ElementType removed (values[indexToRemove]);\r
+            jassert (data.elements != nullptr);\r
+            ElementType removed (data.elements[indexToRemove]);\r
             removeInternal (indexToRemove);\r
             return removed;\r
         }\r
 \r
-        return ElementType();\r
+        return {};\r
     }\r
 \r
     /** Removes an element from the array.\r
@@ -764,10 +890,10 @@ public:
         jassert (elementToRemove != nullptr);\r
         const ScopedLockType lock (getLock());\r
 \r
-        jassert (values.begin() != nullptr);\r
-        auto indexToRemove = (int) (elementToRemove - values.begin());\r
+        jassert (data.elements != nullptr);\r
+        auto indexToRemove = (int) (elementToRemove - data.elements);\r
 \r
-        if (! isPositiveAndBelow (indexToRemove, values.size()))\r
+        if (! isPositiveAndBelow (indexToRemove, numUsed))\r
         {\r
             jassertfalse;\r
             return;\r
@@ -787,9 +913,9 @@ public:
     void removeFirstMatchingValue (ParameterType valueToRemove)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto* e = values.begin();\r
+        auto* e = data.elements.get();\r
 \r
-        for (int i = 0; i < values.size(); ++i)\r
+        for (int i = 0; i < numUsed; ++i)\r
         {\r
             if (valueToRemove == e[i])\r
             {\r
@@ -813,9 +939,9 @@ public:
         int numRemoved = 0;\r
         const ScopedLockType lock (getLock());\r
 \r
-        for (int i = values.size(); --i >= 0;)\r
+        for (int i = numUsed; --i >= 0;)\r
         {\r
-            if (valueToRemove == values[i])\r
+            if (valueToRemove == data.elements[i])\r
             {\r
                 removeInternal (i);\r
                 ++numRemoved;\r
@@ -837,14 +963,14 @@ public:
         @see remove, removeRange, removeAllInstancesOf\r
     */\r
     template <typename PredicateType>\r
-    int removeIf (PredicateType&& predicate)\r
+    int removeIf (PredicateType predicate)\r
     {\r
         int numRemoved = 0;\r
         const ScopedLockType lock (getLock());\r
 \r
-        for (int i = values.size(); --i >= 0;)\r
+        for (int i = numUsed; --i >= 0;)\r
         {\r
-            if (predicate (values[i]))\r
+            if (predicate (data.elements[i]))\r
             {\r
                 removeInternal (i);\r
                 ++numRemoved;\r
@@ -869,14 +995,23 @@ public:
     void removeRange (int startIndex, int numberToRemove)\r
     {\r
         const ScopedLockType lock (getLock());\r
+        auto endIndex = jlimit (0, numUsed, startIndex + numberToRemove);\r
+        startIndex = jlimit (0, numUsed, startIndex);\r
 \r
-        auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);\r
-        startIndex    = jlimit (0, values.size(), startIndex);\r
-        numberToRemove = endIndex - startIndex;\r
-\r
-        if (numberToRemove > 0)\r
+        if (endIndex > startIndex)\r
         {\r
-            values.removeElements (startIndex, numberToRemove);\r
+            auto* e = data.elements + startIndex;\r
+            numberToRemove = endIndex - startIndex;\r
+\r
+            for (int i = 0; i < numberToRemove; ++i)\r
+                e[i].~ElementType();\r
+\r
+            auto numToShift = numUsed - endIndex;\r
+\r
+            if (numToShift > 0)\r
+                memmove (e, e + numberToRemove, ((size_t) numToShift) * sizeof (ElementType));\r
+\r
+            numUsed -= numberToRemove;\r
             minimiseStorageAfterRemoval();\r
         }\r
     }\r
@@ -888,18 +1023,16 @@ public:
     */\r
     void removeLast (int howManyToRemove = 1)\r
     {\r
-        jassert (howManyToRemove >= 0);\r
+        const ScopedLockType lock (getLock());\r
 \r
-        if (howManyToRemove > 0)\r
-        {\r
-            const ScopedLockType lock (getLock());\r
+        if (howManyToRemove > numUsed)\r
+            howManyToRemove = numUsed;\r
 \r
-            if (howManyToRemove > values.size())\r
-                howManyToRemove = values.size();\r
+        for (int i = 1; i <= howManyToRemove; ++i)\r
+            data.elements[numUsed - i].~ElementType();\r
 \r
-            values.removeElements (values.size() - howManyToRemove, howManyToRemove);\r
-            minimiseStorageAfterRemoval();\r
-        }\r
+        numUsed -= howManyToRemove;\r
+        minimiseStorageAfterRemoval();\r
     }\r
 \r
     /** Removes any elements which are also in another array.\r
@@ -921,8 +1054,8 @@ public:
         {\r
             if (otherArray.size() > 0)\r
             {\r
-                for (int i = values.size(); --i >= 0;)\r
-                    if (otherArray.contains (values[i]))\r
+                for (int i = numUsed; --i >= 0;)\r
+                    if (otherArray.contains (data.elements[i]))\r
                         removeInternal (i);\r
             }\r
         }\r
@@ -949,8 +1082,8 @@ public:
             }\r
             else\r
             {\r
-                for (int i = values.size(); --i >= 0;)\r
-                    if (! otherArray.contains (values[i]))\r
+                for (int i = numUsed; --i >= 0;)\r
+                    if (! otherArray.contains (data.elements[i]))\r
                         removeInternal (i);\r
             }\r
         }\r
@@ -967,7 +1100,13 @@ public:
     void swap (int index1, int index2)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.swap (index1, index2);\r
+\r
+        if (isPositiveAndBelow (index1, numUsed)\r
+             && isPositiveAndBelow (index2, numUsed))\r
+        {\r
+            std::swap (data.elements[index1],\r
+                       data.elements[index2]);\r
+        }\r
     }\r
 \r
     /** Moves one of the values to a different position.\r
@@ -989,7 +1128,30 @@ public:
         if (currentIndex != newIndex)\r
         {\r
             const ScopedLockType lock (getLock());\r
-            values.move (currentIndex, newIndex);\r
+\r
+            if (isPositiveAndBelow (currentIndex, numUsed))\r
+            {\r
+                if (! isPositiveAndBelow (newIndex, numUsed))\r
+                    newIndex = numUsed - 1;\r
+\r
+                char tempCopy[sizeof (ElementType)];\r
+                memcpy (tempCopy, data.elements + currentIndex, sizeof (ElementType));\r
+\r
+                if (newIndex > currentIndex)\r
+                {\r
+                    memmove (data.elements + currentIndex,\r
+                             data.elements + currentIndex + 1,\r
+                             sizeof (ElementType) * (size_t) (newIndex - currentIndex));\r
+                }\r
+                else\r
+                {\r
+                    memmove (data.elements + newIndex + 1,\r
+                             data.elements + newIndex,\r
+                             sizeof (ElementType) * (size_t) (currentIndex - newIndex));\r
+                }\r
+\r
+                memcpy (data.elements + newIndex, tempCopy, sizeof (ElementType));\r
+            }\r
         }\r
     }\r
 \r
@@ -1003,7 +1165,7 @@ public:
     void minimiseStorageOverheads()\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.shrinkToNoMoreThan (values.size());\r
+        data.shrinkToNoMoreThan (numUsed);\r
     }\r
 \r
     /** Increases the array's internal storage to hold a minimum number of elements.\r
@@ -1012,10 +1174,10 @@ public:
         the array won't have to keep dynamically resizing itself as the elements\r
         are added, and it'll therefore be more efficient.\r
     */\r
-    void ensureStorageAllocated (int minNumElements)\r
+    void ensureStorageAllocated (const int minNumElements)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.ensureAllocatedSize (minNumElements);\r
+        data.ensureAllocatedSize (minNumElements);\r
     }\r
 \r
     //==============================================================================\r
@@ -1057,12 +1219,12 @@ public:
     */\r
     template <class ElementComparator>\r
     void sort (ElementComparator& comparator,\r
-               bool retainOrderOfEquivalentItems = false)\r
+               const bool retainOrderOfEquivalentItems = false)\r
     {\r
         const ScopedLockType lock (getLock());\r
         ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
                                    // avoids getting warning messages about the parameter being unused\r
-        sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
+        sortArray (comparator, data.elements.get(), 0, size() - 1, retainOrderOfEquivalentItems);\r
     }\r
 \r
     //==============================================================================\r
@@ -1070,7 +1232,7 @@ public:
         To lock, you can call getLock().enter() and getLock().exit(), or preferably use\r
         an object of ScopedLockType as an RAII lock for it.\r
     */\r
-    inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return values; }\r
+    inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return data; }\r
 \r
     /** Returns the type of scoped lock to use for locking this array */\r
     using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
@@ -1085,18 +1247,49 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    ArrayBase<ElementType, TypeOfCriticalSectionToUse> values;\r
+    ArrayAllocationBase <ElementType, TypeOfCriticalSectionToUse> data;\r
+    int numUsed = 0;\r
 \r
-    void removeInternal (int indexToRemove)\r
+    void removeInternal (const int indexToRemove)\r
     {\r
-        values.removeElements (indexToRemove, 1);\r
+        --numUsed;\r
+        auto* e = data.elements + indexToRemove;\r
+        e->~ElementType();\r
+        auto numberToShift = numUsed - indexToRemove;\r
+\r
+        if (numberToShift > 0)\r
+            memmove (e, e + 1, ((size_t) numberToShift) * sizeof (ElementType));\r
+\r
         minimiseStorageAfterRemoval();\r
     }\r
 \r
+    inline void deleteAllElements() noexcept\r
+    {\r
+        for (int i = 0; i < numUsed; ++i)\r
+            data.elements[i].~ElementType();\r
+    }\r
+\r
     void minimiseStorageAfterRemoval()\r
     {\r
-        if (values.capacity() > jmax (minimumAllocatedSize, values.size() * 2))\r
-            values.shrinkToNoMoreThan (jmax (values.size(), jmax (minimumAllocatedSize, 64 / (int) sizeof (ElementType))));\r
+        if (data.numAllocated > jmax (minimumAllocatedSize, numUsed * 2))\r
+            data.shrinkToNoMoreThan (jmax (numUsed, jmax (minimumAllocatedSize, 64 / (int) sizeof (ElementType))));\r
+    }\r
+\r
+    void addAssumingCapacityIsReady (const ElementType& e)  { new (data.elements + numUsed++) ElementType (e); }\r
+    void addAssumingCapacityIsReady (ElementType&& e)       { new (data.elements + numUsed++) ElementType (static_cast<ElementType&&> (e)); }\r
+\r
+    template <typename... OtherElements>\r
+    void addAssumingCapacityIsReady (const ElementType& firstNewElement, OtherElements... otherElements)\r
+    {\r
+        addAssumingCapacityIsReady (firstNewElement);\r
+        addAssumingCapacityIsReady (otherElements...);\r
+    }\r
+\r
+    template <typename... OtherElements>\r
+    void addAssumingCapacityIsReady (ElementType&& firstNewElement, OtherElements... otherElements)\r
+    {\r
+        addAssumingCapacityIsReady (static_cast<ElementType&&> (firstNewElement));\r
+        addAssumingCapacityIsReady (otherElements...);\r
     }\r
 };\r
 \r
index 5a82d6ec3eae7fae65fcc0bb0d2a30ff72a6dcf5..6ab28e76951a0fefac37db729c96a8396bc06bec 100644 (file)
@@ -27,9 +27,13 @@ namespace juce
 /**\r
     Implements some basic array storage allocation functions.\r
 \r
-    This class isn't really for public use - it used to be part of the\r
-    container classes but has since been superseded by ArrayBase. Eventually\r
-    it will be removed from the API.\r
+    This class isn't really for public use - it's used by the other\r
+    array classes, but might come in handy for some purposes.\r
+\r
+    It inherits from a critical section class to allow the arrays to use\r
+    the "empty base class optimisation" pattern to reduce their footprint.\r
+\r
+    @see Array, OwnedArray, ReferenceCountedArray\r
 \r
     @tags{Core}\r
 */\r
diff --git a/modules/juce_core/containers/juce_ArrayBase.cpp b/modules/juce_core/containers/juce_ArrayBase.cpp
deleted file mode 100644 (file)
index 19986d6..0000000
+++ /dev/null
@@ -1,598 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2018 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-namespace ArrayBaseTestsHelpers\r
-{\r
-    class TriviallyCopyableType\r
-    {\r
-    public:\r
-        TriviallyCopyableType() = default;\r
-\r
-        TriviallyCopyableType (int v)\r
-            : value (v)\r
-        {}\r
-\r
-        TriviallyCopyableType (float v)\r
-            : value ((int) v)\r
-        {}\r
-\r
-        bool operator== (const TriviallyCopyableType& other) const\r
-        {\r
-            return getValue() == other.getValue();\r
-        }\r
-\r
-        int getValue() const   { return value; }\r
-\r
-    private:\r
-        int value { -1111 };\r
-    };\r
-\r
-    class NonTriviallyCopyableType\r
-    {\r
-    public:\r
-        NonTriviallyCopyableType() = default;\r
-\r
-        NonTriviallyCopyableType (int v)\r
-            : value (v)\r
-        {}\r
-\r
-        NonTriviallyCopyableType (float v)\r
-            : value ((int) v)\r
-        {}\r
-\r
-        NonTriviallyCopyableType (const NonTriviallyCopyableType& other)\r
-            : value (other.value)\r
-        {}\r
-\r
-        NonTriviallyCopyableType& operator= (const NonTriviallyCopyableType& other)\r
-        {\r
-            value = other.value;\r
-            return *this;\r
-        }\r
-\r
-        bool operator== (const NonTriviallyCopyableType& other) const\r
-        {\r
-            return getValue() == other.getValue();\r
-        }\r
-\r
-        int getValue() const   { return *ptr; }\r
-\r
-    private:\r
-        int value { -1111 };\r
-        int* ptr = &value;\r
-    };\r
-}\r
-\r
-bool operator== (const ArrayBaseTestsHelpers::TriviallyCopyableType& tct,\r
-                 const ArrayBaseTestsHelpers::NonTriviallyCopyableType& ntct)\r
-{\r
-    return tct.getValue() == ntct.getValue();\r
-}\r
-\r
-bool operator== (const ArrayBaseTestsHelpers::NonTriviallyCopyableType& ntct,\r
-                 const ArrayBaseTestsHelpers::TriviallyCopyableType& tct)\r
-{\r
-    return tct == ntct;\r
-}\r
-\r
-class ArrayBaseTests  : public UnitTest\r
-{\r
-    using CopyableType    = ArrayBaseTestsHelpers::TriviallyCopyableType;\r
-    using NoncopyableType = ArrayBaseTestsHelpers::NonTriviallyCopyableType;\r
-\r
-public:\r
-    ArrayBaseTests()\r
-        : UnitTest ("ArrayBase", "Containers")\r
-    {}\r
-\r
-    void runTest() override\r
-    {\r
-        static_assert (std::is_trivially_copyable<CopyableType>::value,\r
-                       "Test TriviallyCopyableType is not trivially copyable");\r
-        static_assert (! std::is_trivially_copyable<NoncopyableType>::value,\r
-                       "Test NonTriviallyCopyableType is trivially copyable");\r
-\r
-        beginTest ("grow capacity");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            int originalCapacity = 4;\r
-            referenceContainer.reserve ((size_t) originalCapacity);\r
-            expectEquals ((int) referenceContainer.capacity(), originalCapacity);\r
-            copyableContainer.setAllocatedSize (originalCapacity);\r
-            expectEquals (copyableContainer.capacity(), originalCapacity);\r
-            noncopyableContainer.setAllocatedSize (originalCapacity);\r
-            expectEquals (noncopyableContainer.capacity(), originalCapacity);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 33);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            expect ((int) referenceContainer.capacity() != originalCapacity);\r
-            expect (copyableContainer.capacity()        != originalCapacity);\r
-            expect (noncopyableContainer.capacity()     != originalCapacity);\r
-        }\r
-\r
-        beginTest ("shrink capacity");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            int numElements = 45;\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, numElements);\r
-\r
-            copyableContainer.shrinkToNoMoreThan (numElements);\r
-            noncopyableContainer.setAllocatedSize (numElements + 1);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            referenceContainer.clear();\r
-            copyableContainer.removeElements    (0, numElements);\r
-            noncopyableContainer.removeElements (0, numElements);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            copyableContainer.setAllocatedSize    (0);\r
-            noncopyableContainer.setAllocatedSize (0);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, numElements);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("equality");\r
-        {\r
-            std::vector<int> referenceContainer = { 1, 2, 3 };\r
-            ArrayBase<int, DummyCriticalSection> testContainer1, testContainer2;\r
-\r
-            for (auto i : referenceContainer)\r
-            {\r
-                testContainer1.add (i);\r
-                testContainer2.add (i);\r
-            }\r
-\r
-            expect (testContainer1 == referenceContainer);\r
-            expect (testContainer2 == testContainer1);\r
-\r
-            testContainer1.ensureAllocatedSize (257);\r
-            referenceContainer.shrink_to_fit();\r
-\r
-            expect (testContainer1 == referenceContainer);\r
-            expect (testContainer2 == testContainer1);\r
-\r
-            testContainer1.removeElements (0, 1);\r
-\r
-            expect (testContainer1 != referenceContainer);\r
-            expect (testContainer2 != testContainer1);\r
-        }\r
-\r
-        beginTest ("accessors");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 3);\r
-\r
-            int testValue = -123;\r
-            referenceContainer[0]   = testValue;\r
-            copyableContainer[0]    = testValue;\r
-            noncopyableContainer[0] = testValue;\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            expect (copyableContainer   .getFirst().getValue() == testValue);\r
-            expect (noncopyableContainer.getFirst().getValue() == testValue);\r
-\r
-            auto last = referenceContainer.back().getValue();\r
-\r
-            expectEquals (copyableContainer   .getLast().getValue(), last);\r
-            expectEquals (noncopyableContainer.getLast().getValue(), last);\r
-\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableEmpty;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableEmpty;\r
-\r
-            auto defualtValue = CopyableType().getValue();\r
-            expectEquals (defualtValue, NoncopyableType().getValue());\r
-\r
-            expectEquals (copyableEmpty   .getFirst().getValue(), defualtValue);\r
-            expectEquals (noncopyableEmpty.getFirst().getValue(), defualtValue);\r
-            expectEquals (copyableEmpty   .getLast() .getValue(), defualtValue);\r
-            expectEquals (noncopyableEmpty.getLast() .getValue(), defualtValue);\r
-\r
-            ArrayBase<float*, DummyCriticalSection> floatPointers;\r
-            expect (floatPointers.getValueWithDefault (-3) == nullptr);\r
-        }\r
-\r
-        beginTest ("add moved");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            for (int i = 0; i < 5; ++i)\r
-            {\r
-                CopyableType ref    (-i);\r
-                CopyableType ct     (-i);\r
-                NoncopyableType nct (-i);\r
-                referenceContainer.push_back (std::move (ref));\r
-                copyableContainer.add (std::move (ct));\r
-                noncopyableContainer.add (std::move (nct));\r
-            }\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("add multiple");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            for (int i = 4; i < 7; ++i)\r
-                referenceContainer.push_back ({ -i });\r
-\r
-            copyableContainer.add    (CopyableType    (-4), CopyableType    (-5), CopyableType    (-6));\r
-            noncopyableContainer.add (NoncopyableType (-4), NoncopyableType (-5), NoncopyableType (-6));\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("add array from a pointer");\r
-        {\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            std::vector<CopyableType>    copyableData    = { 3, 4, 5 };\r
-            std::vector<NoncopyableType> noncopyableData = { 3, 4, 5 };\r
-\r
-            copyableContainer.addArray    (copyableData.data(),    (int) copyableData.size());\r
-            noncopyableContainer.addArray (noncopyableData.data(), (int) noncopyableData.size());\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, copyableData);\r
-        }\r
-\r
-        beginTest ("add array from a pointer of a different type");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            std::vector<float> floatData = { 1.4f, 2.5f, 3.6f };\r
-\r
-            for (auto f : floatData)\r
-                referenceContainer.push_back ({ f });\r
-\r
-            copyableContainer.addArray    (floatData.data(), (int) floatData.size());\r
-            noncopyableContainer.addArray (floatData.data(), (int) floatData.size());\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("add array from initilizer list");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            std::initializer_list<CopyableType>    ilct  { { 3 }, { 4 }, { 5 } };\r
-            std::initializer_list<NoncopyableType> ilnct { { 3 }, { 4 }, { 5 } };\r
-\r
-            for (auto v : ilct)\r
-                referenceContainer.push_back ({ v });\r
-\r
-            copyableContainer.addArray    (ilct);\r
-            noncopyableContainer.addArray (ilnct);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("add array from containers");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 5);\r
-\r
-            std::vector<CopyableType> referenceContainerCopy (referenceContainer);\r
-            std::vector<NoncopyableType> noncopyableReferenceContainerCopy;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainerCopy;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainerCopy;\r
-\r
-            for (auto& v : referenceContainerCopy)\r
-                noncopyableReferenceContainerCopy.push_back ({ v.getValue() });\r
-\r
-            for (size_t i = 0; i < referenceContainerCopy.size(); ++i)\r
-            {\r
-                auto value = referenceContainerCopy[i].getValue();\r
-                copyableContainerCopy.add    ({ value });\r
-                noncopyableContainerCopy.add ({ value });\r
-            }\r
-\r
-            // From self-types\r
-            copyableContainer.addArray    (copyableContainerCopy);\r
-            noncopyableContainer.addArray (noncopyableContainerCopy);\r
-\r
-            for (auto v : referenceContainerCopy)\r
-                referenceContainer.push_back (v);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            // From std containers\r
-            copyableContainer.addArray    (referenceContainerCopy);\r
-            noncopyableContainer.addArray (noncopyableReferenceContainerCopy);\r
-\r
-            for (auto v : referenceContainerCopy)\r
-                referenceContainer.push_back (v);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            // From std containers with offset\r
-            int offset = 5;\r
-            copyableContainer.addArray    (referenceContainerCopy,            offset);\r
-            noncopyableContainer.addArray (noncopyableReferenceContainerCopy, offset);\r
-\r
-            for (size_t i = 5; i < referenceContainerCopy.size(); ++i)\r
-                referenceContainer.push_back (referenceContainerCopy[i]);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("insert");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 8);\r
-\r
-            referenceContainer.insert (referenceContainer.begin(), -4);\r
-            copyableContainer.insert    (0, -4, 1);\r
-            noncopyableContainer.insert (0, -4, 1);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            for (int i = 0; i < 3; ++i)\r
-                referenceContainer.insert (referenceContainer.begin() + 1, -3);\r
-\r
-            copyableContainer.insert    (1, -3, 3);\r
-            noncopyableContainer.insert (1, -3, 3);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            for (int i = 0; i < 50; ++i)\r
-                referenceContainer.insert (referenceContainer.end() - 1, -9);\r
-\r
-            copyableContainer.insert    (copyableContainer.size()    - 2, -9, 50);\r
-            noncopyableContainer.insert (noncopyableContainer.size() - 2, -9, 50);\r
-        }\r
-\r
-        beginTest ("insert array");\r
-        {\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            std::vector<CopyableType>    copyableData    = { 3, 4, 5, 6, 7, 8 };\r
-            std::vector<NoncopyableType> noncopyableData = { 3, 4, 5, 6, 7, 8 };\r
-\r
-            std::vector<CopyableType> referenceContainer { copyableData };\r
-\r
-            copyableContainer.insertArray    (0, copyableData.data(),    (int) copyableData.size());\r
-            noncopyableContainer.insertArray (0, noncopyableData.data(), (int) noncopyableData.size());\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            int insertPos = copyableContainer.size() - 1;\r
-\r
-            for (auto it = copyableData.end(); it != copyableData.begin(); --it)\r
-                referenceContainer.insert (referenceContainer.begin() + insertPos, CopyableType (*(it - 1)));\r
-\r
-            copyableContainer.insertArray    (insertPos, copyableData.data(),    (int) copyableData.size());\r
-            noncopyableContainer.insertArray (insertPos, noncopyableData.data(), (int) noncopyableData.size());\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("remove");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 17);\r
-\r
-            for (int i = 0; i < 4; ++i)\r
-            {\r
-                referenceContainer.erase (referenceContainer.begin() + i);\r
-                copyableContainer.removeElements (i, 1);\r
-                noncopyableContainer.removeElements (i, 1);\r
-            }\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 17);\r
-            int blockSize = 3;\r
-\r
-            for (int i = 0; i < 4; ++i)\r
-            {\r
-                for (int j = 0; j < blockSize; ++j)\r
-                    referenceContainer.erase (referenceContainer.begin() + i);\r
-\r
-                copyableContainer.removeElements (i, blockSize);\r
-                noncopyableContainer.removeElements (i, blockSize);\r
-            }\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
-            auto numToRemove = copyableContainer.size() - 2;\r
-\r
-            for (int i = 0; i < numToRemove; ++i)\r
-                referenceContainer.erase (referenceContainer.begin() + 1);\r
-\r
-            copyableContainer.removeElements    (1, numToRemove);\r
-            noncopyableContainer.removeElements (1, numToRemove);\r
-\r
-            checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-        }\r
-\r
-        beginTest ("move");\r
-        {\r
-            std::vector<CopyableType> referenceContainer;\r
-            ArrayBase<CopyableType,    DummyCriticalSection> copyableContainer;\r
-            ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
-            addData (referenceContainer, copyableContainer, noncopyableContainer, 6);\r
-\r
-            std::vector<std::pair<int, int>> testValues;\r
-            testValues.emplace_back (2, 4);\r
-            testValues.emplace_back (0, 5);\r
-            testValues.emplace_back (4, 1);\r
-            testValues.emplace_back (5, 0);\r
-\r
-            for (auto p : testValues)\r
-            {\r
-                if (p.second > p.first)\r
-                    std::rotate (referenceContainer.begin() + p.first,\r
-                                 referenceContainer.begin() + p.first + 1,\r
-                                 referenceContainer.begin() + p.second + 1);\r
-                else\r
-                    std::rotate (referenceContainer.begin() + p.second,\r
-                                 referenceContainer.begin() + p.first,\r
-                                 referenceContainer.begin() + p.first + 1);\r
-\r
-                copyableContainer.move    (p.first, p.second);\r
-                noncopyableContainer.move (p.first, p.second);\r
-\r
-                checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-            }\r
-        }\r
-\r
-        beginTest ("After converting move construction, ownership is transferred");\r
-        {\r
-            Derived obj;\r
-            ArrayBase<Derived*, DummyCriticalSection> derived;\r
-            derived.setAllocatedSize (5);\r
-            derived.add (&obj);\r
-\r
-            ArrayBase<Base*, DummyCriticalSection> base { std::move (derived) };\r
-\r
-            expectEquals (base.capacity(), 5);\r
-            expectEquals (base.size(), 1);\r
-            expect (base.getFirst() == &obj);\r
-            expectEquals (derived.capacity(), 0);\r
-            expectEquals (derived.size(), 0);\r
-            expect (derived.data() == nullptr);\r
-        }\r
-\r
-        beginTest ("After converting move assignment, ownership is transferred");\r
-        {\r
-            Derived obj;\r
-            ArrayBase<Derived*, DummyCriticalSection> derived;\r
-            derived.setAllocatedSize (5);\r
-            derived.add (&obj);\r
-            ArrayBase<Base*, DummyCriticalSection> base;\r
-\r
-            base = std::move (derived);\r
-\r
-            expectEquals (base.capacity(), 5);\r
-            expectEquals (base.size(), 1);\r
-            expect (base.getFirst() == &obj);\r
-            expectEquals (derived.capacity(), 0);\r
-            expectEquals (derived.size(), 0);\r
-            expect (derived.data() == nullptr);\r
-        }\r
-    }\r
-\r
-private:\r
-    struct Base\r
-    {\r
-        virtual ~Base() = default;\r
-    };\r
-\r
-    struct Derived : Base\r
-    {\r
-    };\r
-\r
-    static void addData (std::vector<CopyableType>& referenceContainer,\r
-                         ArrayBase<CopyableType,    DummyCriticalSection>& copyableContainer,\r
-                         ArrayBase<NoncopyableType, DummyCriticalSection>& NoncopyableContainer,\r
-                         int numValues)\r
-    {\r
-        for (int i = 0; i < numValues; ++i)\r
-        {\r
-            referenceContainer.push_back ({ i });\r
-            copyableContainer.add ({ i });\r
-            NoncopyableContainer.add ({ i });\r
-        }\r
-    }\r
-\r
-    template<typename A, typename B>\r
-    void checkEqual (const ArrayBase<A, DummyCriticalSection>& a,\r
-                     const ArrayBase<B, DummyCriticalSection>& b)\r
-    {\r
-        expectEquals ((int) a.size(), (int) b.size());\r
-\r
-        for (int i = 0; i < (int) a.size(); ++i)\r
-            expect (a[i] == b[i]);\r
-    }\r
-\r
-    template<typename A, typename B>\r
-    void checkEqual (ArrayBase<A, DummyCriticalSection>& a,\r
-                     std::vector<B>& b)\r
-    {\r
-        expectEquals ((int) a.size(), (int) b.size());\r
-\r
-        for (int i = 0; i < (int) a.size(); ++i)\r
-            expect (a[i] == b[(size_t) i]);\r
-    }\r
-\r
-    template<typename A, typename B, typename C>\r
-    void checkEqual (ArrayBase<A, DummyCriticalSection>& a,\r
-                     ArrayBase<B, DummyCriticalSection>& b,\r
-                     std::vector<C>& c)\r
-    {\r
-        checkEqual (a, b);\r
-        checkEqual (a, c);\r
-        checkEqual (b, c);\r
-    }\r
-};\r
-\r
-static ArrayBaseTests arrayBaseTests;\r
-\r
-#endif\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_core/containers/juce_ArrayBase.h b/modules/juce_core/containers/juce_ArrayBase.h
deleted file mode 100644 (file)
index 9c4ae95..0000000
+++ /dev/null
@@ -1,589 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-/**\r
-    A basic object container.\r
-\r
-    This class isn't really for public use - it's used by the other\r
-    array classes, but might come in handy for some purposes.\r
-\r
-    It inherits from a critical section class to allow the arrays to use\r
-    the "empty base class optimisation" pattern to reduce their footprint.\r
-\r
-    @see Array, OwnedArray, ReferenceCountedArray\r
-\r
-    @tags{Core}\r
-*/\r
-template <class ElementType, class TypeOfCriticalSectionToUse>\r
-class ArrayBase  : public TypeOfCriticalSectionToUse\r
-{\r
-private:\r
-    using ParameterType = typename TypeHelpers::ParameterType<ElementType>::type;\r
-\r
-    template <class OtherElementType, class OtherCriticalSection>\r
-    using AllowConversion = typename std::enable_if<! std::is_same<std::tuple<ElementType, TypeOfCriticalSectionToUse>,\r
-                                                                   std::tuple<OtherElementType, OtherCriticalSection>>::value>::type;\r
-\r
-public:\r
-    //==============================================================================\r
-    ArrayBase() = default;\r
-\r
-    ~ArrayBase()\r
-    {\r
-        clear();\r
-    }\r
-\r
-    ArrayBase (ArrayBase&& other) noexcept\r
-        : elements (std::move (other.elements)),\r
-          numAllocated (other.numAllocated),\r
-          numUsed (other.numUsed)\r
-    {\r
-        other.numAllocated = 0;\r
-        other.numUsed = 0;\r
-    }\r
-\r
-    ArrayBase& operator= (ArrayBase&& other) noexcept\r
-    {\r
-        if (this != &other)\r
-        {\r
-            auto tmp (std::move (other));\r
-            swapWith (tmp);\r
-        }\r
-\r
-        return *this;\r
-    }\r
-\r
-    /** Converting move constructor.\r
-        Only enabled when the other array has a different type to this one.\r
-        If you see a compile error here, it's probably because you're attempting a conversion that\r
-        HeapBlock won't allow.\r
-    */\r
-    template <class OtherElementType,\r
-              class OtherCriticalSection,\r
-              typename = AllowConversion<OtherElementType, OtherCriticalSection>>\r
-    ArrayBase (ArrayBase<OtherElementType, OtherCriticalSection>&& other) noexcept\r
-        : elements (std::move (other.elements)),\r
-          numAllocated (other.numAllocated),\r
-          numUsed (other.numUsed)\r
-    {\r
-        other.numAllocated = 0;\r
-        other.numUsed = 0;\r
-    }\r
-\r
-    /** Converting move assignment operator.\r
-        Only enabled when the other array has a different type to this one.\r
-        If you see a compile error here, it's probably because you're attempting a conversion that\r
-        HeapBlock won't allow.\r
-    */\r
-    template <class OtherElementType,\r
-              class OtherCriticalSection,\r
-              typename = AllowConversion<OtherElementType, OtherCriticalSection>>\r
-    ArrayBase& operator= (ArrayBase<OtherElementType, OtherCriticalSection>&& other) noexcept\r
-    {\r
-        // No need to worry about assignment to *this, because 'other' must be of a different type.\r
-        elements = std::move (other.elements);\r
-        numAllocated = other.numAllocated;\r
-        numUsed = other.numUsed;\r
-\r
-        other.numAllocated = 0;\r
-        other.numUsed = 0;\r
-\r
-        return *this;\r
-    }\r
-\r
-    //==============================================================================\r
-    template <class OtherArrayType>\r
-    bool operator== (const OtherArrayType& other) const noexcept\r
-    {\r
-        if (size() != (int) other.size())\r
-            return false;\r
-\r
-        auto* e = begin();\r
-\r
-        for (auto& o : other)\r
-            if (! (*e++ == o))\r
-                return false;\r
-\r
-        return true;\r
-    }\r
-\r
-    template <class OtherArrayType>\r
-    bool operator!= (const OtherArrayType& other) const noexcept\r
-    {\r
-        return ! operator== (other);\r
-    }\r
-\r
-    //==============================================================================\r
-    inline ElementType& operator[] (const int index) const noexcept\r
-    {\r
-        jassert (elements != nullptr);\r
-        jassert (isPositiveAndBelow (index, numUsed));\r
-        return elements[index];\r
-    }\r
-\r
-    inline ElementType getValueWithDefault (const int index) const noexcept\r
-    {\r
-        return isPositiveAndBelow (index, numUsed) ? elements[index] : ElementType();\r
-    }\r
-\r
-    inline ElementType getFirst() const noexcept\r
-    {\r
-        return numUsed > 0 ? elements[0] : ElementType();\r
-    }\r
-\r
-    inline ElementType getLast() const noexcept\r
-    {\r
-        return numUsed > 0 ? elements[numUsed - 1] : ElementType();\r
-    }\r
-\r
-    //==============================================================================\r
-    inline ElementType* begin() const noexcept\r
-    {\r
-        return elements;\r
-    }\r
-\r
-    inline ElementType* end() const noexcept\r
-    {\r
-        return elements + numUsed;\r
-    }\r
-\r
-    inline ElementType* data() const noexcept\r
-    {\r
-        return elements;\r
-    }\r
-\r
-    inline int size() const noexcept\r
-    {\r
-        return numUsed;\r
-    }\r
-\r
-    inline int capacity() const noexcept\r
-    {\r
-        return numAllocated;\r
-    }\r
-\r
-    //==============================================================================\r
-    void setAllocatedSize (int numElements)\r
-    {\r
-        jassert (numElements >= numUsed);\r
-\r
-        if (numAllocated != numElements)\r
-        {\r
-            if (numElements > 0)\r
-                setAllocatedSizeInternal (numElements);\r
-            else\r
-                elements.free();\r
-        }\r
-\r
-        numAllocated = numElements;\r
-    }\r
-\r
-    void ensureAllocatedSize (int minNumElements)\r
-    {\r
-        if (minNumElements > numAllocated)\r
-            setAllocatedSize ((minNumElements + minNumElements / 2 + 8) & ~7);\r
-\r
-        jassert (numAllocated <= 0 || elements != nullptr);\r
-    }\r
-\r
-    void shrinkToNoMoreThan (int maxNumElements)\r
-    {\r
-        if (maxNumElements < numAllocated)\r
-            setAllocatedSize (maxNumElements);\r
-    }\r
-\r
-    void clear()\r
-    {\r
-        for (int i = 0; i < numUsed; ++i)\r
-            elements[i].~ElementType();\r
-\r
-        numUsed = 0;\r
-    }\r
-\r
-    //==============================================================================\r
-    void swapWith (ArrayBase& other) noexcept\r
-    {\r
-        elements.swapWith (other.elements);\r
-        std::swap (numAllocated, other.numAllocated);\r
-        std::swap (numUsed,      other.numUsed);\r
-    }\r
-\r
-    //==============================================================================\r
-    void add (const ElementType& newElement)\r
-    {\r
-        checkSourceIsNotAMember (&newElement);\r
-        ensureAllocatedSize (numUsed + 1);\r
-        addAssumingCapacityIsReady (newElement);\r
-    }\r
-\r
-    void add (ElementType&& newElement)\r
-    {\r
-        checkSourceIsNotAMember (&newElement);\r
-        ensureAllocatedSize (numUsed + 1);\r
-        addAssumingCapacityIsReady (std::move (newElement));\r
-    }\r
-\r
-    template <typename... OtherElements>\r
-    void add (const ElementType& firstNewElement, OtherElements... otherElements)\r
-    {\r
-        checkSourceIsNotAMember (&firstNewElement);\r
-        ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
-        addAssumingCapacityIsReady (firstNewElement, otherElements...);\r
-    }\r
-\r
-    template <typename... OtherElements>\r
-    void add (ElementType&& firstNewElement, OtherElements... otherElements)\r
-    {\r
-        checkSourceIsNotAMember (&firstNewElement);\r
-        ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
-        addAssumingCapacityIsReady (std::move (firstNewElement), otherElements...);\r
-    }\r
-\r
-    //==============================================================================\r
-    template <typename Type>\r
-    void addArray (const Type* elementsToAdd, int numElementsToAdd)\r
-    {\r
-        ensureAllocatedSize (numUsed + numElementsToAdd);\r
-        addArrayInternal (elementsToAdd, numElementsToAdd);\r
-        numUsed += numElementsToAdd;\r
-    }\r
-\r
-    template <typename TypeToCreateFrom>\r
-    void addArray (const std::initializer_list<TypeToCreateFrom>& items)\r
-    {\r
-        ensureAllocatedSize (numUsed + (int) items.size());\r
-\r
-        for (auto& item : items)\r
-            new (elements + numUsed++) ElementType (item);\r
-    }\r
-\r
-    template <class OtherArrayType>\r
-    void addArray (const OtherArrayType& arrayToAddFrom)\r
-    {\r
-        jassert ((const void*) this != (const void*) &arrayToAddFrom); // can't add from our own elements!\r
-        ensureAllocatedSize (numUsed + (int) arrayToAddFrom.size());\r
-\r
-        for (auto& e : arrayToAddFrom)\r
-            addAssumingCapacityIsReady (e);\r
-    }\r
-\r
-    template <class OtherArrayType>\r
-    typename std::enable_if<! std::is_pointer<OtherArrayType>::value, int>::type\r
-    addArray (const OtherArrayType& arrayToAddFrom,\r
-              int startIndex, int numElementsToAdd = -1)\r
-    {\r
-        jassert ((const void*) this != (const void*) &arrayToAddFrom); // can't add from our own elements!\r
-\r
-        if (startIndex < 0)\r
-        {\r
-            jassertfalse;\r
-            startIndex = 0;\r
-        }\r
-\r
-        if (numElementsToAdd < 0 || startIndex + numElementsToAdd > (int) arrayToAddFrom.size())\r
-            numElementsToAdd = (int) arrayToAddFrom.size() - startIndex;\r
-\r
-        addArray (arrayToAddFrom.data() + startIndex, numElementsToAdd);\r
-\r
-        return numElementsToAdd;\r
-    }\r
-\r
-    //==============================================================================\r
-    void insert (int indexToInsertAt, ParameterType newElement, int numberOfTimesToInsertIt)\r
-    {\r
-        checkSourceIsNotAMember (&newElement);\r
-        auto* space = createInsertSpace (indexToInsertAt, numberOfTimesToInsertIt);\r
-\r
-        for (int i = 0; i < numberOfTimesToInsertIt; ++i)\r
-            new (space++) ElementType (newElement);\r
-\r
-        numUsed += numberOfTimesToInsertIt;\r
-    }\r
-\r
-    void insertArray (int indexToInsertAt, const ElementType* newElements, int numberOfElements)\r
-    {\r
-        auto* space = createInsertSpace (indexToInsertAt, numberOfElements);\r
-\r
-        for (int i = 0; i < numberOfElements; ++i)\r
-            new (space++) ElementType (*(newElements++));\r
-\r
-        numUsed += numberOfElements;\r
-    }\r
-\r
-    //==============================================================================\r
-    void removeElements (int indexToRemoveAt, int numElementsToRemove)\r
-    {\r
-        jassert (indexToRemoveAt >= 0);\r
-        jassert (numElementsToRemove >= 0);\r
-        jassert (indexToRemoveAt + numElementsToRemove <= numUsed);\r
-\r
-        if (numElementsToRemove > 0)\r
-        {\r
-            removeElementsInternal (indexToRemoveAt, numElementsToRemove);\r
-            numUsed -= numElementsToRemove;\r
-        }\r
-    }\r
-\r
-    //==============================================================================\r
-    void swap (int index1, int index2)\r
-    {\r
-        if (isPositiveAndBelow (index1, numUsed)\r
-         && isPositiveAndBelow (index2, numUsed))\r
-        {\r
-            std::swap (elements[index1],\r
-                       elements[index2]);\r
-        }\r
-    }\r
-\r
-    //==============================================================================\r
-    void move (int currentIndex, int newIndex) noexcept\r
-    {\r
-        if (isPositiveAndBelow (currentIndex, numUsed))\r
-        {\r
-            if (! isPositiveAndBelow (newIndex, numUsed))\r
-                newIndex = numUsed - 1;\r
-\r
-            moveInternal (currentIndex, newIndex);\r
-        }\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    template <typename T>\r
-    using TriviallyCopyableVoid = typename std::enable_if<std::is_trivially_copyable<T>::value, void>::type;\r
-\r
-    template <typename T>\r
-    using NonTriviallyCopyableVoid = typename std::enable_if<! std::is_trivially_copyable<T>::value, void>::type;\r
-\r
-    //==============================================================================\r
-    template <typename T = ElementType>\r
-    TriviallyCopyableVoid<T> addArrayInternal (const ElementType* otherElements, int numElements)\r
-    {\r
-        memcpy (elements + numUsed, otherElements, (size_t) numElements * sizeof (ElementType));\r
-    }\r
-\r
-    template <typename Type, typename T = ElementType>\r
-    TriviallyCopyableVoid<T> addArrayInternal (const Type* otherElements, int numElements)\r
-    {\r
-        auto* start = elements + numUsed;\r
-\r
-        while (--numElements >= 0)\r
-            new (start++) ElementType (*(otherElements++));\r
-    }\r
-\r
-    template <typename Type, typename T = ElementType>\r
-    NonTriviallyCopyableVoid<T> addArrayInternal (const Type* otherElements, int numElements)\r
-    {\r
-        auto* start = elements + numUsed;\r
-\r
-        while (--numElements >= 0)\r
-            new (start++) ElementType (*(otherElements++));\r
-    }\r
-\r
-    //==============================================================================\r
-    template <typename T = ElementType>\r
-    TriviallyCopyableVoid<T> setAllocatedSizeInternal (int numElements)\r
-    {\r
-        elements.realloc ((size_t) numElements);\r
-    }\r
-\r
-    template <typename T = ElementType>\r
-    NonTriviallyCopyableVoid<T> setAllocatedSizeInternal (int numElements)\r
-    {\r
-        HeapBlock<ElementType> newElements (numElements);\r
-\r
-        for (int i = 0; i < numUsed; ++i)\r
-        {\r
-            new (newElements + i) ElementType (std::move (elements[i]));\r
-            elements[i].~ElementType();\r
-        }\r
-\r
-        elements = std::move (newElements);\r
-    }\r
-\r
-    //==============================================================================\r
-    ElementType* createInsertSpace (int indexToInsertAt, int numElements)\r
-    {\r
-        ensureAllocatedSize (numUsed + numElements);\r
-\r
-        if (! isPositiveAndBelow (indexToInsertAt, numUsed))\r
-            return elements + numUsed;\r
-\r
-        createInsertSpaceInternal (indexToInsertAt, numElements);\r
-\r
-        return elements + indexToInsertAt;\r
-    }\r
-\r
-    template <typename T = ElementType>\r
-    TriviallyCopyableVoid<T> createInsertSpaceInternal (int indexToInsertAt, int numElements)\r
-    {\r
-        auto* start = elements + indexToInsertAt;\r
-        auto numElementsToShift = numUsed - indexToInsertAt;\r
-        memmove (start + numElements, start, (size_t) numElementsToShift * sizeof (ElementType));\r
-    }\r
-\r
-    template <typename T = ElementType>\r
-    NonTriviallyCopyableVoid<T> createInsertSpaceInternal (int indexToInsertAt, int numElements)\r
-    {\r
-        auto* end = elements + numUsed;\r
-        auto* newEnd = end + numElements;\r
-        auto numElementsToShift = numUsed - indexToInsertAt;\r
-\r
-        for (int i = 0; i < numElementsToShift; ++i)\r
-        {\r
-            new (--newEnd) ElementType (std::move (*(--end)));\r
-            end->~ElementType();\r
-        }\r
-    }\r
-\r
-    //==============================================================================\r
-    template <typename T = ElementType>\r
-    TriviallyCopyableVoid<T> removeElementsInternal (int indexToRemoveAt, int numElementsToRemove)\r
-    {\r
-        auto* start = elements + indexToRemoveAt;\r
-        auto numElementsToShift = numUsed - (indexToRemoveAt + numElementsToRemove);\r
-        memmove (start, start + numElementsToRemove, (size_t) numElementsToShift * sizeof (ElementType));\r
-    }\r
-\r
-    template <typename T = ElementType>\r
-    NonTriviallyCopyableVoid<T> removeElementsInternal (int indexToRemoveAt, int numElementsToRemove)\r
-    {\r
-        auto numElementsToShift = numUsed - (indexToRemoveAt + numElementsToRemove);\r
-        auto* destination = elements + indexToRemoveAt;\r
-        auto* source = destination + numElementsToRemove;\r
-\r
-        for (int i = 0; i < numElementsToShift; ++i)\r
-            moveAssignElement (destination++, std::move (*(source++)));\r
-\r
-        for (int i = 0; i < numElementsToRemove; ++i)\r
-            (destination++)->~ElementType();\r
-    }\r
-\r
-    //==============================================================================\r
-    template <typename T = ElementType>\r
-    TriviallyCopyableVoid<T> moveInternal (int currentIndex, int newIndex) noexcept\r
-    {\r
-        char tempCopy[sizeof (ElementType)];\r
-        memcpy (tempCopy, elements + currentIndex, sizeof (ElementType));\r
-\r
-        if (newIndex > currentIndex)\r
-        {\r
-            memmove (elements + currentIndex,\r
-                     elements + currentIndex + 1,\r
-                     sizeof (ElementType) * (size_t) (newIndex - currentIndex));\r
-        }\r
-        else\r
-        {\r
-            memmove (elements + newIndex + 1,\r
-                     elements + newIndex,\r
-                     sizeof (ElementType) * (size_t) (currentIndex - newIndex));\r
-        }\r
-\r
-        memcpy (elements + newIndex, tempCopy, sizeof (ElementType));\r
-    }\r
-\r
-    template <typename T = ElementType>\r
-    NonTriviallyCopyableVoid<T> moveInternal (int currentIndex, int newIndex) noexcept\r
-    {\r
-        auto* e = elements + currentIndex;\r
-        ElementType tempCopy (std::move (*e));\r
-        auto delta = newIndex - currentIndex;\r
-\r
-        if (delta > 0)\r
-        {\r
-            for (int i = 0; i < delta; ++i)\r
-            {\r
-                moveAssignElement (e, std::move (*(e + 1)));\r
-                ++e;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            for (int i = 0; i < -delta; ++i)\r
-            {\r
-                moveAssignElement (e, std::move (*(e - 1)));\r
-                --e;\r
-            }\r
-        }\r
-\r
-        moveAssignElement (e, std::move (tempCopy));\r
-    }\r
-\r
-    //==============================================================================\r
-    void addAssumingCapacityIsReady (const ElementType& element)   { new (elements + numUsed++) ElementType (element); }\r
-    void addAssumingCapacityIsReady (ElementType&& element)        { new (elements + numUsed++) ElementType (std::move (element)); }\r
-\r
-    template <typename... OtherElements>\r
-    void addAssumingCapacityIsReady (const ElementType& firstNewElement, OtherElements... otherElements)\r
-    {\r
-        addAssumingCapacityIsReady (firstNewElement);\r
-        addAssumingCapacityIsReady (otherElements...);\r
-    }\r
-\r
-    template <typename... OtherElements>\r
-    void addAssumingCapacityIsReady (ElementType&& firstNewElement, OtherElements... otherElements)\r
-    {\r
-        addAssumingCapacityIsReady (std::move (firstNewElement));\r
-        addAssumingCapacityIsReady (otherElements...);\r
-    }\r
-\r
-    //==============================================================================\r
-    template <typename T = ElementType>\r
-    typename std::enable_if<std::is_move_assignable<T>::value, void>::type\r
-    moveAssignElement (ElementType* destination, ElementType&& source)\r
-    {\r
-        *destination = std::move (source);\r
-    }\r
-\r
-    template <typename T = ElementType>\r
-    typename std::enable_if<! std::is_move_assignable<T>::value, void>::type\r
-    moveAssignElement (ElementType* destination, ElementType&& source)\r
-    {\r
-        destination->~ElementType();\r
-        new (destination) ElementType (std::move (source));\r
-    }\r
-\r
-    void checkSourceIsNotAMember (const ElementType* element)\r
-    {\r
-        // when you pass a reference to an existing element into a method like add() which\r
-        // may need to reallocate the array to make more space, the incoming reference may\r
-        // be deleted indirectly during the reallocation operation! To work around this,\r
-        // make a local copy of the item you're trying to add (and maybe use std::move to\r
-        // move it into the add() method to avoid any extra overhead)\r
-        jassert (element < begin() || element >= end());\r
-        ignoreUnused (element);\r
-    }\r
-\r
-    //==============================================================================\r
-    HeapBlock<ElementType> elements;\r
-    int numAllocated = 0, numUsed = 0;\r
-\r
-    template <class OtherElementType, class OtherCriticalSection>\r
-    friend class ArrayBase;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE (ArrayBase)\r
-};\r
-\r
-} // namespace juce\r
index d6bc612cb4431177cf02c7b681e892c748a1a714..d10ae0444fd39c4745c388b9c2b2e3e59a949645 100644 (file)
@@ -354,7 +354,7 @@ public:
     inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return lock; }\r
 \r
     /** Returns the type of scoped lock to use for locking this array */\r
-    using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
+    typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType;\r
 \r
 private:\r
     //==============================================================================\r
@@ -388,7 +388,7 @@ public:
         }\r
         @endcode\r
 \r
-        The order in which items are iterated bears no resemblance to the order in which\r
+        The order in which items are iterated bears no resemblence to the order in which\r
         they were originally added!\r
 \r
         Obviously as soon as you call any non-const methods on the original hash-map, any\r
index e9f0338876a91043d0a8466fec0baa362f9c6e6e..5a10cfe14f06e430dbcff4a67fe7994029546840 100644 (file)
@@ -59,14 +59,7 @@ NamedValueSet::NamedValueSet() noexcept {}
 NamedValueSet::~NamedValueSet() noexcept {}\r
 \r
 NamedValueSet::NamedValueSet (const NamedValueSet& other)  : values (other.values) {}\r
-\r
-NamedValueSet::NamedValueSet (NamedValueSet&& other) noexcept\r
-   : values (static_cast<Array<NamedValue>&&> (other.values)) {}\r
-\r
-NamedValueSet::NamedValueSet (std::initializer_list<NamedValue> list)\r
-   : values (static_cast<std::initializer_list<NamedValue>&&> (list))\r
-{\r
-}\r
+NamedValueSet::NamedValueSet (NamedValueSet&& other) noexcept  : values (static_cast<Array<NamedValue>&&> (other.values)) {}\r
 \r
 NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other)\r
 {\r
index d76651d1ccaeafe8b69685641648fa85f99d895a..49089ec6b6815559b5e79302fc33bf802ea7eb39 100644 (file)
@@ -34,6 +34,23 @@ namespace juce
 class JUCE_API  NamedValueSet\r
 {\r
 public:\r
+    /** Creates an empty set. */\r
+    NamedValueSet() noexcept;\r
+\r
+    NamedValueSet (const NamedValueSet&);\r
+    NamedValueSet (NamedValueSet&&) noexcept;\r
+    NamedValueSet& operator= (const NamedValueSet&);\r
+    NamedValueSet& operator= (NamedValueSet&&) noexcept;\r
+\r
+    /** Destructor. */\r
+    ~NamedValueSet() noexcept;\r
+\r
+    /** Two NamedValueSets are considered equal if they contain all the same key/value\r
+        pairs, regardless of the order.\r
+    */\r
+    bool operator== (const NamedValueSet&) const noexcept;\r
+    bool operator!= (const NamedValueSet&) const noexcept;\r
+\r
     //==============================================================================\r
     /** Structure for a named var object */\r
     struct JUCE_API  NamedValue\r
@@ -56,27 +73,6 @@ public:
         var value;\r
     };\r
 \r
-    //==============================================================================\r
-    /** Creates an empty set. */\r
-    NamedValueSet() noexcept;\r
-\r
-    NamedValueSet (const NamedValueSet&);\r
-    NamedValueSet (NamedValueSet&&) noexcept;\r
-    NamedValueSet& operator= (const NamedValueSet&);\r
-    NamedValueSet& operator= (NamedValueSet&&) noexcept;\r
-\r
-    /** Creates a NamedValueSet from a list of names and properties. */\r
-    NamedValueSet (std::initializer_list<NamedValue>);\r
-\r
-    /** Destructor. */\r
-    ~NamedValueSet() noexcept;\r
-\r
-    /** Two NamedValueSets are considered equal if they contain all the same key/value\r
-        pairs, regardless of the order.\r
-    */\r
-    bool operator== (const NamedValueSet&) const noexcept;\r
-    bool operator!= (const NamedValueSet&) const noexcept;\r
-\r
     const NamedValueSet::NamedValue* begin() const noexcept     { return values.begin(); }\r
     const NamedValueSet::NamedValue* end() const noexcept       { return values.end();   }\r
 \r
@@ -129,8 +125,6 @@ public:
 \r
         Do not use this method unless you really need access to the internal var object\r
         for some reason - for normal reading and writing always prefer operator[]() and set().\r
-        Also note that the pointer returned may become invalid as soon as any subsequent\r
-        methods are called on the NamedValueSet.\r
     */\r
     var* getVarPointer (const Identifier& name) const noexcept;\r
 \r
@@ -141,8 +135,6 @@ public:
 \r
     /** Returns the value of the item at a given index.\r
         The index must be between 0 and size() - 1, or this will return a nullptr\r
-        Also note that the pointer returned may become invalid as soon as any subsequent\r
-        methods are called on the NamedValueSet.\r
     */\r
     var* getVarPointerAt (int index) const noexcept;\r
 \r
diff --git a/modules/juce_core/containers/juce_OwnedArray.cpp b/modules/juce_core/containers/juce_OwnedArray.cpp
deleted file mode 100644 (file)
index acb4027..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-static struct OwnedArrayTest : public UnitTest\r
-{\r
-    OwnedArrayTest() : UnitTest { "OwnedArray" } {}\r
-\r
-    struct Base\r
-    {\r
-        virtual ~Base() = default;\r
-    };\r
-\r
-    struct Derived : Base\r
-    {\r
-    };\r
-\r
-    void runTest() override\r
-    {\r
-        beginTest ("After converting move construction, ownership is transferred");\r
-        {\r
-            OwnedArray<Derived> derived { new Derived{}, new Derived{}, new Derived{} };\r
-\r
-            OwnedArray<Base> base  { std::move (derived) };\r
-\r
-            expectEquals (base.size(), 3);\r
-            expectEquals (derived.size(), 0);\r
-        }\r
-\r
-        beginTest ("After converting move assignment, ownership is transferred");\r
-        {\r
-            OwnedArray<Base> base;\r
-\r
-            base = OwnedArray<Derived> { new Derived{}, new Derived{}, new Derived{} };\r
-\r
-            expectEquals (base.size(), 3);\r
-        }\r
-    }\r
-} ownedArrayTest;\r
-\r
-#endif\r
-\r
-}\r
index 8393b701c315efe77bc39c81005244bf8c1208c9..763db28d8d07547d36c50f968b25a01d5e2e9119 100644 (file)
@@ -52,7 +52,9 @@ class OwnedArray
 public:\r
     //==============================================================================\r
     /** Creates an empty array. */\r
-    OwnedArray() = default;\r
+    OwnedArray() noexcept\r
+    {\r
+    }\r
 \r
     /** Deletes the array and also deletes any objects inside it.\r
 \r
@@ -66,8 +68,10 @@ public:
 \r
     /** Move constructor. */\r
     OwnedArray (OwnedArray&& other) noexcept\r
-        : values (std::move (other.values))\r
+        : data (static_cast<ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data)),\r
+          numUsed (other.numUsed)\r
     {\r
+        other.numUsed = 0;\r
     }\r
 \r
     /** Creates an array from a list of objects. */\r
@@ -81,24 +85,10 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
         deleteAllObjects();\r
-        values = std::move (other.values);\r
-        return *this;\r
-    }\r
 \r
-    /** Converting move constructor. */\r
-    template <class OtherObjectClass, class OtherCriticalSection>\r
-    OwnedArray (OwnedArray<OtherObjectClass, OtherCriticalSection>&& other) noexcept\r
-        : values (std::move (other.values))\r
-    {\r
-    }\r
-\r
-    /** Converting move assignment operator. */\r
-    template <class OtherObjectClass, class OtherCriticalSection>\r
-    OwnedArray& operator= (OwnedArray<OtherObjectClass, OtherCriticalSection>&& other) noexcept\r
-    {\r
-        const ScopedLockType lock (getLock());\r
-        deleteAllObjects();\r
-        values = std::move (other.values);\r
+        data = static_cast<ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data);\r
+        numUsed = other.numUsed;\r
+        other.numUsed = 0;\r
         return *this;\r
     }\r
 \r
@@ -107,8 +97,12 @@ public:
     void clear (bool deleteObjects = true)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        clearQuick (deleteObjects);\r
-        values.setAllocatedSize (0);\r
+\r
+        if (deleteObjects)\r
+            deleteAllObjects();\r
+\r
+        data.setAllocatedSize (0);\r
+        numUsed = 0;\r
     }\r
 \r
     //==============================================================================\r
@@ -119,8 +113,8 @@ public:
 \r
         if (deleteObjects)\r
             deleteAllObjects();\r
-        else\r
-            values.clear();\r
+\r
+        numUsed = 0;\r
     }\r
 \r
     //==============================================================================\r
@@ -129,7 +123,7 @@ public:
     */\r
     inline int size() const noexcept\r
     {\r
-        return values.size();\r
+        return numUsed;\r
     }\r
 \r
     /** Returns true if the array is empty, false otherwise. */\r
@@ -149,7 +143,13 @@ public:
     inline ObjectClass* operator[] (const int index) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getValueWithDefault (index);\r
+        if (isPositiveAndBelow (index, numUsed))\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[index];\r
+        }\r
+\r
+        return nullptr;\r
     }\r
 \r
     /** Returns a pointer to the object at this index in the array, without checking whether the index is in-range.\r
@@ -160,7 +160,8 @@ public:
     inline ObjectClass* getUnchecked (const int index) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values[index];\r
+        jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+        return data.elements[index];\r
     }\r
 \r
     /** Returns a pointer to the first object in the array.\r
@@ -171,7 +172,14 @@ public:
     inline ObjectClass* getFirst() const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getFirst();\r
+\r
+        if (numUsed > 0)\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[0];\r
+        }\r
+\r
+        return nullptr;\r
     }\r
 \r
     /** Returns a pointer to the last object in the array.\r
@@ -182,7 +190,14 @@ public:
     inline ObjectClass* getLast() const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getLast();\r
+\r
+        if (numUsed > 0)\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[numUsed - 1];\r
+        }\r
+\r
+        return nullptr;\r
     }\r
 \r
     /** Returns a pointer to the actual array data.\r
@@ -191,7 +206,7 @@ public:
     */\r
     inline ObjectClass** getRawDataPointer() noexcept\r
     {\r
-        return values.begin();\r
+        return data.elements;\r
     }\r
 \r
     //==============================================================================\r
@@ -200,7 +215,7 @@ public:
     */\r
     inline ObjectClass** begin() const noexcept\r
     {\r
-        return values.begin();\r
+        return data.elements;\r
     }\r
 \r
     /** Returns a pointer to the element which follows the last element in the array.\r
@@ -208,15 +223,12 @@ public:
     */\r
     inline ObjectClass** end() const noexcept\r
     {\r
-        return values.end();\r
-    }\r
+       #if JUCE_DEBUG\r
+        if (data.elements == nullptr || numUsed <= 0) // (to keep static analysers happy)\r
+            return data.elements;\r
+       #endif\r
 \r
-    /** Returns a pointer to the first element in the array.\r
-        This method is provided for compatibility with the standard C++ containers.\r
-    */\r
-    inline ObjectClass** data() const noexcept\r
-    {\r
-        return begin();\r
+        return data.elements + numUsed;\r
     }\r
 \r
     //==============================================================================\r
@@ -228,11 +240,12 @@ public:
     int indexOf (const ObjectClass* objectToLookFor) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto** e = values.begin();\r
+        auto** e = data.elements.get();\r
+        auto** end_ = e + numUsed;\r
 \r
-        for (; e != values.end(); ++e)\r
+        for (; e != end_; ++e)\r
             if (objectToLookFor == *e)\r
-                return static_cast<int> (e - values.begin());\r
+                return static_cast<int> (e - data.elements.get());\r
 \r
         return -1;\r
     }\r
@@ -245,9 +258,10 @@ public:
     bool contains (const ObjectClass* objectToLookFor) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto** e = values.begin();\r
+        auto** e = data.elements.get();\r
+        auto** end_ = e + numUsed;\r
 \r
-        for (; e != values.end(); ++e)\r
+        for (; e != end_; ++e)\r
             if (objectToLookFor == *e)\r
                 return true;\r
 \r
@@ -270,7 +284,9 @@ public:
     ObjectClass* add (ObjectClass* newObject) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.add (newObject);\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        jassert (data.elements != nullptr);\r
+        data.elements[numUsed++] = newObject;\r
         return newObject;\r
     }\r
 \r
@@ -294,8 +310,25 @@ public:
     */\r
     ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject) noexcept\r
     {\r
+        if (indexToInsertAt < 0)\r
+            return add (newObject);\r
+\r
         const ScopedLockType lock (getLock());\r
-        values.insert (indexToInsertAt, newObject, 1);\r
+\r
+        if (indexToInsertAt > numUsed)\r
+            indexToInsertAt = numUsed;\r
+\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        jassert (data.elements != nullptr);\r
+\r
+        auto** e = data.elements + indexToInsertAt;\r
+        auto numToMove = numUsed - indexToInsertAt;\r
+\r
+        if (numToMove > 0)\r
+            memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove);\r
+\r
+        *e = newObject;\r
+        ++numUsed;\r
         return newObject;\r
     }\r
 \r
@@ -318,7 +351,24 @@ public:
         if (numberOfElements > 0)\r
         {\r
             const ScopedLockType lock (getLock());\r
-            values.insertArray (indexToInsertAt, newObjects, numberOfElements);\r
+            data.ensureAllocatedSize (numUsed + numberOfElements);\r
+            auto* insertPos = data.elements.get();\r
+\r
+            if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+            {\r
+                insertPos += indexToInsertAt;\r
+                auto numberToMove = (size_t) (numUsed - indexToInsertAt);\r
+                memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ObjectClass*));\r
+            }\r
+            else\r
+            {\r
+                insertPos += numUsed;\r
+            }\r
+\r
+            numUsed += numberOfElements;\r
+\r
+            while (--numberOfElements >= 0)\r
+                *insertPos++ = *newObjects++;\r
         }\r
     }\r
 \r
@@ -363,21 +413,22 @@ public:
             {\r
                 const ScopedLockType lock (getLock());\r
 \r
-                if (indexToChange < values.size())\r
+                if (indexToChange < numUsed)\r
                 {\r
                     if (deleteOldElement)\r
                     {\r
-                        toDelete.reset (values[indexToChange]);\r
+                        toDelete.reset (data.elements[indexToChange]);\r
 \r
                         if (toDelete.get() == newObject)\r
                             toDelete.release();\r
                     }\r
 \r
-                    values[indexToChange] = newObject;\r
+                    data.elements[indexToChange] = newObject;\r
                 }\r
                 else\r
                 {\r
-                    values.add (newObject);\r
+                    data.ensureAllocatedSize (numUsed + 1);\r
+                    data.elements[numUsed++] = newObject;\r
                 }\r
             }\r
         }\r
@@ -406,7 +457,24 @@ public:
     {\r
         const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock());\r
         const ScopedLockType lock2 (getLock());\r
-        values.addArray (arrayToAddFrom, startIndex, numElementsToAdd);\r
+\r
+        if (startIndex < 0)\r
+        {\r
+            jassertfalse;\r
+            startIndex = 0;\r
+        }\r
+\r
+        if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
+            numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
+\r
+        data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+        jassert (numElementsToAdd <= 0 || data.elements != nullptr);\r
+\r
+        while (--numElementsToAdd >= 0)\r
+        {\r
+            data.elements[numUsed] = arrayToAddFrom.getUnchecked (startIndex++);\r
+            ++numUsed;\r
+        }\r
     }\r
 \r
     /** Adds elements from another array to the end of this array. */\r
@@ -414,7 +482,13 @@ public:
     void addArray (const std::initializer_list<OtherArrayType>& items)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.addArray (items);\r
+        data.ensureAllocatedSize (numUsed + (int) items.size());\r
+\r
+        for (auto* item : items)\r
+        {\r
+            data.elements[numUsed] = item;\r
+            ++numUsed;\r
+        }\r
     }\r
 \r
     /** Adds copies of the elements in another array to the end of this array.\r
@@ -448,11 +522,11 @@ public:
         if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
             numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
 \r
-        jassert (numElementsToAdd >= 0);\r
-        values.ensureAllocatedSize (values.size() + numElementsToAdd);\r
+        data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+        jassert (numElementsToAdd <= 0 || data.elements != nullptr);\r
 \r
         while (--numElementsToAdd >= 0)\r
-            values.add (createCopyIfNotNull (arrayToAddFrom.getUnchecked (startIndex++)));\r
+            data.elements[numUsed++] = createCopyIfNotNull (arrayToAddFrom.getUnchecked (startIndex++));\r
     }\r
 \r
     /** Inserts a new object into the array assuming that the array is sorted.\r
@@ -470,12 +544,10 @@ public:
     template <class ElementComparator>\r
     int addSorted (ElementComparator& comparator, ObjectClass* const newObject) noexcept\r
     {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
-\r
+        ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
+                                   // avoids getting warning messages about the parameter being unused\r
         const ScopedLockType lock (getLock());\r
-        const int index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+        const int index = findInsertIndexInSortedArray (comparator, data.elements.get(), newObject, 0, numUsed);\r
         insert (index, newObject);\r
         return index;\r
     }\r
@@ -495,16 +567,13 @@ public:
     template <typename ElementComparator>\r
     int indexOfSorted (ElementComparator& comparator, const ObjectClass* const objectToLookFor) const noexcept\r
     {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
         ignoreUnused (comparator);\r
-\r
         const ScopedLockType lock (getLock());\r
-        int s = 0, e = values.size();\r
+        int s = 0, e = numUsed;\r
 \r
         while (s < e)\r
         {\r
-            if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
+            if (comparator.compareElements (objectToLookFor, data.elements[s]) == 0)\r
                 return s;\r
 \r
             auto halfway = (s + e) / 2;\r
@@ -512,7 +581,7 @@ public:
             if (halfway == s)\r
                 break;\r
 \r
-            if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
+            if (comparator.compareElements (objectToLookFor, data.elements[halfway]) >= 0)\r
                 s = halfway;\r
             else\r
                 e = halfway;\r
@@ -539,18 +608,22 @@ public:
         {\r
             const ScopedLockType lock (getLock());\r
 \r
-            if (isPositiveAndBelow (indexToRemove, values.size()))\r
+            if (isPositiveAndBelow (indexToRemove, numUsed))\r
             {\r
-                auto** e = values.begin() + indexToRemove;\r
+                auto** e = data.elements + indexToRemove;\r
 \r
                 if (deleteObject)\r
                     toDelete.reset (*e);\r
 \r
-                values.removeElements (indexToRemove, 1);\r
+                --numUsed;\r
+                auto numToShift = numUsed - indexToRemove;\r
+\r
+                if (numToShift > 0)\r
+                    memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift);\r
             }\r
         }\r
 \r
-        if ((values.size() << 1) < values.capacity())\r
+        if ((numUsed << 1) < data.numAllocated)\r
             minimiseStorageOverheads();\r
     }\r
 \r
@@ -568,13 +641,18 @@ public:
         ObjectClass* removedItem = nullptr;\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (isPositiveAndBelow (indexToRemove, values.size()))\r
+        if (isPositiveAndBelow (indexToRemove, numUsed))\r
         {\r
-           removedItem = values[indexToRemove];\r
+            auto** e = data.elements + indexToRemove;\r
+            removedItem = *e;\r
 \r
-            values.removeElements (indexToRemove, 1);\r
+            --numUsed;\r
+            const int numToShift = numUsed - indexToRemove;\r
 \r
-            if ((values.size() << 1) < values.capacity())\r
+            if (numToShift > 0)\r
+                memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift);\r
+\r
+            if ((numUsed << 1) < data.numAllocated)\r
                 minimiseStorageOverheads();\r
         }\r
 \r
@@ -592,10 +670,11 @@ public:
     void removeObject (const ObjectClass* objectToRemove, bool deleteObject = true)\r
     {\r
         const ScopedLockType lock (getLock());\r
+        auto** e = data.elements.get();\r
 \r
-        for (int i = 0; i < values.size(); ++i)\r
+        for (int i = 0; i < numUsed; ++i)\r
         {\r
-            if (objectToRemove == values[i])\r
+            if (objectToRemove == e[i])\r
             {\r
                 remove (i, deleteObject);\r
                 break;\r
@@ -619,24 +698,32 @@ public:
     void removeRange (int startIndex, int numberToRemove, bool deleteObjects = true)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);\r
-        startIndex = jlimit (0, values.size(), startIndex);\r
-        numberToRemove = endIndex - startIndex;\r
+        auto endIndex = jlimit (0, numUsed, startIndex + numberToRemove);\r
+        startIndex = jlimit (0, numUsed, startIndex);\r
 \r
-        if (numberToRemove > 0)\r
+        if (endIndex > startIndex)\r
         {\r
             if (deleteObjects)\r
             {\r
                 for (int i = startIndex; i < endIndex; ++i)\r
                 {\r
-                    ContainerDeletePolicy<ObjectClass>::destroy (values[i]);\r
-                    values[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
+                    ContainerDeletePolicy<ObjectClass>::destroy (data.elements[i]);\r
+                    data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
                 }\r
             }\r
 \r
-            values.removeElements (startIndex, numberToRemove);\r
+            auto rangeSize = endIndex - startIndex;\r
+            auto** e = data.elements + startIndex;\r
+            auto numToShift = numUsed - endIndex;\r
+            numUsed -= rangeSize;\r
+\r
+            while (--numToShift >= 0)\r
+            {\r
+                *e = e[rangeSize];\r
+                ++e;\r
+            }\r
 \r
-            if ((values.size() << 1) < values.capacity())\r
+            if ((numUsed << 1) < data.numAllocated)\r
                 minimiseStorageOverheads();\r
         }\r
     }\r
@@ -652,10 +739,10 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (howManyToRemove >= values.size())\r
+        if (howManyToRemove >= numUsed)\r
             clear (deleteObjects);\r
         else\r
-            removeRange (values.size() - howManyToRemove, howManyToRemove, deleteObjects);\r
+            removeRange (numUsed - howManyToRemove, howManyToRemove, deleteObjects);\r
     }\r
 \r
     /** Swaps a pair of objects in the array.\r
@@ -663,10 +750,17 @@ public:
         If either of the indexes passed in is out-of-range, nothing will happen,\r
         otherwise the two objects at these positions will be exchanged.\r
     */\r
-    void swap (int index1, int index2) noexcept\r
+    void swap (int index1,\r
+               int index2) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.swap (index1, index2);\r
+\r
+        if (isPositiveAndBelow (index1, numUsed)\r
+             && isPositiveAndBelow (index2, numUsed))\r
+        {\r
+            std::swap (data.elements[index1],\r
+                       data.elements[index2]);\r
+        }\r
     }\r
 \r
     /** Moves one of the objects to a different position.\r
@@ -687,7 +781,29 @@ public:
         if (currentIndex != newIndex)\r
         {\r
             const ScopedLockType lock (getLock());\r
-            values.move (currentIndex, newIndex);\r
+\r
+            if (isPositiveAndBelow (currentIndex, numUsed))\r
+            {\r
+                if (! isPositiveAndBelow (newIndex, numUsed))\r
+                    newIndex = numUsed - 1;\r
+\r
+                auto* value = data.elements[currentIndex];\r
+\r
+                if (newIndex > currentIndex)\r
+                {\r
+                    memmove (data.elements + currentIndex,\r
+                             data.elements + currentIndex + 1,\r
+                             sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex));\r
+                }\r
+                else\r
+                {\r
+                    memmove (data.elements + newIndex + 1,\r
+                             data.elements + newIndex,\r
+                             sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex));\r
+                }\r
+\r
+                data.elements[newIndex] = value;\r
+            }\r
         }\r
     }\r
 \r
@@ -701,7 +817,8 @@ public:
     {\r
         const ScopedLockType lock1 (getLock());\r
         const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());\r
-        values.swapWith (otherArray.values);\r
+        data.swapWith (otherArray.data);\r
+        std::swap (numUsed, otherArray.numUsed);\r
     }\r
 \r
     //==============================================================================\r
@@ -714,7 +831,7 @@ public:
     void minimiseStorageOverheads() noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.shrinkToNoMoreThan (values.size());\r
+        data.shrinkToNoMoreThan (numUsed);\r
     }\r
 \r
     /** Increases the array's internal storage to hold a minimum number of elements.\r
@@ -726,7 +843,7 @@ public:
     void ensureStorageAllocated (const int minNumElements) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.ensureAllocatedSize (minNumElements);\r
+        data.ensureAllocatedSize (minNumElements);\r
     }\r
 \r
     //==============================================================================\r
@@ -759,14 +876,13 @@ public:
     void sort (ElementComparator& comparator,\r
                bool retainOrderOfEquivalentItems = false) const noexcept\r
     {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
+        ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
+                                   // avoids getting warning messages about the parameter being unused\r
 \r
         const ScopedLockType lock (getLock());\r
 \r
         if (size() > 1)\r
-            sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
+            sortArray (comparator, data.elements.get(), 0, size() - 1, retainOrderOfEquivalentItems);\r
     }\r
 \r
     //==============================================================================\r
@@ -774,11 +890,12 @@ public:
         To lock, you can call getLock().enter() and getLock().exit(), or preferably use\r
         an object of ScopedLockType as an RAII lock for it.\r
     */\r
-    inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return values; }\r
+    inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return data; }\r
 \r
     /** Returns the type of scoped lock to use for locking this array */\r
     using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
 \r
+\r
     //==============================================================================\r
    #ifndef DOXYGEN\r
     // Note that the swapWithArray method has been replaced by a more flexible templated version,\r
@@ -788,19 +905,15 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    ArrayBase <ObjectClass*, TypeOfCriticalSectionToUse> values;\r
+    ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse> data;\r
+    int numUsed = 0;\r
 \r
     void deleteAllObjects()\r
     {\r
-        for (auto& e : values)\r
-            ContainerDeletePolicy<ObjectClass>::destroy (e);\r
-\r
-        values.clear();\r
+        while (numUsed > 0)\r
+            ContainerDeletePolicy<ObjectClass>::destroy (data.elements[--numUsed]);\r
     }\r
 \r
-    template <class OtherObjectClass, class OtherCriticalSection>\r
-    friend class OwnedArray;\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray)\r
 };\r
 \r
diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.cpp b/modules/juce_core/containers/juce_ReferenceCountedArray.cpp
deleted file mode 100644 (file)
index 15d380f..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2018 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-class ReferenceCountedArrayTests   : public UnitTest\r
-{\r
-public:\r
-    ReferenceCountedArrayTests() : UnitTest ("ReferenceCountedArray", "Containers") {}\r
-\r
-    //==============================================================================\r
-    void runTest() override\r
-    {\r
-        beginTest ("Add derived objects");\r
-        {\r
-            ReferenceCountedArray<TestDerivedObj> derivedArray;\r
-            derivedArray.add (static_cast<TestDerivedObj*> (new TestBaseObj()));\r
-            expectEquals (derivedArray.size(), 1);\r
-            expectEquals (derivedArray.getObjectPointer (0)->getReferenceCount(), 1);\r
-            expectEquals (derivedArray[0]->getReferenceCount(), 2);\r
-\r
-            for (auto o : derivedArray)\r
-                expectEquals (o->getReferenceCount(), 1);\r
-\r
-            ReferenceCountedArray<TestBaseObj> baseArray;\r
-            baseArray.addArray (derivedArray);\r
-\r
-            for (auto o : baseArray)\r
-                expectEquals (o->getReferenceCount(), 2);\r
-\r
-            derivedArray.clearQuick();\r
-            baseArray.clearQuick();\r
-\r
-            auto* baseObject = new TestBaseObj();\r
-            TestBaseObj::Ptr baseObjectPtr = baseObject;\r
-            expectEquals (baseObject->getReferenceCount(), 1);\r
-\r
-            auto* derivedObject = new TestDerivedObj();\r
-            TestDerivedObj::Ptr derivedObjectPtr = derivedObject;\r
-            expectEquals (derivedObject->getReferenceCount(), 1);\r
-\r
-            baseArray.add (baseObject);\r
-            baseArray.add (derivedObject);\r
-\r
-            for (auto o : baseArray)\r
-                expectEquals (o->getReferenceCount(), 2);\r
-\r
-            expectEquals (baseObject->getReferenceCount(),    2);\r
-            expectEquals (derivedObject->getReferenceCount(), 2);\r
-\r
-            derivedArray.add (derivedObject);\r
-\r
-            for (auto o : derivedArray)\r
-                expectEquals (o->getReferenceCount(), 3);\r
-\r
-            derivedArray.clearQuick();\r
-            baseArray.clearQuick();\r
-\r
-            expectEquals (baseObject->getReferenceCount(),    1);\r
-            expectEquals (derivedObject->getReferenceCount(), 1);\r
-\r
-            baseArray.add (baseObjectPtr);\r
-\r
-           #if JUCE_STRICT_REFCOUNTEDPOINTER\r
-            baseArray.add (derivedObjectPtr);\r
-           #else\r
-            baseArray.add (derivedObjectPtr.get());\r
-           #endif\r
-\r
-            for (auto o : baseArray)\r
-                expectEquals (o->getReferenceCount(), 2);\r
-\r
-            derivedArray.add (derivedObjectPtr);\r
-\r
-            for (auto o : derivedArray)\r
-                expectEquals (o->getReferenceCount(), 3);\r
-        }\r
-    }\r
-\r
-private:\r
-    struct TestBaseObj : public ReferenceCountedObject\r
-    {\r
-        using Ptr = ReferenceCountedObjectPtr<TestBaseObj>;\r
-\r
-        TestBaseObj() = default;\r
-    };\r
-\r
-    struct TestDerivedObj : public TestBaseObj\r
-    {\r
-        using Ptr = ReferenceCountedObjectPtr<TestDerivedObj>;\r
-\r
-        TestDerivedObj() = default;\r
-    };\r
-};\r
-\r
-static ReferenceCountedArrayTests referenceCountedArrayTests;\r
-\r
-#endif\r
-\r
-} // namespace juce\r
index db9eded81a097ff563c55ab44d04ab35e5fb3719..6505078ea1ff44b8fbf8c756eb9a561420204e02 100644 (file)
@@ -56,13 +56,17 @@ public:
     /** Creates an empty array.\r
         @see ReferenceCountedObject, Array, OwnedArray\r
     */\r
-    ReferenceCountedArray() = default;\r
+    ReferenceCountedArray() noexcept\r
+    {\r
+    }\r
 \r
     /** Creates a copy of another array */\r
     ReferenceCountedArray (const ReferenceCountedArray& other) noexcept\r
     {\r
         const ScopedLockType lock (other.getLock());\r
-        values.addArray (other.begin(), other.size());\r
+        numUsed = other.numUsed;\r
+        data.setAllocatedSize (numUsed);\r
+        memcpy (data.elements, other.getRawDataPointer(), (size_t) numUsed * sizeof (ObjectClass*));\r
 \r
         for (auto* o : *this)\r
             if (o != nullptr)\r
@@ -71,8 +75,10 @@ public:
 \r
     /** Moves from another array */\r
     ReferenceCountedArray (ReferenceCountedArray&& other) noexcept\r
-        : values (std::move (other.values))\r
+        : data (static_cast<ArrayAllocationBase<ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data)),\r
+          numUsed (other.numUsed)\r
     {\r
+        other.numUsed = 0;\r
     }\r
 \r
     /** Creates a copy of another array */\r
@@ -80,7 +86,9 @@ public:
     ReferenceCountedArray (const ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>& other) noexcept\r
     {\r
         const typename ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>::ScopedLockType lock (other.getLock());\r
-        values.addArray (other.begin(), other.size());\r
+        numUsed = other.size();\r
+        data.setAllocatedSize (numUsed);\r
+        memcpy (data.elements, other.getRawDataPointer(), (size_t) numUsed * sizeof (ObjectClass*));\r
 \r
         for (auto* o : *this)\r
             if (o != nullptr)\r
@@ -113,7 +121,9 @@ public:
     ReferenceCountedArray& operator= (ReferenceCountedArray&& other) noexcept\r
     {\r
         releaseAllObjects();\r
-        values = std::move (other.values);\r
+        data = static_cast<ArrayAllocationBase<ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data);\r
+        numUsed = other.numUsed;\r
+        other.numUsed = 0;\r
         return *this;\r
     }\r
 \r
@@ -127,13 +137,13 @@ public:
 \r
     //==============================================================================\r
     /** Removes all objects from the array.\r
-        Any objects in the array whose reference counts drop to zero will be deleted.\r
+        Any objects in the array that whose reference counts drop to zero will be deleted.\r
     */\r
     void clear()\r
     {\r
         const ScopedLockType lock (getLock());\r
-        clearQuick();\r
-        values.setAllocatedSize (0);\r
+        releaseAllObjects();\r
+        data.setAllocatedSize (0);\r
     }\r
 \r
     /** Removes all objects from the array without freeing the array's allocated storage.\r
@@ -149,13 +159,13 @@ public:
     /** Returns the current number of objects in the array. */\r
     inline int size() const noexcept\r
     {\r
-        return values.size();\r
+        return numUsed;\r
     }\r
 \r
     /** Returns true if the array is empty, false otherwise. */\r
     inline bool isEmpty() const noexcept\r
     {\r
-        return size() == 0;\r
+        return numUsed == 0;\r
     }\r
 \r
     /** Returns a pointer to the object at this index in the array.\r
@@ -168,7 +178,7 @@ public:
     */\r
     inline ObjectClassPtr operator[] (int index) const noexcept\r
     {\r
-        return ObjectClassPtr (getObjectPointer (index));\r
+        return getObjectPointer (index);\r
     }\r
 \r
     /** Returns a pointer to the object at this index in the array, without checking\r
@@ -179,7 +189,7 @@ public:
     */\r
     inline ObjectClassPtr getUnchecked (int index) const noexcept\r
     {\r
-        return ObjectClassPtr (getObjectPointerUnchecked (index));\r
+        return getObjectPointerUnchecked (index);\r
     }\r
 \r
     /** Returns a raw pointer to the object at this index in the array.\r
@@ -193,16 +203,24 @@ public:
     inline ObjectClass* getObjectPointer (int index) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getValueWithDefault (index);\r
+\r
+        if (isPositiveAndBelow (index, numUsed))\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[index];\r
+        }\r
+\r
+        return {};\r
     }\r
 \r
     /** Returns a raw pointer to the object at this index in the array, without checking\r
         whether the index is in-range.\r
     */\r
-    inline ObjectClass* getObjectPointerUnchecked (int index) const noexcept\r
+    inline ObjectClass* getObjectPointerUnchecked (const int index) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values[index];\r
+        jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+        return data.elements[index];\r
     }\r
 \r
     /** Returns a pointer to the first object in the array.\r
@@ -213,7 +231,14 @@ public:
     inline ObjectClassPtr getFirst() const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getFirst();\r
+\r
+        if (numUsed > 0)\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[0];\r
+        }\r
+\r
+        return {};\r
     }\r
 \r
     /** Returns a pointer to the last object in the array.\r
@@ -224,7 +249,14 @@ public:
     inline ObjectClassPtr getLast() const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        return values.getLast();\r
+\r
+        if (numUsed > 0)\r
+        {\r
+            jassert (data.elements != nullptr);\r
+            return data.elements[numUsed - 1];\r
+        }\r
+\r
+        return {};\r
     }\r
 \r
     /** Returns a pointer to the actual array data.\r
@@ -233,7 +265,7 @@ public:
     */\r
     inline ObjectClass** getRawDataPointer() const noexcept\r
     {\r
-        return values.begin();\r
+        return data.elements;\r
     }\r
 \r
     //==============================================================================\r
@@ -242,7 +274,7 @@ public:
     */\r
     inline ObjectClass** begin() const noexcept\r
     {\r
-        return values.begin();\r
+        return data.elements;\r
     }\r
 \r
     /** Returns a pointer to the element which follows the last element in the array.\r
@@ -250,15 +282,7 @@ public:
     */\r
     inline ObjectClass** end() const noexcept\r
     {\r
-        return values.end();\r
-    }\r
-\r
-    /** Returns a pointer to the first element in the array.\r
-        This method is provided for compatibility with the standard C++ containers.\r
-    */\r
-    inline ObjectClass** data() const noexcept\r
-    {\r
-        return begin();\r
+        return data.elements + numUsed;\r
     }\r
 \r
     //==============================================================================\r
@@ -270,13 +294,13 @@ public:
     int indexOf (const ObjectClass* objectToLookFor) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto** e = values.begin();\r
-        auto** endPointer = values.end();\r
+        auto** e = data.elements.get();\r
+        auto** endPointer = e + numUsed;\r
 \r
         while (e != endPointer)\r
         {\r
             if (objectToLookFor == *e)\r
-                return static_cast<int> (e - values.begin());\r
+                return static_cast<int> (e - data.elements.get());\r
 \r
             ++e;\r
         }\r
@@ -284,13 +308,6 @@ public:
         return -1;\r
     }\r
 \r
-    /** Finds the index of the first occurrence of an object in the array.\r
-\r
-        @param objectToLookFor    the object to look for\r
-        @returns                  the index at which the object was found, or -1 if it's not found\r
-    */\r
-    int indexOf (const ObjectClassPtr& objectToLookFor) const noexcept      { return indexOf (objectToLookFor.get()); }\r
-\r
     /** Returns true if the array contains a specified object.\r
 \r
         @param objectToLookFor      the object to look for\r
@@ -299,8 +316,8 @@ public:
     bool contains (const ObjectClass* objectToLookFor) const noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto** e = values.begin();\r
-        auto** endPointer = values.end();\r
+        auto** e = data.elements.get();\r
+        auto** endPointer = e + numUsed;\r
 \r
         while (e != endPointer)\r
         {\r
@@ -313,13 +330,6 @@ public:
         return false;\r
     }\r
 \r
-    /** Returns true if the array contains a specified object.\r
-\r
-        @param objectToLookFor      the object to look for\r
-        @returns                    true if the object is in the array\r
-    */\r
-    bool contains (const ObjectClassPtr& objectToLookFor) const noexcept    { return contains (objectToLookFor.get()); }\r
-\r
     /** Appends a new object to the end of the array.\r
 \r
         This will increase the new object's reference count.\r
@@ -327,10 +337,12 @@ public:
         @param newObject       the new object to add to the array\r
         @see set, insert, addIfNotAlreadyThere, addSorted, addArray\r
     */\r
-    ObjectClass* add (ObjectClass* newObject)\r
+    ObjectClass* add (ObjectClass* newObject) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.add (newObject);\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        jassert (data.elements != nullptr);\r
+        data.elements[numUsed++] = newObject;\r
 \r
         if (newObject != nullptr)\r
             newObject->incReferenceCount();\r
@@ -338,15 +350,6 @@ public:
         return newObject;\r
     }\r
 \r
-    /** Appends a new object to the end of the array.\r
-\r
-        This will increase the new object's reference count.\r
-\r
-        @param newObject       the new object to add to the array\r
-        @see set, insert, addIfNotAlreadyThere, addSorted, addArray\r
-    */\r
-    ObjectClass* add (const ObjectClassPtr& newObject)          { return add (newObject.get()); }\r
-\r
     /** Inserts a new object into the array at the given index.\r
 \r
         If the index is less than 0 or greater than the size of the array, the\r
@@ -360,30 +363,33 @@ public:
         @param newObject            the new object to add to the array\r
         @see add, addSorted, addIfNotAlreadyThere, set\r
     */\r
-    ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject)\r
+    ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject) noexcept\r
     {\r
-        values.insert (indexToInsertAt, newObject, 1);\r
+        if (indexToInsertAt < 0)\r
+            return add (newObject);\r
 \r
-        if (newObject != nullptr)\r
-            newObject->incReferenceCount();\r
+        const ScopedLockType lock (getLock());\r
 \r
-        return newObject;\r
-    }\r
+        if (indexToInsertAt > numUsed)\r
+            indexToInsertAt = numUsed;\r
 \r
-    /** Inserts a new object into the array at the given index.\r
+        data.ensureAllocatedSize (numUsed + 1);\r
+        jassert (data.elements != nullptr);\r
 \r
-        If the index is less than 0 or greater than the size of the array, the\r
-        element will be added to the end of the array.\r
-        Otherwise, it will be inserted into the array, moving all the later elements\r
-        along to make room.\r
+        auto** e = data.elements + indexToInsertAt;\r
+        auto numToMove = numUsed - indexToInsertAt;\r
 \r
-        This will increase the new object's reference count.\r
+        if (numToMove > 0)\r
+            memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove);\r
 \r
-        @param indexToInsertAt      the index at which the new element should be inserted\r
-        @param newObject            the new object to add to the array\r
-        @see add, addSorted, addIfNotAlreadyThere, set\r
-    */\r
-    ObjectClass* insert (int indexToInsertAt, const ObjectClassPtr& newObject)      { return insert (indexToInsertAt, newObject.get()); }\r
+        *e = newObject;\r
+\r
+        if (newObject != nullptr)\r
+            newObject->incReferenceCount();\r
+\r
+        ++numUsed;\r
+        return newObject;\r
+    }\r
 \r
     /** Appends a new object at the end of the array as long as the array doesn't\r
         already contain it.\r
@@ -393,7 +399,7 @@ public:
         @param newObject   the new object to add to the array\r
         @returns           true if the object has been added, false otherwise\r
     */\r
-    bool addIfNotAlreadyThere (ObjectClass* newObject)\r
+    bool addIfNotAlreadyThere (ObjectClass* newObject) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
 \r
@@ -404,16 +410,6 @@ public:
         return true;\r
     }\r
 \r
-    /** Appends a new object at the end of the array as long as the array doesn't\r
-        already contain it.\r
-\r
-        If the array already contains a matching object, nothing will be done.\r
-\r
-        @param newObject   the new object to add to the array\r
-        @returns           true if the object has been added, false otherwise\r
-    */\r
-    bool addIfNotAlreadyThere (const ObjectClassPtr& newObject)         { return addIfNotAlreadyThere (newObject.get()); }\r
-\r
     /** Replaces an object in the array with a different one.\r
 \r
         If the index is less than zero, this method does nothing.\r
@@ -435,14 +431,16 @@ public:
             if (newObject != nullptr)\r
                 newObject->incReferenceCount();\r
 \r
-            if (indexToChange < values.size())\r
+            if (indexToChange < numUsed)\r
             {\r
-                releaseObject (values[indexToChange]);\r
-                values[indexToChange] = newObject;\r
+                releaseObject (data.elements[indexToChange]);\r
+                data.elements[indexToChange] = newObject;\r
             }\r
             else\r
             {\r
-                values.add (newObject);\r
+                data.ensureAllocatedSize (numUsed + 1);\r
+                jassert (data.elements != nullptr);\r
+                data.elements[numUsed++] = newObject;\r
             }\r
         }\r
     }\r
@@ -465,11 +463,22 @@ public:
         {\r
             const ScopedLockType lock2 (getLock());\r
 \r
-            auto numElementsAdded = values.addArray (arrayToAddFrom.values, startIndex, numElementsToAdd);\r
-            auto** e = values.end();\r
+            if (startIndex < 0)\r
+            {\r
+                jassertfalse;\r
+                startIndex = 0;\r
+            }\r
+\r
+            if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
+                numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
 \r
-            for (int i = 0; i < numElementsAdded; ++i)\r
-                (*(--e))->incReferenceCount();\r
+            if (numElementsToAdd > 0)\r
+            {\r
+                data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+\r
+                while (--numElementsToAdd >= 0)\r
+                    add (arrayToAddFrom.getUnchecked (startIndex++));\r
+            }\r
         }\r
     }\r
 \r
@@ -489,7 +498,7 @@ public:
     int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+        auto index = findInsertIndexInSortedArray (comparator, data.elements.get(), newObject, 0, numUsed);\r
         insert (index, newObject);\r
         return index;\r
     }\r
@@ -503,9 +512,9 @@ public:
     void addOrReplaceSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+        auto index = findInsertIndexInSortedArray (comparator, data.elements.get(), newObject, 0, numUsed);\r
 \r
-        if (index > 0 && comparator.compareElements (newObject, values[index - 1]) == 0)\r
+        if (index > 0 && comparator.compareElements (newObject, data.elements[index - 1]) == 0)\r
             set (index - 1, newObject); // replace an existing object that matches\r
         else\r
             insert (index, newObject);  // no match, so insert the new one\r
@@ -529,11 +538,11 @@ public:
     {\r
         ignoreUnused (comparator);\r
         const ScopedLockType lock (getLock());\r
-        int s = 0, e = values.size();\r
+        int s = 0, e = numUsed;\r
 \r
         while (s < e)\r
         {\r
-            if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
+            if (comparator.compareElements (objectToLookFor, data.elements[s]) == 0)\r
                 return s;\r
 \r
             auto halfway = (s + e) / 2;\r
@@ -541,7 +550,7 @@ public:
             if (halfway == s)\r
                 break;\r
 \r
-            if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
+            if (comparator.compareElements (objectToLookFor, data.elements[halfway]) >= 0)\r
                 s = halfway;\r
             else\r
                 e = halfway;\r
@@ -568,13 +577,17 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (isPositiveAndBelow (indexToRemove, values.size()))\r
+        if (isPositiveAndBelow (indexToRemove, numUsed))\r
         {\r
-            auto** e = values.begin() + indexToRemove;\r
+            auto** e = data.elements + indexToRemove;\r
             releaseObject (*e);\r
-            values.removeElements (indexToRemove, 1);\r
+            --numUsed;\r
+            auto numberToShift = numUsed - indexToRemove;\r
 \r
-            if ((values.size() << 1) < values.capacity())\r
+            if (numberToShift > 0)\r
+                memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift);\r
+\r
+            if ((numUsed << 1) < data.numAllocated)\r
                 minimiseStorageOverheads();\r
         }\r
     }\r
@@ -593,14 +606,18 @@ public:
         ObjectClassPtr removedItem;\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (isPositiveAndBelow (indexToRemove, values.size()))\r
+        if (isPositiveAndBelow (indexToRemove, numUsed))\r
         {\r
-            auto** e = values.begin() + indexToRemove;\r
+            auto** e = data.elements + indexToRemove;\r
             removedItem = *e;\r
             releaseObject (*e);\r
-            values.removeElements (indexToRemove, 1);\r
+            --numUsed;\r
+            auto numberToShift = numUsed - indexToRemove;\r
+\r
+            if (numberToShift > 0)\r
+                memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift);\r
 \r
-            if ((values.size() << 1) < values.capacity())\r
+            if ((numUsed << 1) < data.numAllocated)\r
                 minimiseStorageOverheads();\r
         }\r
 \r
@@ -621,16 +638,6 @@ public:
         remove (indexOf (objectToRemove));\r
     }\r
 \r
-    /** Removes the first occurrence of a specified object from the array.\r
-\r
-        If the item isn't found, no action is taken. If it is found, it is\r
-        removed and has its reference count decreased.\r
-\r
-        @param objectToRemove   the object to try to remove\r
-        @see remove, removeRange\r
-    */\r
-    void removeObject (const ObjectClassPtr& objectToRemove)    { removeObject (objectToRemove.get()); }\r
-\r
     /** Removes a range of objects from the array.\r
 \r
         This will remove a set of objects, starting from the given index,\r
@@ -650,21 +657,30 @@ public:
                       int numberToRemove)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        startIndex    = jlimit (0, values.size(), startIndex);\r
-        auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);\r
-        numberToRemove = endIndex - startIndex;\r
 \r
-        if (numberToRemove > 0)\r
+        auto start    = jlimit (0, numUsed, startIndex);\r
+        auto endIndex = jlimit (0, numUsed, startIndex + numberToRemove);\r
+\r
+        if (endIndex > start)\r
         {\r
-            for (int i = startIndex; i < endIndex; ++i)\r
+            for (int i = start; i < endIndex; ++i)\r
             {\r
-                releaseObject (values[i]);\r
-                values[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
+                releaseObject (data.elements[i]);\r
+                data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
             }\r
 \r
-            values.removeElements (startIndex, numberToRemove);\r
+            auto rangeSize = endIndex - start;\r
+            auto** e = data.elements + start;\r
+            int i = numUsed - endIndex;\r
+            numUsed -= rangeSize;\r
 \r
-            if ((values.size() << 1) < values.capacity())\r
+            while (--i >= 0)\r
+            {\r
+                *e = e[rangeSize];\r
+                ++e;\r
+            }\r
+\r
+            if ((numUsed << 1) < data.numAllocated)\r
                 minimiseStorageOverheads();\r
         }\r
     }\r
@@ -681,11 +697,11 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (howManyToRemove > values.size())\r
-            howManyToRemove = values.size();\r
+        if (howManyToRemove > numUsed)\r
+            howManyToRemove = numUsed;\r
 \r
         while (--howManyToRemove >= 0)\r
-            remove (values.size() - 1);\r
+            remove (numUsed - 1);\r
     }\r
 \r
     /** Swaps a pair of objects in the array.\r
@@ -697,10 +713,11 @@ public:
     {\r
         const ScopedLockType lock (getLock());\r
 \r
-        if (isPositiveAndBelow (index1, values.size())\r
-         && isPositiveAndBelow (index2, values.size()))\r
+        if (isPositiveAndBelow (index1, numUsed)\r
+             && isPositiveAndBelow (index2, numUsed))\r
         {\r
-            std::swap (values[index1], values[index2]);\r
+            std::swap (data.elements[index1],\r
+                       data.elements[index2]);\r
         }\r
     }\r
 \r
@@ -722,7 +739,29 @@ public:
         if (currentIndex != newIndex)\r
         {\r
             const ScopedLockType lock (getLock());\r
-            values.move (currentIndex, newIndex);\r
+\r
+            if (isPositiveAndBelow (currentIndex, numUsed))\r
+            {\r
+                if (! isPositiveAndBelow (newIndex, numUsed))\r
+                    newIndex = numUsed - 1;\r
+\r
+                auto* value = data.elements[currentIndex];\r
+\r
+                if (newIndex > currentIndex)\r
+                {\r
+                    memmove (data.elements + currentIndex,\r
+                             data.elements + currentIndex + 1,\r
+                             sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex));\r
+                }\r
+                else\r
+                {\r
+                    memmove (data.elements + newIndex + 1,\r
+                             data.elements + newIndex,\r
+                             sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex));\r
+                }\r
+\r
+                data.elements[newIndex] = value;\r
+            }\r
         }\r
     }\r
 \r
@@ -737,7 +776,8 @@ public:
     {\r
         const ScopedLockType lock1 (getLock());\r
         const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());\r
-        values.swapWith (otherArray.values);\r
+        data.swapWith (otherArray.data);\r
+        std::swap (numUsed, otherArray.numUsed);\r
     }\r
 \r
     //==============================================================================\r
@@ -749,7 +789,15 @@ public:
     {\r
         const ScopedLockType lock2 (other.getLock());\r
         const ScopedLockType lock1 (getLock());\r
-        return values == other.values;\r
+\r
+        if (numUsed != other.numUsed)\r
+            return false;\r
+\r
+        for (int i = numUsed; --i >= 0;)\r
+            if (data.elements[i] != other.data.elements[i])\r
+                return false;\r
+\r
+        return true;\r
     }\r
 \r
     /** Compares this array to another one.\r
@@ -792,12 +840,11 @@ public:
     void sort (ElementComparator& comparator,\r
                bool retainOrderOfEquivalentItems = false) const noexcept\r
     {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
+        ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
+                                   // avoids getting warning messages about the parameter being unused\r
 \r
         const ScopedLockType lock (getLock());\r
-        sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems);\r
+        sortArray (comparator, data.elements.get(), 0, size() - 1, retainOrderOfEquivalentItems);\r
     }\r
 \r
     //==============================================================================\r
@@ -810,7 +857,7 @@ public:
     void minimiseStorageOverheads() noexcept\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.shrinkToNoMoreThan (values.size());\r
+        data.shrinkToNoMoreThan (numUsed);\r
     }\r
 \r
     /** Increases the array's internal storage to hold a minimum number of elements.\r
@@ -822,7 +869,7 @@ public:
     void ensureStorageAllocated (const int minNumElements)\r
     {\r
         const ScopedLockType lock (getLock());\r
-        values.ensureAllocatedSize (minNumElements);\r
+        data.ensureAllocatedSize (minNumElements);\r
     }\r
 \r
     //==============================================================================\r
@@ -830,11 +877,12 @@ public:
         To lock, you can call getLock().enter() and getLock().exit(), or preferably use\r
         an object of ScopedLockType as an RAII lock for it.\r
     */\r
-    inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return values; }\r
+    inline const TypeOfCriticalSectionToUse& getLock() const noexcept      { return data; }\r
 \r
     /** Returns the type of scoped lock to use for locking this array */\r
     using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
 \r
+\r
     //==============================================================================\r
    #ifndef DOXYGEN\r
     // Note that the swapWithArray method has been replaced by a more flexible templated version,\r
@@ -844,14 +892,15 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    ArrayBase<ObjectClass*, TypeOfCriticalSectionToUse> values;\r
+    ArrayAllocationBase<ObjectClass*, TypeOfCriticalSectionToUse> data;\r
+    int numUsed = 0;\r
 \r
     void releaseAllObjects()\r
     {\r
-        for (auto& v : values)\r
-            releaseObject (v);\r
+        while (numUsed > 0)\r
+            releaseObject (data.elements[--numUsed]);\r
 \r
-        values.clear();\r
+        jassert (numUsed == 0);\r
     }\r
 \r
     static void releaseObject (ObjectClass* o)\r
index eca034280e554dc332318bca1467e0914c7d19f5..43b8180ddc6e45d9c5ce7294d50824da77a69a9f 100644 (file)
@@ -53,18 +53,17 @@ public:
     virtual MemoryBlock* toBinary (const ValueUnion&) const noexcept            { return nullptr; }\r
     virtual var clone (const var& original) const                               { return original; }\r
 \r
-    virtual bool isVoid() const noexcept       { return false; }\r
-    virtual bool isUndefined() const noexcept  { return false; }\r
-    virtual bool isInt() const noexcept        { return false; }\r
-    virtual bool isInt64() const noexcept      { return false; }\r
-    virtual bool isBool() const noexcept       { return false; }\r
-    virtual bool isDouble() const noexcept     { return false; }\r
-    virtual bool isString() const noexcept     { return false; }\r
-    virtual bool isObject() const noexcept     { return false; }\r
-    virtual bool isArray() const noexcept      { return false; }\r
-    virtual bool isBinary() const noexcept     { return false; }\r
-    virtual bool isMethod() const noexcept     { return false; }\r
-    virtual bool isComparable() const noexcept { return false; }\r
+    virtual bool isVoid() const noexcept      { return false; }\r
+    virtual bool isUndefined() const noexcept { return false; }\r
+    virtual bool isInt() const noexcept       { return false; }\r
+    virtual bool isInt64() const noexcept     { return false; }\r
+    virtual bool isBool() const noexcept      { return false; }\r
+    virtual bool isDouble() const noexcept    { return false; }\r
+    virtual bool isString() const noexcept    { return false; }\r
+    virtual bool isObject() const noexcept    { return false; }\r
+    virtual bool isArray() const noexcept     { return false; }\r
+    virtual bool isBinary() const noexcept    { return false; }\r
+    virtual bool isMethod() const noexcept    { return false; }\r
 \r
     virtual void cleanUp (ValueUnion&) const noexcept {}\r
     virtual void createCopy (ValueUnion& dest, const ValueUnion& source) const      { dest = source; }\r
@@ -79,8 +78,7 @@ public:
     VariantType_Void() noexcept {}\r
     static const VariantType_Void instance;\r
 \r
-    bool isVoid() const noexcept override           { return true; }\r
-    bool isComparable() const noexcept override     { return true; }\r
+    bool isVoid() const noexcept override   { return true; }\r
     bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept override { return otherType.isVoid() || otherType.isUndefined(); }\r
     void writeToStream (const ValueUnion&, OutputStream& output) const override   { output.writeCompressedInt (0); }\r
 };\r
@@ -116,7 +114,6 @@ public:
     String toString (const ValueUnion& data) const override          { return String (data.intValue); }\r
     bool toBool (const ValueUnion& data) const noexcept override     { return data.intValue != 0; }\r
     bool isInt() const noexcept override                             { return true; }\r
-    bool isComparable() const noexcept override                      { return true; }\r
 \r
     bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
     {\r
@@ -147,7 +144,6 @@ public:
     String toString (const ValueUnion& data) const override          { return String (data.int64Value); }\r
     bool toBool (const ValueUnion& data) const noexcept override     { return data.int64Value != 0; }\r
     bool isInt64() const noexcept override                           { return true; }\r
-    bool isComparable() const noexcept override                      { return true; }\r
 \r
     bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
     {\r
@@ -178,7 +174,6 @@ public:
     String toString (const ValueUnion& data) const override          { return String (data.doubleValue, 20); }\r
     bool toBool (const ValueUnion& data) const noexcept override     { return data.doubleValue != 0.0; }\r
     bool isDouble() const noexcept override                          { return true; }\r
-    bool isComparable() const noexcept override                      { return true; }\r
 \r
     bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
     {\r
@@ -206,7 +201,6 @@ public:
     String toString (const ValueUnion& data) const override          { return String::charToString (data.boolValue ? (juce_wchar) '1' : (juce_wchar) '0'); }\r
     bool toBool (const ValueUnion& data) const noexcept override     { return data.boolValue; }\r
     bool isBool() const noexcept override                            { return true; }\r
-    bool isComparable() const noexcept override                      { return true; }\r
 \r
     bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
     {\r
@@ -238,7 +232,6 @@ public:
     bool toBool (const ValueUnion& data) const noexcept override     { return getString (data)->getIntValue() != 0\r
                                                                            || getString (data)->trim().equalsIgnoreCase ("true")\r
                                                                            || getString (data)->trim().equalsIgnoreCase ("yes"); }\r
-    bool isComparable() const noexcept override                      { return true; }\r
 \r
     bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
     {\r
@@ -442,7 +435,7 @@ var::var() noexcept : type (&VariantType_Void::instance) {}
 var::var (const VariantType& t) noexcept  : type (&t) {}\r
 var::~var() noexcept  { type->cleanUp (value); }\r
 \r
-JUCE_DECLARE_DEPRECATED_STATIC (const var var::null;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const var var::null);\r
 \r
 //==============================================================================\r
 var::var (const var& valueToCopy)  : type (valueToCopy.type)\r
@@ -572,7 +565,7 @@ bool var::equals (const var& other) const noexcept
 \r
 bool var::equalsWithSameType (const var& other) const noexcept\r
 {\r
-    return hasSameTypeAs (other) && equals (other);\r
+    return type == other.type && equals (other);\r
 }\r
 \r
 bool var::hasSameTypeAs (const var& other) const noexcept\r
@@ -580,31 +573,12 @@ bool var::hasSameTypeAs (const var& other) const noexcept
     return type == other.type;\r
 }\r
 \r
-bool canCompare (const var& v1, const var& v2)\r
-{\r
-    return v1.type->isComparable() && v2.type->isComparable();\r
-}\r
-\r
-static int compare (const var& v1, const var& v2)\r
-{\r
-    if (v1.isString() && v2.isString())\r
-        return v1.toString().compare (v2.toString());\r
-\r
-    auto diff = static_cast<double> (v1) - static_cast<double> (v2);\r
-    return diff == 0 ? 0 : (diff < 0 ? -1 : 1);\r
-}\r
-\r
-bool operator== (const var& v1, const var& v2)     { return v1.equals (v2); }\r
-bool operator!= (const var& v1, const var& v2)     { return ! v1.equals (v2); }\r
-bool operator<  (const var& v1, const var& v2)     { return canCompare (v1, v2) && compare (v1, v2) <  0; }\r
-bool operator>  (const var& v1, const var& v2)     { return canCompare (v1, v2) && compare (v1, v2) >  0; }\r
-bool operator<= (const var& v1, const var& v2)     { return canCompare (v1, v2) && compare (v1, v2) <= 0; }\r
-bool operator>= (const var& v1, const var& v2)     { return canCompare (v1, v2) && compare (v1, v2) >= 0; }\r
-\r
-bool operator== (const var& v1, const String& v2)  { return v1.toString() == v2; }\r
-bool operator!= (const var& v1, const String& v2)  { return v1.toString() != v2; }\r
-bool operator== (const var& v1, const char* v2)    { return v1.toString() == v2; }\r
-bool operator!= (const var& v1, const char* v2)    { return v1.toString() != v2; }\r
+bool operator== (const var& v1, const var& v2) noexcept     { return v1.equals (v2); }\r
+bool operator!= (const var& v1, const var& v2) noexcept     { return ! v1.equals (v2); }\r
+bool operator== (const var& v1, const String& v2)           { return v1.toString() == v2; }\r
+bool operator!= (const var& v1, const String& v2)           { return v1.toString() != v2; }\r
+bool operator== (const var& v1, const char* const v2)       { return v1.toString() == v2; }\r
+bool operator!= (const var& v1, const char* const v2)       { return v1.toString() != v2; }\r
 \r
 //==============================================================================\r
 var var::clone() const noexcept\r
@@ -692,7 +666,7 @@ var var::call (const Identifier& method, const var& arg1, const var& arg2, const
 //==============================================================================\r
 int var::size() const\r
 {\r
-    if (auto array = getArray())\r
+    if (auto* array = getArray())\r
         return array->size();\r
 \r
     return 0;\r
@@ -700,7 +674,7 @@ int var::size() const
 \r
 const var& var::operator[] (int arrayIndex) const\r
 {\r
-    auto array = getArray();\r
+    auto* array = getArray();\r
 \r
     // When using this method, the var must actually be an array, and the index\r
     // must be in-range!\r
@@ -711,7 +685,7 @@ const var& var::operator[] (int arrayIndex) const
 \r
 var& var::operator[] (int arrayIndex)\r
 {\r
-    auto array = getArray();\r
+    auto* array = getArray();\r
 \r
     // When using this method, the var must actually be an array, and the index\r
     // must be in-range!\r
@@ -722,11 +696,10 @@ var& var::operator[] (int arrayIndex)
 \r
 Array<var>* var::convertToArray()\r
 {\r
-    if (auto array = getArray())\r
+    if (auto* array = getArray())\r
         return array;\r
 \r
     Array<var> tempVar;\r
-\r
     if (! isVoid())\r
         tempVar.add (*this);\r
 \r
@@ -741,7 +714,7 @@ void var::append (const var& n)
 \r
 void var::remove (const int index)\r
 {\r
-    if (auto array = getArray())\r
+    if (auto* const array = getArray())\r
         array->remove (index);\r
 }\r
 \r
@@ -757,7 +730,7 @@ void var::resize (const int numArrayElementsWanted)
 \r
 int var::indexOf (const var& n) const\r
 {\r
-    if (auto array = getArray())\r
+    if (auto* const array = getArray())\r
         return array->indexOf (n);\r
 \r
     return -1;\r
@@ -782,7 +755,6 @@ var var::readFromStream (InputStream& input)
             case varMarker_BoolTrue:    return var (true);\r
             case varMarker_BoolFalse:   return var (false);\r
             case varMarker_Double:      return var (input.readDouble());\r
-\r
             case varMarker_String:\r
             {\r
                 MemoryOutputStream mo;\r
index 35025de2437a9bb73d86651f6657dc58d5514943..975c6781f0548b31d16cc1a2fb28b8c8d01f90ac 100644 (file)
@@ -282,22 +282,22 @@ public:
        empty var from a function by reference, but if you need to do that, it's easy enough to use\r
        a function-local static var and return that, avoiding any order-of-initialisation issues.\r
     */\r
-    JUCE_DEPRECATED_STATIC (static const var null;)\r
+    JUCE_DEPRECATED_STATIC (static const var null);\r
 \r
 private:\r
     //==============================================================================\r
-    class VariantType;\r
-    class VariantType_Void;\r
-    class VariantType_Undefined;\r
-    class VariantType_Int;\r
-    class VariantType_Int64;\r
-    class VariantType_Double;\r
-    class VariantType_Bool;\r
-    class VariantType_String;\r
-    class VariantType_Object;\r
-    class VariantType_Array;\r
-    class VariantType_Binary;\r
-    class VariantType_Method;\r
+    class VariantType;            friend class VariantType;\r
+    class VariantType_Void;       friend class VariantType_Void;\r
+    class VariantType_Undefined;  friend class VariantType_Undefined;\r
+    class VariantType_Int;        friend class VariantType_Int;\r
+    class VariantType_Int64;      friend class VariantType_Int64;\r
+    class VariantType_Double;     friend class VariantType_Double;\r
+    class VariantType_Bool;       friend class VariantType_Bool;\r
+    class VariantType_String;     friend class VariantType_String;\r
+    class VariantType_Object;     friend class VariantType_Object;\r
+    class VariantType_Array;      friend class VariantType_Array;\r
+    class VariantType_Binary;     friend class VariantType_Binary;\r
+    class VariantType_Method;     friend class VariantType_Method;\r
 \r
     union ValueUnion\r
     {\r
@@ -311,8 +311,6 @@ private:
         NativeFunction* methodValue;\r
     };\r
 \r
-    friend bool canCompare (const var&, const var&);\r
-\r
     const VariantType* type;\r
     ValueUnion value;\r
 \r
@@ -321,18 +319,9 @@ private:
 };\r
 \r
 /** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator== (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator!= (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator<  (const var&, const var&);\r
+JUCE_API bool operator== (const var&, const var&) noexcept;\r
 /** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator<= (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator>  (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator>= (const var&, const var&);\r
-\r
+JUCE_API bool operator!= (const var&, const var&) noexcept;\r
 JUCE_API bool operator== (const var&, const String&);\r
 JUCE_API bool operator!= (const var&, const String&);\r
 JUCE_API bool operator== (const var&, const char*);\r
index 2ad9d3264ac1629d0b30482f6e8e826330cf3be5..631a4512c89b608d382d7a840245c08f6da7f1ff 100644 (file)
@@ -118,8 +118,9 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    struct NativeIterator\r
+    class NativeIterator\r
     {\r
+    public:\r
         NativeIterator (const File& directory, const String& wildCard);\r
         ~NativeIterator();\r
 \r
@@ -128,11 +129,16 @@ private:
                    Time* modTime, Time* creationTime, bool* isReadOnly);\r
 \r
         class Pimpl;\r
+\r
+    private:\r
+        friend class DirectoryIterator;\r
+        friend struct ContainerDeletePolicy<Pimpl>;\r
         std::unique_ptr<Pimpl> pimpl;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeIterator)\r
     };\r
 \r
+    friend struct ContainerDeletePolicy<NativeIterator::Pimpl>;\r
     StringArray wildCards;\r
     NativeIterator fileFinder;\r
     String wildCard, path;\r
index 26171e7a15430b595b4379873e7ed324c4da0f66..1bf3258964aed68e892453168fa704cf883dc233 100644 (file)
@@ -63,7 +63,7 @@ File& File::operator= (File&& other) noexcept
     return *this;\r
 }\r
 \r
-JUCE_DECLARE_DEPRECATED_STATIC (const File File::nonexistent;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const File File::nonexistent);\r
 \r
 //==============================================================================\r
 static String removeEllipsis (const String& path)\r
@@ -256,13 +256,13 @@ bool File::setExecutePermission (bool shouldBeExecutable) const
     return setFileExecutableInternal (shouldBeExecutable);\r
 }\r
 \r
-bool File::deleteRecursively (bool followSymlinks) const\r
+bool File::deleteRecursively() const\r
 {\r
     bool worked = true;\r
 \r
-    if (isDirectory() && (followSymlinks || ! isSymbolicLink()))\r
+    if (isDirectory())\r
         for (auto& f : findChildFiles (File::findFilesAndDirectories, false))\r
-            worked = f.deleteRecursively (followSymlinks) && worked;\r
+            worked = f.deleteRecursively() && worked;\r
 \r
     return deleteFile() && worked;\r
 }\r
index 8a77de12ef0e6eda29e2884b5cbdd1126cc8f298..5c11921964d1749a99dfac5ed3348e927d646f9a 100644 (file)
@@ -114,7 +114,7 @@ public:
     bool isDirectory() const;\r
 \r
     /** Checks whether the path of this file represents the root of a file system,\r
-        irrespective of its existence.\r
+        irrespective of its existance.\r
 \r
         This will return true for "C:", "D:", etc on Windows and "/" on other\r
         platforms.\r
@@ -457,9 +457,6 @@ public:
         If this file is actually a directory, it may not be deleted correctly if it\r
         contains files. See deleteRecursively() as a better way of deleting directories.\r
 \r
-        If this file is a symlink, then the symlink will be deleted and not the target\r
-        of the symlink.\r
-\r
         @returns    true if the file has been successfully deleted (or if it didn't exist to\r
                     begin with).\r
         @see deleteRecursively\r
@@ -471,14 +468,11 @@ public:
         If this file is a directory, this will try to delete it and all its subfolders. If\r
         it's just a file, it will just try to delete the file.\r
 \r
-\r
-        @param followSymlinks If true, then any symlink pointing to a directory will also\r
-                              recursively delete the contents of that directory\r
-        @returns              true if the file and all its subfolders have been successfully\r
-                              deleted (or if it didn't exist to begin with).\r
+        @returns    true if the file and all its subfolders have been successfully deleted\r
+                    (or if it didn't exist to begin with).\r
         @see deleteFile\r
     */\r
-    bool deleteRecursively (bool followSymlinks = false) const;\r
+    bool deleteRecursively() const;\r
 \r
     /** Moves this file or folder to the trash.\r
 \r
@@ -607,17 +601,6 @@ public:
     //==============================================================================\r
     /** Creates a stream to read from this file.\r
 \r
-        Note that this is an old method, and actually it's usually best to avoid it and\r
-        instead use an RAII pattern with an FileInputStream directly, e.g.\r
-        @code\r
-        FileInputStream input (fileToOpen);\r
-\r
-        if (input.openedOk())\r
-        {\r
-            input.read (etc...\r
-        }\r
-        @endcode\r
-\r
         @returns    a stream that will read from this file (initially positioned at the\r
                     start of the file), or nullptr if the file can't be opened for some reason\r
         @see createOutputStream, loadFileAsData\r
@@ -626,30 +609,9 @@ public:
 \r
     /** Creates a stream to write to this file.\r
 \r
-        Note that this is an old method, and actually it's usually best to avoid it and\r
-        instead use an RAII pattern with an FileOutputStream directly, e.g.\r
-        @code\r
-        FileOutputStream output (fileToOpen);\r
-\r
-        if (output.openedOk())\r
-        {\r
-            output.read etc...\r
-        }\r
-        @endcode\r
-\r
         If the file exists, the stream that is returned will be positioned ready for\r
-        writing at the end of the file. If you want to write to the start of the file,\r
-        replacing the existing content, then you can do the following:\r
-        @code\r
-        FileOutputStream output (fileToOverwrite);\r
-\r
-        if (output.openedOk())\r
-        {\r
-            output.setPosition (0);\r
-            output.truncate();\r
-            ...\r
-        }\r
-        @endcode\r
+        writing at the end of the file, so you might want to use deleteFile() first\r
+        to write to an empty file.\r
 \r
         @returns    a stream that will write to this file (initially positioned at the\r
                     end of the file), or nullptr if the file can't be opened for some reason\r
@@ -1091,9 +1053,9 @@ public:
        Use File::getSeparatorChar() and File::getSeparatorString(), and instead of File::nonexistent,\r
        just use File() or {}.\r
     */\r
-    JUCE_DEPRECATED_STATIC (static const juce_wchar separator;)\r
-    JUCE_DEPRECATED_STATIC (static const StringRef separatorString;)\r
-    JUCE_DEPRECATED_STATIC (static const File nonexistent;)\r
+    JUCE_DEPRECATED_STATIC (static const juce_wchar separator);\r
+    JUCE_DEPRECATED_STATIC (static const StringRef separatorString);\r
+    JUCE_DEPRECATED_STATIC (static const File nonexistent);\r
 \r
 private:\r
     //==============================================================================\r
index c659bd8baff986d86f20d3fe8782132e05d7f7a5..0b6ab6361bd4b3f3f3a427441b9248efc808a3ad 100644 (file)
@@ -76,79 +76,4 @@ bool FileInputStream::setPosition (int64 pos)
     return currentPosition == pos;\r
 }\r
 \r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct FileInputStreamTests   : public UnitTest\r
-{\r
-    FileInputStreamTests()\r
-        : UnitTest ("FileInputStream", "Streams")\r
-    {}\r
-\r
-    void runTest() override\r
-    {\r
-        const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
-        File f (File::createTempFile (".txt"));\r
-        f.appendData (data.getData(), data.getSize());\r
-        FileInputStream stream (f);\r
-\r
-        beginTest ("Read");\r
-\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        size_t numBytesRead = 0;\r
-        MemoryBlock readBuffer (data.getSize());\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-\r
-        expect (readBuffer == data);\r
-\r
-        beginTest ("Skip");\r
-\r
-        stream.setPosition (0);\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        numBytesRead = 0;\r
-        const int numBytesToSkip = 5;\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            stream.skipNextBytes (numBytesToSkip);\r
-            numBytesRead += numBytesToSkip;\r
-            numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-\r
-        f.deleteFile();\r
-    }\r
-};\r
-\r
-static FileInputStreamTests fileInputStreamTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index 60051b7e6d1fd25cd0d16c8a1ed197c08b934d50..f3729186f8e4ddc63e5d208da13f522382de99e0 100644 (file)
@@ -42,20 +42,9 @@ public:
         does not exist), the failedToOpen() method will return true.\r
 \r
         If the file already exists when opened, the stream's write-position will\r
-        be set to the end of the file. To overwrite an existing file, you can truncate\r
-        it like this:\r
-\r
-        @code\r
-        FileOutputStream stream (file);\r
-\r
-        if (stream.openedOk())\r
-        {\r
-            stream.setPosition (0);\r
-            stream.truncate();\r
-            ...\r
-        }\r
-        @endcode\r
-\r
+        be set to the end of the file. To overwrite an existing file,\r
+        use File::deleteFile() before opening the stream, or use setPosition(0)\r
+        after it's opened (although this won't truncate the file).\r
 \r
         Destroying a FileOutputStream object does not force the operating system\r
         to write the buffered data to disk immediately. If this is required you\r
index 88a8688c5d0f15e814b03205f113ace7a5fa9566..d783523fe7767144a00e089739a444c169004be0 100644 (file)
@@ -71,7 +71,7 @@ public:
 \r
         If the file can't be opened for some reason, the getData() method will return a null pointer.\r
 \r
-        NOTE: The start of the actual range used may be rounded-down to a multiple of the OS's page-size,\r
+        NOTE: the start of the actual range used may be rounded-down to a multiple of the OS's page-size,\r
         so do not assume that the mapped memory will begin at exactly the position you requested - always\r
         use getRange() to check the actual range that is being used.\r
     */\r
index 8629193b997146cd6699534e7a9857540ef68b89..f9a92838292c3ded2f78b3458b30d272b111b6b2 100644 (file)
@@ -41,10 +41,12 @@ namespace juce
         TemporaryFile temp (myTargetFile);\r
 \r
         // create a stream to the temporary file, and write some data to it...\r
-        if (auto out = std::unique_ptr<FileOutputStream> (temp.getFile().createOutputStream()))\r
+        std::unique_ptr<FileOutputStream> out (temp.getFile().createOutputStream());\r
+\r
+        if (out != nullptr)\r
         {\r
             out->write ( ...etc )\r
-            out.reset(); // (deletes the stream)\r
+            out = nullptr; // (deletes the stream)\r
 \r
             // ..now we've finished writing, this will rename the temp file to\r
             // make it replace the target file we specified above.\r
index 74f6bc83598d5e6c098eb3d3682b2699b64953f5..eb939ad7f4eb7e313e7148467da41a3e37dcab07 100644 (file)
@@ -348,12 +348,7 @@ struct JSONFormatter
         }\r
         else if (v.isDouble())\r
         {\r
-            auto d = static_cast<double> (v);\r
-\r
-            if (juce_isfinite (d))\r
-                out << String (d, maximumDecimalPlaces);\r
-            else\r
-                out << "null";\r
+            out << String (static_cast<double> (v), maximumDecimalPlaces);\r
         }\r
         else if (v.isArray())\r
         {\r
index 226aeaccc9a65af19f639fcf091077870189095e..d1e09d63c67c110af41c99ae1f24b035f6e051d4 100644 (file)
@@ -81,13 +81,13 @@ struct JavascriptEngine::RootObject   : public DynamicObject
     void execute (const String& code)\r
     {\r
         ExpressionTreeBuilder tb (code);\r
-        std::unique_ptr<BlockStatement> (tb.parseStatementList())->perform (Scope ({}, *this, *this), nullptr);\r
+        std::unique_ptr<BlockStatement> (tb.parseStatementList())->perform (Scope (nullptr, this, this), nullptr);\r
     }\r
 \r
     var evaluate (const String& code)\r
     {\r
         ExpressionTreeBuilder tb (code);\r
-        return ExpPtr (tb.parseExpression())->getResult (Scope ({}, *this, *this));\r
+        return ExpPtr (tb.parseExpression())->getResult (Scope (nullptr, this, this));\r
     }\r
 \r
     //==============================================================================\r
@@ -103,7 +103,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
     static bool isNumericOrUndefined (const var& v) noexcept  { return isNumeric (v) || v.isUndefined(); }\r
     static int64 getOctalValue (const String& s)              { BigInteger b; b.parseString (s.initialSectionContainingOnly ("01234567"), 8); return b.toInt64(); }\r
     static Identifier getPrototypeIdentifier()                { static const Identifier i ("prototype"); return i; }\r
-    static var* getPropertyPointer (DynamicObject& o, const Identifier& i) noexcept   { return o.getProperties().getVarPointer (i); }\r
+    static var* getPropertyPointer (DynamicObject* o, const Identifier& i) noexcept   { return o->getProperties().getVarPointer (i); }\r
 \r
     //==============================================================================\r
     struct CodeLocation\r
@@ -131,11 +131,9 @@ struct JavascriptEngine::RootObject   : public DynamicObject
     //==============================================================================\r
     struct Scope\r
     {\r
-        Scope (const Scope* p, ReferenceCountedObjectPtr<RootObject> rt, DynamicObject::Ptr scp) noexcept\r
-            : parent (p), root (static_cast<ReferenceCountedObjectPtr<RootObject>&&> (rt)),\r
-              scope (static_cast<DynamicObject::Ptr&&> (scp)) {}\r
+        Scope (const Scope* p, RootObject* r, DynamicObject* s) noexcept : parent (p), root (r), scope (s) {}\r
 \r
-        const Scope* const parent;\r
+        const Scope* parent;\r
         ReferenceCountedObjectPtr<RootObject> root;\r
         DynamicObject::Ptr scope;\r
 \r
@@ -143,13 +141,13 @@ struct JavascriptEngine::RootObject   : public DynamicObject
         {\r
             if (auto* o = targetObject.getDynamicObject())\r
             {\r
-                if (auto* prop = getPropertyPointer (*o, functionName))\r
+                if (auto* prop = getPropertyPointer (o, functionName))\r
                     return *prop;\r
 \r
                 for (auto* p = o->getProperty (getPrototypeIdentifier()).getDynamicObject(); p != nullptr;\r
                      p = p->getProperty (getPrototypeIdentifier()).getDynamicObject())\r
                 {\r
-                    if (auto* prop = getPropertyPointer (*p, functionName))\r
+                    if (auto* prop = getPropertyPointer (p, functionName))\r
                         return *prop;\r
                 }\r
 \r
@@ -176,14 +174,14 @@ struct JavascriptEngine::RootObject   : public DynamicObject
         var* findRootClassProperty (const Identifier& className, const Identifier& propName) const\r
         {\r
             if (auto* cls = root->getProperty (className).getDynamicObject())\r
-                return getPropertyPointer (*cls, propName);\r
+                return getPropertyPointer (cls, propName);\r
 \r
             return nullptr;\r
         }\r
 \r
         var findSymbolInParentScopes (const Identifier& name) const\r
         {\r
-            if (auto v = getPropertyPointer (*scope, name))\r
+            if (auto* v = getPropertyPointer (scope, name))\r
                 return *v;\r
 \r
             return parent != nullptr ? parent->findSymbolInParentScopes (name)\r
@@ -194,9 +192,9 @@ struct JavascriptEngine::RootObject   : public DynamicObject
         {\r
             auto* target = args.thisObject.getDynamicObject();\r
 \r
-            if (target == nullptr || target == scope.get())\r
+            if (target == nullptr || target == scope)\r
             {\r
-                if (auto* m = getPropertyPointer (*scope, function))\r
+                if (auto* m = getPropertyPointer (scope, function))\r
                 {\r
                     if (auto fo = dynamic_cast<FunctionObject*> (m->getObject()))\r
                     {\r
@@ -210,7 +208,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
 \r
             for (int i = 0; i < props.size(); ++i)\r
                 if (auto* o = props.getValueAt (i).getDynamicObject())\r
-                    if (Scope (this, *root, *o).findAndInvokeMethod (function, args, result))\r
+                    if (Scope (this, root, o).findAndInvokeMethod (function, args, result))\r
                         return true;\r
 \r
             return false;\r
@@ -222,7 +220,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             {\r
                 auto* target = args.thisObject.getDynamicObject();\r
 \r
-                if (target == nullptr || target == scope.get())\r
+                if (target == nullptr || target == scope)\r
                 {\r
                     if (auto fo = dynamic_cast<FunctionObject*> (m.getObject()))\r
                     {\r
@@ -240,8 +238,6 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             if (Time::getCurrentTime() > root->timeout)\r
                 location.throwError (root->timeout == Time() ? "Interrupted" : "Execution timed-out");\r
         }\r
-\r
-        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Scope)\r
     };\r
 \r
     //==============================================================================\r
@@ -382,7 +378,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
 \r
         void assign (const Scope& s, const var& newValue) const override\r
         {\r
-            if (auto* v = getPropertyPointer (*s.scope, name))\r
+            if (auto* v = getPropertyPointer (s.scope, name))\r
                 *v = newValue;\r
             else\r
                 s.root->setProperty (name, newValue);\r
@@ -407,7 +403,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             }\r
 \r
             if (auto* o = p.getDynamicObject())\r
-                if (auto* v = getPropertyPointer (*o, child))\r
+                if (auto* v = getPropertyPointer (o, child))\r
                     return *v;\r
 \r
             return var::undefined();\r
@@ -440,7 +436,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
 \r
             if (auto* o = arrayVar.getDynamicObject())\r
                 if (key.isString())\r
-                    if (auto* v = getPropertyPointer (*o, Identifier (key)))\r
+                    if (auto* v = getPropertyPointer (o, Identifier (key)))\r
                         return *v;\r
 \r
             return var::undefined();\r
@@ -833,7 +829,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             tb.parseFunctionParamsAndBody (*this);\r
         }\r
 \r
-        DynamicObject::Ptr clone() override    { return *new FunctionObject (*this); }\r
+        DynamicObject::Ptr clone() override    { return new FunctionObject (*this); }\r
 \r
         void writeAsJSON (OutputStream& out, int /*indentLevel*/, bool /*allOnOneLine*/, int /*maximumDecimalPlaces*/) override\r
         {\r
@@ -1096,9 +1092,6 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             if (matchIf (TokenTypes::assign))            { ExpPtr rhs (parseExpression()); return new Assignment (location, lhs, rhs); }\r
             if (matchIf (TokenTypes::plusEquals))        return parseInPlaceOpExpression<AdditionOp> (lhs);\r
             if (matchIf (TokenTypes::minusEquals))       return parseInPlaceOpExpression<SubtractionOp> (lhs);\r
-            if (matchIf (TokenTypes::timesEquals))       return parseInPlaceOpExpression<MultiplyOp> (lhs);\r
-            if (matchIf (TokenTypes::divideEquals))      return parseInPlaceOpExpression<DivideOp> (lhs);\r
-            if (matchIf (TokenTypes::moduloEquals))      return parseInPlaceOpExpression<ModuloOp> (lhs);\r
             if (matchIf (TokenTypes::leftShiftEquals))   return parseInPlaceOpExpression<LeftShiftOp> (lhs);\r
             if (matchIf (TokenTypes::rightShiftEquals))  return parseInPlaceOpExpression<RightShiftOp> (lhs);\r
 \r
@@ -1112,7 +1105,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
         Expression* parseInPlaceOpExpression (ExpPtr& lhs)\r
         {\r
             ExpPtr rhs (parseExpression());\r
-            Expression* bareLHS = lhs.get(); // careful - bare pointer is deliberately aliased\r
+            Expression* bareLHS = lhs.get(); // careful - bare pointer is deliberately alised\r
             return new SelfAssignment (location, bareLHS, new OpType (location, lhs, rhs));\r
         }\r
 \r
@@ -1869,13 +1862,13 @@ var JavascriptEngine::evaluate (const String& code, Result* result)
 \r
 var JavascriptEngine::callFunction (const Identifier& function, const var::NativeFunctionArgs& args, Result* result)\r
 {\r
-    auto returnVal = var::undefined();\r
+    var returnVal (var::undefined());\r
 \r
     try\r
     {\r
         prepareTimeout();\r
         if (result != nullptr) *result = Result::ok();\r
-        RootObject::Scope ({}, *root, *root).findAndInvokeMethod (function, args, returnVal);\r
+        RootObject::Scope (nullptr, root, root).findAndInvokeMethod (function, args, returnVal);\r
     }\r
     catch (String& error)\r
     {\r
@@ -1888,15 +1881,14 @@ var JavascriptEngine::callFunction (const Identifier& function, const var::Nativ
 var JavascriptEngine::callFunctionObject (DynamicObject* objectScope, const var& functionObject,\r
                                           const var::NativeFunctionArgs& args, Result* result)\r
 {\r
-    auto returnVal = var::undefined();\r
+    var returnVal (var::undefined());\r
 \r
     try\r
     {\r
         prepareTimeout();\r
         if (result != nullptr) *result = Result::ok();\r
-        RootObject::Scope rootScope ({}, *root, *root);\r
-        RootObject::Scope (&rootScope, *root, DynamicObject::Ptr (objectScope))\r
-            .invokeMethod (functionObject, args, returnVal);\r
+        RootObject::Scope rootScope (nullptr, root, root);\r
+        RootObject::Scope (&rootScope, root, objectScope).invokeMethod (functionObject, args, returnVal);\r
     }\r
     catch (String& error)\r
     {\r
index 111060cfd8ec8f6c0ea6a1a871195b8526434a64..9725a1b5a6fbf9528d750b55dc7c411663e8a46d 100644 (file)
 #endif\r
 \r
 #if JUCE_ANDROID\r
- #include <ifaddrs.h>\r
  #include <android/log.h>\r
 #endif\r
 \r
 \r
 //==============================================================================\r
 #include "containers/juce_AbstractFifo.cpp"\r
-#include "containers/juce_ArrayBase.cpp"\r
 #include "containers/juce_NamedValueSet.cpp"\r
-#include "containers/juce_OwnedArray.cpp"\r
 #include "containers/juce_PropertySet.cpp"\r
-#include "containers/juce_ReferenceCountedArray.cpp"\r
 #include "containers/juce_SparseSet.cpp"\r
 #include "containers/juce_Variant.cpp"\r
 #include "files/juce_DirectoryIterator.cpp"\r
 #include "misc/juce_Result.cpp"\r
 #include "misc/juce_Uuid.cpp"\r
 #include "misc/juce_StdFunctionCompat.cpp"\r
-#include "misc/juce_ConsoleApplication.cpp"\r
 #include "network/juce_MACAddress.cpp"\r
 #include "network/juce_NamedPipe.cpp"\r
 #include "network/juce_Socket.cpp"\r
 #if ! JUCE_WINDOWS\r
 #include "native/juce_posix_SharedCode.h"\r
 #include "native/juce_posix_NamedPipe.cpp"\r
-#if ! JUCE_ANDROID || __ANDROID_API__ >= 24\r
- #include "native/juce_posix_IPAddress.h"\r
-#endif\r
 #endif\r
 \r
 //==============================================================================\r
index 8c538cc7cb07d04a8a2cdae8adb60417205f34e0..0c4951088e6fb361b78c5dd11b37f9152075732e 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:               juce_core\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE core classes\r
   description:      The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.\r
   website:          http://www.juce.com/juce\r
@@ -42,6 +42,7 @@
   OSXFrameworks:    Cocoa IOKit\r
   iOSFrameworks:    Foundation\r
   linuxLibs:        rt dl pthread\r
+  linuxPackages:    libcurl\r
   mingwLibs:        uuid wsock32 wininet version ole32 ws2_32 oleaut32 imm32 comdlg32 shlwapi rpcrt4 winmm\r
 \r
  END_JUCE_MODULE_DECLARATION\r
     If you disable this then https/ssl support will not be available on linux.\r
 */\r
 #ifndef JUCE_USE_CURL\r
- #if JUCE_LINUX\r
-  #define JUCE_USE_CURL 1\r
- #else\r
-  #define JUCE_USE_CURL 0\r
- #endif\r
-#endif\r
-\r
-/** Config: JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
-    If enabled, JUCE will load libcurl lazily when required (for example, when WebInputStream\r
-    is used). Enabling this flag may also help with library dependency erros as linking\r
-    libcurl at compile-time may instruct the linker to hard depend on a specific version\r
-    of libcurl. It's also useful if you want to limit the amount of JUCE dependencies and\r
-    you are not using WebInputStream or the URL classes.\r
-*/\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- #define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
+ #define JUCE_USE_CURL 0\r
 #endif\r
 \r
 \r
  #define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
 #endif\r
 \r
-/** Config: JUCE_STRICT_REFCOUNTEDPOINTER\r
-    If enabled, this will make the ReferenceCountedObjectPtr class stricter about allowing\r
-    itself to be cast directly to a raw pointer. By default this is disabled, for compatibility\r
-    with old code, but if possible, you should always enable it to improve code safety!\r
-*/\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
 \r
 #ifndef JUCE_STRING_UTF_TYPE\r
  #define JUCE_STRING_UTF_TYPE 8\r
@@ -255,7 +232,6 @@ namespace juce
 #include "maths/juce_StatisticsAccumulator.h"\r
 #include "containers/juce_ElementComparator.h"\r
 #include "containers/juce_ArrayAllocationBase.h"\r
-#include "containers/juce_ArrayBase.h"\r
 #include "containers/juce_Array.h"\r
 #include "containers/juce_LinkedListPointer.h"\r
 #include "containers/juce_ListenerList.h"\r
@@ -275,13 +251,10 @@ namespace juce
 #include "text/juce_Base64.h"\r
 #include "misc/juce_Result.h"\r
 #include "misc/juce_Uuid.h"\r
-#include "misc/juce_ConsoleApplication.h"\r
 #include "containers/juce_Variant.h"\r
 #include "containers/juce_NamedValueSet.h"\r
 #include "containers/juce_DynamicObject.h"\r
 #include "containers/juce_HashMap.h"\r
-#include "system/juce_SystemStats.h"\r
-#include "memory/juce_HeavyweightLeakedObjectDetector.h"\r
 #include "time/juce_RelativeTime.h"\r
 #include "time/juce_Time.h"\r
 #include "streams/juce_InputStream.h"\r
@@ -330,6 +303,7 @@ namespace juce
 #include "network/juce_URL.h"\r
 #include "network/juce_WebInputStream.h"\r
 #include "streams/juce_URLInputSource.h"\r
+#include "system/juce_SystemStats.h"\r
 #include "time/juce_PerformanceCounter.h"\r
 #include "unit_tests/juce_UnitTest.h"\r
 #include "xml/juce_XmlDocument.h"\r
index 6629f851b2ab7b2725cfceb20e693c5cd907a777..ff932a91ce9f3fc8469ebc6dfeebd7ab8af672ce 100644 (file)
@@ -114,7 +114,7 @@ public:
     static File getSystemLogFileFolder();\r
 \r
     // (implementation of the Logger virtual method)\r
-    void logMessage (const String&) override;\r
+    void logMessage (const String&);\r
 \r
     //==============================================================================\r
     /** This is a utility function which removes lines from the start of a text\r
index 2e0526b258e647d0cbd73a2f0c2c82eab8efd1f6..62a43ae275fab5ab4b5f0696fc1993e45b54603c 100644 (file)
@@ -107,14 +107,14 @@ struct Expression::Helpers
     class Constant  : public Term\r
     {\r
     public:\r
-        Constant (double val, bool resolutionTarget)\r
+        Constant (const double val, const bool resolutionTarget)\r
             : value (val), isResolutionTarget (resolutionTarget) {}\r
 \r
         Type getType() const noexcept                { return constantType; }\r
         Term* clone() const                          { return new Constant (value, isResolutionTarget); }\r
-        TermPtr resolve (const Scope&, int)          { return *this; }\r
+        TermPtr resolve (const Scope&, int)          { return this; }\r
         double toDouble() const                      { return value; }\r
-        TermPtr negated()                            { return *new Constant (-value, isResolutionTarget); }\r
+        TermPtr negated()                            { return new Constant (-value, isResolutionTarget); }\r
 \r
         String toString() const\r
         {\r
@@ -133,9 +133,9 @@ struct Expression::Helpers
     class BinaryTerm  : public Term\r
     {\r
     public:\r
-        BinaryTerm (TermPtr l, TermPtr r) : left (static_cast<TermPtr&&> (l)), right (static_cast<TermPtr&&> (r))\r
+        BinaryTerm (Term* const l, Term* const r) : left (l), right (r)\r
         {\r
-            jassert (left != nullptr && right != nullptr);\r
+            jassert (l != nullptr && r != nullptr);\r
         }\r
 \r
         int getInputIndexFor (const Term* possibleInput) const\r
@@ -145,22 +145,22 @@ struct Expression::Helpers
 \r
         Type getType() const noexcept       { return operatorType; }\r
         int getNumInputs() const            { return 2; }\r
-        Term* getInput (int index) const    { return index == 0 ? left.get() : (index == 1 ? right.get() : nullptr); }\r
+        Term* getInput (int index) const    { return index == 0 ? left.get() : (index == 1 ? right.get() : 0); }\r
 \r
         virtual double performFunction (double left, double right) const = 0;\r
         virtual void writeOperator (String& dest) const = 0;\r
 \r
         TermPtr resolve (const Scope& scope, int recursionDepth)\r
         {\r
-            return *new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(),\r
-                                                   right->resolve (scope, recursionDepth)->toDouble()), false);\r
+            return new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(),\r
+                                                  right->resolve (scope, recursionDepth)->toDouble()), false);\r
         }\r
 \r
         String toString() const\r
         {\r
             String s;\r
-            auto ourPrecendence = getOperatorPrecedence();\r
 \r
+            const int ourPrecendence = getOperatorPrecedence();\r
             if (left->getOperatorPrecedence() > ourPrecendence)\r
                 s << '(' << left->toString() << ')';\r
             else\r
@@ -183,12 +183,12 @@ struct Expression::Helpers
         {\r
             jassert (input == left || input == right);\r
             if (input != left && input != right)\r
-                return {};\r
+                return TermPtr();\r
 \r
-            if (auto dest = findDestinationFor (topLevelTerm, this))\r
+            if (const Term* const dest = findDestinationFor (topLevelTerm, this))\r
                 return dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm);\r
 \r
-            return *new Constant (overallTarget, false);\r
+            return new Constant (overallTarget, false);\r
         }\r
     };\r
 \r
@@ -238,7 +238,7 @@ struct Expression::Helpers
         Type getType() const noexcept   { return functionType; }\r
         Term* clone() const             { return new Function (functionName, parameters); }\r
         int getNumInputs() const        { return parameters.size(); }\r
-        Term* getInput (int i) const    { return parameters.getReference(i).term.get(); }\r
+        Term* getInput (int i) const    { return parameters.getReference(i).term; }\r
         String getName() const          { return functionName; }\r
 \r
         TermPtr resolve (const Scope& scope, int recursionDepth)\r
@@ -261,7 +261,7 @@ struct Expression::Helpers
                 result = scope.evaluateFunction (functionName, nullptr, 0);\r
             }\r
 \r
-            return *new Constant (result, false);\r
+            return new Constant (result, false);\r
         }\r
 \r
         int getInputIndexFor (const Term* possibleInput) const\r
@@ -300,7 +300,7 @@ struct Expression::Helpers
     class DotOperator  : public BinaryTerm\r
     {\r
     public:\r
-        DotOperator (SymbolTerm* l, TermPtr r)  : BinaryTerm (TermPtr (l), r) {}\r
+        DotOperator (SymbolTerm* const l, Term* const r)  : BinaryTerm (l, r) {}\r
 \r
         TermPtr resolve (const Scope& scope, int recursionDepth)\r
         {\r
@@ -311,7 +311,7 @@ struct Expression::Helpers
             return visitor.output;\r
         }\r
 \r
-        Term* clone() const                             { return new DotOperator (getSymbol(), *right); }\r
+        Term* clone() const                             { return new DotOperator (getSymbol(), right); }\r
         String getName() const                          { return "."; }\r
         int getOperatorPrecedence() const               { return 1; }\r
         void writeOperator (String& dest) const         { dest << '.'; }\r
@@ -414,11 +414,11 @@ struct Expression::Helpers
         int getInputIndexFor (const Term* possibleInput) const  { return possibleInput == input ? 0 : -1; }\r
         int getNumInputs() const                                { return 1; }\r
         Term* getInput (int index) const                        { return index == 0 ? input.get() : nullptr; }\r
-        Term* clone() const                                     { return new Negate (*input->clone()); }\r
+        Term* clone() const                                     { return new Negate (input->clone()); }\r
 \r
         TermPtr resolve (const Scope& scope, int recursionDepth)\r
         {\r
-            return *new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false);\r
+            return new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false);\r
         }\r
 \r
         String getName() const          { return "-"; }\r
@@ -431,8 +431,8 @@ struct Expression::Helpers
 \r
             const Term* const dest = findDestinationFor (topLevelTerm, this);\r
 \r
-            return *new Negate (dest == nullptr ? TermPtr (*new Constant (overallTarget, false))\r
-                                                : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm));\r
+            return new Negate (dest == nullptr ? new Constant (overallTarget, false)\r
+                                               : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm));\r
         }\r
 \r
         String toString() const\r
@@ -451,9 +451,9 @@ struct Expression::Helpers
     class Add  : public BinaryTerm\r
     {\r
     public:\r
-        Add (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+        Add (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
 \r
-        Term* clone() const                     { return new Add (*left->clone(), *right->clone()); }\r
+        Term* clone() const                     { return new Add (left->clone(), right->clone()); }\r
         double performFunction (double lhs, double rhs) const    { return lhs + rhs; }\r
         int getOperatorPrecedence() const       { return 3; }\r
         String getName() const                  { return "+"; }\r
@@ -461,10 +461,11 @@ struct Expression::Helpers
 \r
         TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
         {\r
-            if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm))\r
-                return *new Subtract (newDest, *(input == left ? right : left)->clone());\r
+            const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
+            if (newDest == nullptr)\r
+                return TermPtr();\r
 \r
-            return {};\r
+            return new Subtract (newDest, (input == left ? right : left)->clone());\r
         }\r
 \r
     private:\r
@@ -475,9 +476,9 @@ struct Expression::Helpers
     class Subtract  : public BinaryTerm\r
     {\r
     public:\r
-        Subtract (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+        Subtract (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
 \r
-        Term* clone() const                     { return new Subtract (*left->clone(), *right->clone()); }\r
+        Term* clone() const                     { return new Subtract (left->clone(), right->clone()); }\r
         double performFunction (double lhs, double rhs) const    { return lhs - rhs; }\r
         int getOperatorPrecedence() const       { return 3; }\r
         String getName() const                  { return "-"; }\r
@@ -485,15 +486,14 @@ struct Expression::Helpers
 \r
         TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
         {\r
-            if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm))\r
-            {\r
-                if (input == left)\r
-                    return *new Add (*newDest, *right->clone());\r
+            const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
+            if (newDest == nullptr)\r
+                return TermPtr();\r
 \r
-                return *new Subtract (*left->clone(), *newDest);\r
-            }\r
+            if (input == left)\r
+                return new Add (newDest, right->clone());\r
 \r
-            return {};\r
+            return new Subtract (left->clone(), newDest);\r
         }\r
 \r
     private:\r
@@ -504,9 +504,9 @@ struct Expression::Helpers
     class Multiply  : public BinaryTerm\r
     {\r
     public:\r
-        Multiply (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+        Multiply (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
 \r
-        Term* clone() const                     { return new Multiply (*left->clone(), *right->clone()); }\r
+        Term* clone() const                     { return new Multiply (left->clone(), right->clone()); }\r
         double performFunction (double lhs, double rhs) const    { return lhs * rhs; }\r
         String getName() const                  { return "*"; }\r
         void writeOperator (String& dest) const { dest << " * "; }\r
@@ -514,12 +514,14 @@ struct Expression::Helpers
 \r
         TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
         {\r
-            if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm))\r
-                return *new Divide (newDest, *(input == left ? right : left)->clone());\r
+            const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
+            if (newDest == nullptr)\r
+                return TermPtr();\r
 \r
-            return {};\r
+            return new Divide (newDest, (input == left ? right : left)->clone());\r
         }\r
 \r
+    private:\r
         JUCE_DECLARE_NON_COPYABLE (Multiply)\r
     };\r
 \r
@@ -527,9 +529,9 @@ struct Expression::Helpers
     class Divide  : public BinaryTerm\r
     {\r
     public:\r
-        Divide (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+        Divide (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
 \r
-        Term* clone() const                     { return new Divide (*left->clone(), *right->clone()); }\r
+        Term* clone() const                     { return new Divide (left->clone(), right->clone()); }\r
         double performFunction (double lhs, double rhs) const    { return lhs / rhs; }\r
         String getName() const                  { return "/"; }\r
         void writeOperator (String& dest) const { dest << " / "; }\r
@@ -537,17 +539,17 @@ struct Expression::Helpers
 \r
         TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
         {\r
-            auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm);\r
-\r
+            const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
             if (newDest == nullptr)\r
-                return {};\r
+                return TermPtr();\r
 \r
             if (input == left)\r
-                return *new Multiply (*newDest, *right->clone());\r
+                return new Multiply (newDest, right->clone());\r
 \r
-            return *new Divide (*left->clone(), *newDest);\r
+            return new Divide (left->clone(), newDest);\r
         }\r
 \r
+    private:\r
         JUCE_DECLARE_NON_COPYABLE (Divide)\r
     };\r
 \r
@@ -599,19 +601,22 @@ struct Expression::Helpers
         }\r
 \r
         for (int i = 0; i < numIns; ++i)\r
-            if (auto c = findTermToAdjust (term->getInput (i), mustBeFlagged))\r
+        {\r
+            Constant* const c = findTermToAdjust (term->getInput (i), mustBeFlagged);\r
+            if (c != nullptr)\r
                 return c;\r
+        }\r
 \r
         return nullptr;\r
     }\r
 \r
-    static bool containsAnySymbols (const Term& t)\r
+    static bool containsAnySymbols (const Term* const t)\r
     {\r
-        if (t.getType() == Expression::symbolType)\r
+        if (t->getType() == Expression::symbolType)\r
             return true;\r
 \r
-        for (int i = t.getNumInputs(); --i >= 0;)\r
-            if (containsAnySymbols (*t.getInput (i)))\r
+        for (int i = t->getNumInputs(); --i >= 0;)\r
+            if (containsAnySymbols (t->getInput (i)))\r
                 return true;\r
 \r
         return false;\r
@@ -657,9 +662,9 @@ struct Expression::Helpers
         TermPtr readUpToComma()\r
         {\r
             if (text.isEmpty())\r
-                return *new Constant (0.0, false);\r
+                return new Constant (0.0, false);\r
 \r
-            auto e = readExpression();\r
+            const TermPtr e (readExpression());\r
 \r
             if (e == nullptr || ((! readOperator (",")) && ! text.isEmpty()))\r
                 return parseError ("Syntax error: \"" + String (text) + "\"");\r
@@ -672,12 +677,12 @@ struct Expression::Helpers
     private:\r
         String::CharPointerType& text;\r
 \r
-        TermPtr parseError (const String& message)\r
+        Term* parseError (const String& message)\r
         {\r
             if (error.isEmpty())\r
                 error = message;\r
 \r
-            return {};\r
+            return nullptr;\r
         }\r
 \r
         //==============================================================================\r
@@ -772,20 +777,20 @@ struct Expression::Helpers
 \r
         TermPtr readExpression()\r
         {\r
-            auto lhs = readMultiplyOrDivideExpression();\r
-            char opType;\r
+            TermPtr lhs (readMultiplyOrDivideExpression());\r
 \r
+            char opType;\r
             while (lhs != nullptr && readOperator ("+-", &opType))\r
             {\r
-                auto rhs = readMultiplyOrDivideExpression();\r
+                TermPtr rhs (readMultiplyOrDivideExpression());\r
 \r
                 if (rhs == nullptr)\r
                     return parseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\"");\r
 \r
                 if (opType == '+')\r
-                    lhs = *new Add (lhs, rhs);\r
+                    lhs = new Add (lhs, rhs);\r
                 else\r
-                    lhs = *new Subtract (lhs, rhs);\r
+                    lhs = new Subtract (lhs, rhs);\r
             }\r
 \r
             return lhs;\r
@@ -793,9 +798,9 @@ struct Expression::Helpers
 \r
         TermPtr readMultiplyOrDivideExpression()\r
         {\r
-            auto lhs = readUnaryExpression();\r
-            char opType;\r
+            TermPtr lhs (readUnaryExpression());\r
 \r
+            char opType;\r
             while (lhs != nullptr && readOperator ("*/", &opType))\r
             {\r
                 TermPtr rhs (readUnaryExpression());\r
@@ -804,9 +809,9 @@ struct Expression::Helpers
                     return parseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\"");\r
 \r
                 if (opType == '*')\r
-                    lhs = *new Multiply (lhs, rhs);\r
+                    lhs = new Multiply (lhs, rhs);\r
                 else\r
-                    lhs = *new Divide (lhs, rhs);\r
+                    lhs = new Divide (lhs, rhs);\r
             }\r
 \r
             return lhs;\r
@@ -833,10 +838,12 @@ struct Expression::Helpers
 \r
         TermPtr readPrimaryExpression()\r
         {\r
-            if (auto e = readParenthesisedExpression())\r
+            TermPtr e (readParenthesisedExpression());\r
+            if (e != nullptr)\r
                 return e;\r
 \r
-            if (auto e = readNumber())\r
+            e = readNumber();\r
+            if (e != nullptr)\r
                 return e;\r
 \r
             return readSymbolOrFunction();\r
@@ -845,25 +852,24 @@ struct Expression::Helpers
         TermPtr readSymbolOrFunction()\r
         {\r
             String identifier;\r
-\r
             if (readIdentifier (identifier))\r
             {\r
                 if (readOperator ("(")) // method call...\r
                 {\r
-                    auto f = new Function (identifier);\r
+                    Function* const f = new Function (identifier);\r
                     std::unique_ptr<Term> func (f);  // (can't use std::unique_ptr<Function> in MSVC)\r
 \r
-                    auto param = readExpression();\r
+                    TermPtr param (readExpression());\r
 \r
                     if (param == nullptr)\r
                     {\r
                         if (readOperator (")"))\r
-                            return TermPtr (func.release());\r
+                            return func.release();\r
 \r
                         return parseError ("Expected parameters after \"" + identifier + " (\"");\r
                     }\r
 \r
-                    f->parameters.add (Expression (param.get()));\r
+                    f->parameters.add (Expression (param));\r
 \r
                     while (readOperator (","))\r
                     {\r
@@ -872,11 +878,11 @@ struct Expression::Helpers
                         if (param == nullptr)\r
                             return parseError ("Expected expression after \",\"");\r
 \r
-                        f->parameters.add (Expression (param.get()));\r
+                        f->parameters.add (Expression (param));\r
                     }\r
 \r
                     if (readOperator (")"))\r
-                        return TermPtr (func.release());\r
+                        return func.release();\r
 \r
                     return parseError ("Expected \")\"");\r
                 }\r
@@ -891,26 +897,25 @@ struct Expression::Helpers
                     if (identifier == "this")\r
                         return rhs;\r
 \r
-                    return *new DotOperator (new SymbolTerm (identifier), rhs);\r
+                    return new DotOperator (new SymbolTerm (identifier), rhs);\r
                 }\r
 \r
                 // just a symbol..\r
                 jassert (identifier.trim() == identifier);\r
-                return *new SymbolTerm (identifier);\r
+                return new SymbolTerm (identifier);\r
             }\r
 \r
-            return {};\r
+            return TermPtr();\r
         }\r
 \r
         TermPtr readParenthesisedExpression()\r
         {\r
             if (! readOperator ("("))\r
-                return {};\r
-\r
-            auto e = readExpression();\r
+                return TermPtr();\r
 \r
+            const TermPtr e (readExpression());\r
             if (e == nullptr || ! readOperator (")"))\r
-                return {};\r
+                return TermPtr();\r
 \r
             return e;\r
         }\r
@@ -972,7 +977,7 @@ Expression::Expression (const String& stringToParse, String& parseError)
 Expression Expression::parse (String::CharPointerType& stringToParse, String& parseError)\r
 {\r
     Helpers::Parser parser (stringToParse);\r
-    Expression e (parser.readUpToComma().get());\r
+    Expression e (parser.readUpToComma());\r
     parseError = parser.error;\r
     return e;\r
 }\r
@@ -1006,7 +1011,7 @@ Expression Expression::operator+ (const Expression& other) const  { return Expre
 Expression Expression::operator- (const Expression& other) const  { return Expression (new Helpers::Subtract (term, other.term)); }\r
 Expression Expression::operator* (const Expression& other) const  { return Expression (new Helpers::Multiply (term, other.term)); }\r
 Expression Expression::operator/ (const Expression& other) const  { return Expression (new Helpers::Divide (term, other.term)); }\r
-Expression Expression::operator-() const                          { return Expression (term->negated().get()); }\r
+Expression Expression::operator-() const                          { return Expression (term->negated()); }\r
 Expression Expression::symbol (const String& symbol)              { return Expression (new Helpers::SymbolTerm (symbol)); }\r
 \r
 Expression Expression::function (const String& functionName, const Array<Expression>& parameters)\r
@@ -1018,14 +1023,14 @@ Expression Expression::adjustedToGiveNewResult (const double targetValue, const
 {\r
     std::unique_ptr<Term> newTerm (term->clone());\r
 \r
-    auto termToAdjust = Helpers::findTermToAdjust (newTerm.get(), true);\r
+    Helpers::Constant* termToAdjust = Helpers::findTermToAdjust (newTerm.get(), true);\r
 \r
     if (termToAdjust == nullptr)\r
         termToAdjust = Helpers::findTermToAdjust (newTerm.get(), false);\r
 \r
     if (termToAdjust == nullptr)\r
     {\r
-        newTerm.reset (new Helpers::Add (*newTerm.release(), *new Helpers::Constant (0, false)));\r
+        newTerm.reset (new Helpers::Add (newTerm.release(), new Helpers::Constant (0, false)));\r
         termToAdjust = Helpers::findTermToAdjust (newTerm.get(), false);\r
     }\r
 \r
@@ -1034,7 +1039,7 @@ Expression Expression::adjustedToGiveNewResult (const double targetValue, const
     if (const Term* parent = Helpers::findDestinationFor (newTerm.get(), termToAdjust))\r
     {\r
         if (Helpers::TermPtr reverseTerm = parent->createTermToEvaluateInput (scope, termToAdjust, targetValue, newTerm.get()))\r
-            termToAdjust->value = Expression (reverseTerm.get()).evaluate (scope);\r
+            termToAdjust->value = Expression (reverseTerm).evaluate (scope);\r
         else\r
             return Expression (targetValue);\r
     }\r
@@ -1084,7 +1089,7 @@ void Expression::findReferencedSymbols (Array<Symbol>& results, const Scope& sco
 }\r
 \r
 String Expression::toString() const                     { return term->toString(); }\r
-bool Expression::usesAnySymbols() const                 { return Helpers::containsAnySymbols (*term); }\r
+bool Expression::usesAnySymbols() const                 { return Helpers::containsAnySymbols (term); }\r
 Expression::Type Expression::getType() const noexcept   { return term->getType(); }\r
 String Expression::getSymbolOrFunction() const          { return term->getName(); }\r
 int Expression::getNumInputs() const                    { return term->getNumInputs(); }\r
@@ -1093,7 +1098,7 @@ Expression Expression::getInput (int index) const       { return Expression (ter
 //==============================================================================\r
 ReferenceCountedObjectPtr<Expression::Term> Expression::Term::negated()\r
 {\r
-    return *new Helpers::Negate (*this);\r
+    return new Helpers::Negate (this);\r
 }\r
 \r
 //==============================================================================\r
index c64143d6917858bdcea8d2ace653528caece3fd8..09ef93b734fd6c1626ec52909484d9b3d6233f97 100644 (file)
@@ -243,6 +243,10 @@ private:
     //==============================================================================\r
     class Term;\r
     struct Helpers;\r
+    friend class Term;\r
+    friend struct Helpers;\r
+    friend struct ContainerDeletePolicy<Term>;\r
+    friend class ReferenceCountedObjectPtr<Term>;\r
     ReferenceCountedObjectPtr<Term> term;\r
 \r
     explicit Expression (Term*);\r
index d673693fc1372d6f90dcc571ddbc570ca6fa2cac..d8e1bf364e8fe2128c05afa3719d952de96ee3ae 100644 (file)
@@ -42,7 +42,7 @@ using uint16    = unsigned short;
 /** A platform-independent 32-bit signed integer type. */\r
 using int32     = signed int;\r
 /** A platform-independent 32-bit unsigned integer type. */\r
-using uint32    = unsigned int;\r
+typedef unsigned int                uint32;\r
 \r
 #if JUCE_MSVC\r
   /** A platform-independent 64-bit integer type. */\r
@@ -197,6 +197,7 @@ void findMinAndMax (const Type* values, int numValues, Type& lowest, Type& highe
     }\r
 }\r
 \r
+\r
 //==============================================================================\r
 /** Constrains a value to keep it within a given range.\r
 \r
@@ -264,25 +265,6 @@ bool isPositiveAndNotGreaterThan (int valueToTest, Type upperLimit) noexcept
     return static_cast<unsigned int> (valueToTest) <= static_cast<unsigned int> (upperLimit);\r
 }\r
 \r
-/** Computes the absolute difference between two values and returns true if it is less than or equal\r
-    to a given tolerance, otherwise it returns false.\r
-*/\r
-template <typename Type>\r
-bool isWithin (Type a, Type b, Type tolerance) noexcept\r
-{\r
-    return std::abs (a - b) <= tolerance;\r
-}\r
-\r
-/** Returns true if the two numbers are approximately equal. This is useful for floating-point\r
-    and double comparisons.\r
-*/\r
-template <typename Type>\r
-bool approximatelyEqual (Type a, Type b) noexcept\r
-{\r
-    return std::abs (a - b) <= (std::numeric_limits<Type>::epsilon() * std::max (a, b))\r
-            || std::abs (a - b) < std::numeric_limits<Type>::min();\r
-}\r
-\r
 //==============================================================================\r
 /** Handy function for avoiding unused variables warning. */\r
 template <typename... Types>\r
index 92bc71c67594c90530cbcb7c4115cda0673f0eeb..e5bb1cd21cd60cc919b030b81e67843e704d63c1 100644 (file)
@@ -50,9 +50,9 @@ public:
         : start (other.start), end (other.end),\r
           interval (other.interval), skew (other.skew),\r
           symmetricSkew (other.symmetricSkew),\r
-          convertFrom0To1Function  (static_cast<ConversionFunction&&> (other.convertFrom0To1Function)),\r
-          convertTo0To1Function    (static_cast<ConversionFunction&&> (other.convertTo0To1Function)),\r
-          snapToLegalValueFunction (static_cast<ConversionFunction&&> (other.snapToLegalValueFunction))\r
+          convertFrom0To1Function  (static_cast<ConverstionFunction&&> (other.convertFrom0To1Function)),\r
+          convertTo0To1Function    (static_cast<ConverstionFunction&&> (other.convertTo0To1Function)),\r
+          snapToLegalValueFunction (static_cast<ConverstionFunction&&> (other.snapToLegalValueFunction))\r
     {\r
     }\r
 \r
@@ -64,9 +64,9 @@ public:
         interval = other.interval;\r
         skew = other.skew;\r
         symmetricSkew = other.symmetricSkew;\r
-        convertFrom0To1Function  = static_cast<ConversionFunction&&> (other.convertFrom0To1Function);\r
-        convertTo0To1Function    = static_cast<ConversionFunction&&> (other.convertTo0To1Function);\r
-        snapToLegalValueFunction = static_cast<ConversionFunction&&> (other.snapToLegalValueFunction);\r
+        convertFrom0To1Function  = static_cast<ConverstionFunction&&> (other.convertFrom0To1Function);\r
+        convertTo0To1Function    = static_cast<ConverstionFunction&&> (other.convertTo0To1Function);\r
+        snapToLegalValueFunction = static_cast<ConverstionFunction&&> (other.snapToLegalValueFunction);\r
 \r
         return *this;\r
     }\r
@@ -274,11 +274,11 @@ private:
         return clampedValue;\r
     }\r
 \r
-    using ConversionFunction = std::function<ValueType(ValueType, ValueType, ValueType)>;\r
+    using ConverstionFunction = std::function<ValueType(ValueType, ValueType, ValueType)>;\r
 \r
-    ConversionFunction convertFrom0To1Function  = {},\r
-                       convertTo0To1Function    = {},\r
-                       snapToLegalValueFunction = {};\r
+    ConverstionFunction convertFrom0To1Function  = {},\r
+                        convertTo0To1Function    = {},\r
+                        snapToLegalValueFunction = {};\r
 };\r
 \r
 } // namespace juce\r
index 4fe3d671bcf86381bf670f7d5f18962588ddb037..f534a53affb93e30b6170d2e6d518b8a22e357f1 100644 (file)
@@ -41,7 +41,9 @@ class Range
 public:\r
     //==============================================================================\r
     /** Constructs an empty range. */\r
-    Range() = default;\r
+    Range() noexcept  : start(), end()\r
+    {\r
+    }\r
 \r
     /** Constructs a range with given start and end values. */\r
     Range (const ValueType startValue, const ValueType endValue) noexcept\r
@@ -50,10 +52,18 @@ public:
     }\r
 \r
     /** Constructs a copy of another range. */\r
-    Range (const Range&) = default;\r
+    Range (const Range& other) noexcept\r
+        : start (other.start), end (other.end)\r
+    {\r
+    }\r
 \r
     /** Copies another range object. */\r
-    Range& operator= (const Range&) = default;\r
+    Range& operator= (Range other) noexcept\r
+    {\r
+        start = other.start;\r
+        end = other.end;\r
+        return *this;\r
+    }\r
 \r
     /** Returns the range that lies between two positions (in either order). */\r
     static Range between (const ValueType position1, const ValueType position2) noexcept\r
@@ -291,7 +301,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    ValueType start{}, end{};\r
+    ValueType start, end;\r
 };\r
 \r
 } // namespace juce\r
index 4c62b13899a11750c6ccb8681e827df1b66a3b3e..3e00bce4fa9ee76f7678e5afa6f3856252d59854 100644 (file)
@@ -36,7 +36,11 @@ class StatisticsAccumulator
 public:\r
     //==============================================================================\r
     /** Constructs a new StatisticsAccumulator. */\r
-    StatisticsAccumulator() = default;\r
+    StatisticsAccumulator() noexcept\r
+        : count (0),\r
+          minimum ( std::numeric_limits<FloatType>::infinity()),\r
+          maximum (-std::numeric_limits<FloatType>::infinity())\r
+    {}\r
 \r
     //==============================================================================\r
     /** Add a new value to the accumulator.\r
@@ -112,7 +116,7 @@ private:
     //==============================================================================\r
     struct KahanSum\r
     {\r
-        KahanSum() = default;\r
+        KahanSum() noexcept : sum(), error() {}\r
         operator FloatType() const noexcept             { return sum; }\r
 \r
         void JUCE_NO_ASSOCIATIVE_MATH_OPTIMISATIONS operator+= (FloatType value) noexcept\r
@@ -123,14 +127,13 @@ private:
             sum = newSum;\r
         }\r
 \r
-        FloatType sum{}, error{};\r
+        FloatType sum, error;\r
     };\r
 \r
     //==============================================================================\r
-    size_t count { 0 };\r
+    size_t count;\r
     KahanSum sum, sumSquares;\r
-    FloatType minimum {  std::numeric_limits<FloatType>::infinity() },\r
-              maximum { -std::numeric_limits<FloatType>::infinity() };\r
+    FloatType minimum, maximum;\r
 };\r
 \r
 } // namespace juce\r
index a6682dc0d7113e9610b3c69da00ba7d7d41366f6..2a3d1feb91609543c58b9605e857e4cc38f7a09c 100644 (file)
@@ -40,10 +40,10 @@ namespace juce
 template <typename Type>\r
 struct Atomic  final\r
 {\r
-    using DiffType = typename AtomicHelpers::DiffTypeHelper<Type>::Type;\r
+    typedef typename AtomicHelpers::DiffTypeHelper<Type>::Type DiffType;\r
 \r
     /** Creates a new value, initialised to zero. */\r
-    Atomic() noexcept  : value (Type()) {}\r
+    Atomic() noexcept  : value (0) {}\r
 \r
     /** Creates a new value, with a given initial value. */\r
     Atomic (Type initialValue) noexcept  : value (initialValue) {}\r
index ce1f98bbfbe6f4c70dcb91dfc0dab357d37f6133..24e6746a2ec305bf71fc619533ae4506f19396a2 100644 (file)
@@ -85,11 +85,6 @@ namespace HeapBlockHelper
 template <class ElementType, bool throwOnFailure = false>\r
 class HeapBlock\r
 {\r
-private:\r
-    template <class OtherElementType>\r
-    using AllowConversion = typename std::enable_if<std::is_base_of<typename std::remove_pointer<ElementType>::type,\r
-                                                                    typename std::remove_pointer<OtherElementType>::type>::value>::type;\r
-\r
 public:\r
     //==============================================================================\r
     /** Creates a HeapBlock which is initially just a null pointer.\r
@@ -152,30 +147,6 @@ public:
         return *this;\r
     }\r
 \r
-    /** Converting move constructor.\r
-        Only enabled if this is a HeapBlock<Base*> and the other object is a HeapBlock<Derived*>,\r
-        where std::is_base_of<Base, Derived>::value == true.\r
-    */\r
-    template <class OtherElementType, bool otherThrowOnFailure, typename = AllowConversion<OtherElementType>>\r
-    HeapBlock (HeapBlock<OtherElementType, otherThrowOnFailure>&& other) noexcept\r
-        : data (reinterpret_cast<ElementType*> (other.data))\r
-    {\r
-        other.data = nullptr;\r
-    }\r
-\r
-    /** Converting move assignment operator.\r
-        Only enabled if this is a HeapBlock<Base*> and the other object is a HeapBlock<Derived*>,\r
-        where std::is_base_of<Base, Derived>::value == true.\r
-    */\r
-    template <class OtherElementType, bool otherThrowOnFailure, typename = AllowConversion<OtherElementType>>\r
-    HeapBlock& operator= (HeapBlock<OtherElementType, otherThrowOnFailure>&& other) noexcept\r
-    {\r
-        free();\r
-        data = reinterpret_cast<ElementType*> (other.data);\r
-        other.data = nullptr;\r
-        return *this;\r
-    }\r
-\r
     //==============================================================================\r
     /** Returns a raw pointer to the allocated data.\r
         This may be a null pointer if the data hasn't yet been allocated, or if it has been\r
@@ -325,7 +296,7 @@ public:
     }\r
 \r
     /** This typedef can be used to get the type of the heapblock's elements. */\r
-    using Type = ElementType;\r
+    typedef ElementType Type;\r
 \r
 private:\r
     //==============================================================================\r
@@ -340,9 +311,6 @@ private:
        #endif\r
     }\r
 \r
-    template <class OtherElementType, bool otherThrowOnFailure>\r
-    friend class HeapBlock;\r
-\r
    #if ! (defined (JUCE_DLL) || defined (JUCE_DLL_BUILD))\r
     JUCE_DECLARE_NON_COPYABLE (HeapBlock)\r
     JUCE_PREVENT_HEAP_ALLOCATION // Creating a 'new HeapBlock' would be missing the point!\r
diff --git a/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h b/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h
deleted file mode 100644 (file)
index aacf2c5..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
-    This class is a useful way of tracking down hard to find memory leaks when the\r
-    regular LeakedObjectDetector isn't enough.\r
-\r
-    As well as firing when any instances of the OwnerClass type are leaked, it will\r
-    print out a stack trace showing where the leaked object was created. This is obviously\r
-    quite a heavyweight task so, unlike the LeakedObjectDetector which should be always\r
-    be added to your classes, you should only use this object temporarily when you are\r
-    debugging and remove it when finished.\r
-\r
-    To use it, use the JUCE_HEAVYWEIGHT_LEAK_DETECTOR macro as a simple way to put\r
-    one in your class declaration.\r
-\r
-    @tags{Core}\r
-*/\r
-template <class OwnerClass>\r
-class HeavyweightLeakedObjectDetector\r
-{\r
-public:\r
-    //==============================================================================\r
-    HeavyweightLeakedObjectDetector() noexcept                                           { getBacktraceMap().set (this, SystemStats::getStackBacktrace()); }\r
-    HeavyweightLeakedObjectDetector (const HeavyweightLeakedObjectDetector&) noexcept    { getBacktraceMap().set (this, SystemStats::getStackBacktrace()); }\r
-\r
-    ~HeavyweightLeakedObjectDetector()                                                   { getBacktraceMap().remove (this); }\r
-\r
-private:\r
-    //==============================================================================\r
-    typedef HashMap<HeavyweightLeakedObjectDetector<OwnerClass>*, String> BacktraceMap;\r
-\r
-    //==============================================================================\r
-    struct BacktraceMapHolder\r
-    {\r
-        BacktraceMapHolder() noexcept {}\r
-\r
-        ~BacktraceMapHolder()\r
-        {\r
-            if (map.size() > 0)\r
-            {\r
-                DBG ("*** Leaked objects detected: " << map.size() << " instance(s) of class " << getLeakedObjectClassName());\r
-                DBG (getFormattedBacktracesString());\r
-\r
-                /** If you hit this, then you've leaked one or more objects of the type specified by\r
-                    the 'OwnerClass' template parameter - the name and stack trace of its creation should\r
-                    have been printed by the lines above.\r
-\r
-                    If you're leaking, it's probably because you're using old-fashioned, non-RAII techniques for\r
-                    your object management. Tut, tut. Always, always use std::unique_ptrs, OwnedArrays,\r
-                    ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs!\r
-                */\r
-                jassertfalse;\r
-            }\r
-        }\r
-\r
-        String getFormattedBacktracesString() const\r
-        {\r
-            String str;\r
-\r
-            int counter = 1;\r
-            for (typename BacktraceMap::Iterator i (map); i.next();)\r
-            {\r
-                str << "\nBacktrace " << String (counter++)                                << "\n"\r
-                    << "-----------------------------------------------------------------" << "\n"\r
-                    << i.getValue();\r
-            }\r
-\r
-            return str;\r
-        }\r
-\r
-        BacktraceMap map;\r
-    };\r
-\r
-    static BacktraceMap& getBacktraceMap()\r
-    {\r
-        static BacktraceMapHolder holder;\r
-        return holder.map;\r
-    }\r
-\r
-    static const char* getLeakedObjectClassName()\r
-    {\r
-        return OwnerClass::getLeakedObjectClassName();\r
-    }\r
-};\r
-\r
-//==============================================================================\r
-#if DOXYGEN || ! defined (JUCE_HEAVYWEIGHT_LEAK_DETECTOR)\r
- #if (DOXYGEN || JUCE_CHECK_MEMORY_LEAKS)\r
-  /** This macro lets you embed a heavyweight leak-detecting object inside a class.\r
-\r
-      To use it, simply declare a JUCE_HEAVYWEIGHT_LEAK_DETECTOR (YourClassName) inside a private section\r
-      of the class declaration. E.g.\r
-\r
-      @code\r
-      class MyClass\r
-      {\r
-      public:\r
-          MyClass();\r
-          void blahBlah();\r
-\r
-      private:\r
-          JUCE_HEAVYWEIGHT_LEAK_DETECTOR (MyClass)\r
-      };\r
-      @endcode\r
-\r
-      NB: you should only use this when you really need to track down a tricky memory leak, and\r
-      should never leave one of these inside a class!\r
-\r
-      @see HeavyweightLeakedObjectDetector, JUCE_LEAK_DETECTOR, LeakedObjectDetector\r
-  */\r
-  #define JUCE_HEAVYWEIGHT_LEAK_DETECTOR(OwnerClass) \\r
-        friend class juce::HeavyweightLeakedObjectDetector<OwnerClass>; \\r
-        static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \\r
-        juce::HeavyweightLeakedObjectDetector<OwnerClass> JUCE_JOIN_MACRO (leakDetector, __LINE__);\r
- #else\r
-  #define JUCE_HEAVYWEIGHT_LEAK_DETECTOR(OwnerClass)\r
- #endif\r
-#endif\r
-\r
-} // namespace juce\r
index ebe7012a5fc9f13d5ad51d0004b0d23b3934cd71..3e82fa875cc9189b61172895476c110c3807710a 100644 (file)
@@ -29,7 +29,7 @@ inline void zeromem (void* memory, size_t numBytes) noexcept        { memset (me
 \r
 /** Overwrites a structure or object with zeros. */\r
 template <typename Type>\r
-inline void zerostruct (Type& structure) noexcept                   { memset ((void*) &structure, 0, sizeof (structure)); }\r
+inline void zerostruct (Type& structure) noexcept                   { memset (&structure, 0, sizeof (structure)); }\r
 \r
 /** Delete an object pointer, and sets the pointer to null.\r
 \r
index b94223356e6f8e5e0725b662b289767ca9eed1b4..a245c8a003cfd028e7876d409b803b9c127d19b2 100644 (file)
@@ -27,6 +27,7 @@ namespace juce
 /**\r
     A class to hold a resizable block of raw data.\r
 \r
+\r
     @tags{Core}\r
 */\r
 class JUCE_API  MemoryBlock\r
@@ -251,7 +252,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    using HeapBlockType = HeapBlock<char, true>;\r
+    typedef HeapBlock<char, true> HeapBlockType;\r
     HeapBlockType data;\r
     size_t size = 0;\r
 \r
index 58ef79ba98abcff10223d69a20b0b2473bfa90b8..61000b0737e790099075ace4c63ddd5dc414cfb3 100644 (file)
@@ -49,7 +49,7 @@ namespace juce
     Once a new ReferenceCountedObject has been assigned to a pointer, be\r
     careful not to delete the object manually.\r
 \r
-    This class uses an Atomic<int> value to hold the reference count, so that\r
+    This class uses an Atomic<int> value to hold the reference count, so that it\r
     the pointers can be passed between threads safely. For a faster but non-thread-safe\r
     version, use SingleThreadedReferenceCountedObject instead.\r
 \r
@@ -260,15 +260,6 @@ public:
         incIfNotNull (refCountedObject);\r
     }\r
 \r
-    /** Creates a pointer to an object.\r
-        This will increment the object's reference-count.\r
-    */\r
-    ReferenceCountedObjectPtr (ReferencedType& refCountedObject) noexcept\r
-        : referencedObject (&refCountedObject)\r
-    {\r
-        refCountedObject.incReferenceCount();\r
-    }\r
-\r
     /** Copies another pointer.\r
         This will increment the object's reference-count.\r
     */\r
@@ -278,13 +269,6 @@ public:
         incIfNotNull (referencedObject);\r
     }\r
 \r
-    /** Takes-over the object from another pointer. */\r
-    ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept\r
-        : referencedObject (other.referencedObject)\r
-    {\r
-        other.referencedObject = nullptr;\r
-    }\r
-\r
     /** Copies another pointer.\r
         This will increment the object's reference-count (if it is non-null).\r
     */\r
@@ -321,40 +305,26 @@ public:
     */\r
     ReferenceCountedObjectPtr& operator= (ReferencedType* newObject)\r
     {\r
-        if (newObject != nullptr)\r
-            return operator= (*newObject);\r
-\r
-        reset();\r
-        return *this;\r
-    }\r
-\r
-    /** Changes this pointer to point at a different object.\r
-\r
-        The reference count of the old object is decremented, and it might be\r
-        deleted if it hits zero. The new object's count is incremented.\r
-    */\r
-    ReferenceCountedObjectPtr& operator= (ReferencedType& newObject)\r
-    {\r
-        if (referencedObject != &newObject)\r
+        if (referencedObject != newObject)\r
         {\r
-            newObject.incReferenceCount();\r
+            incIfNotNull (newObject);\r
             auto* oldObject = referencedObject;\r
-            referencedObject = &newObject;\r
+            referencedObject = newObject;\r
             decIfNotNull (oldObject);\r
         }\r
 \r
         return *this;\r
     }\r
 \r
-    /** Resets this pointer to a null pointer. */\r
-    ReferenceCountedObjectPtr& operator= (decltype (nullptr))\r
+    /** Takes-over the object from another pointer. */\r
+    ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept\r
+        : referencedObject (other.referencedObject)\r
     {\r
-        reset();\r
-        return *this;\r
+        other.referencedObject = nullptr;\r
     }\r
 \r
     /** Takes-over the object from another pointer. */\r
-    ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) noexcept\r
+    ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other)\r
     {\r
         std::swap (referencedObject, other.referencedObject);\r
         return *this;\r
@@ -373,15 +343,17 @@ public:
     /** Returns the object that this pointer references.\r
         The pointer returned may be null, of course.\r
     */\r
-    ReferencedType* get() const noexcept                    { return referencedObject; }\r
+    operator ReferencedType*() const noexcept       { return referencedObject; }\r
 \r
-    /** Resets this object to a null pointer. */\r
-    void reset() noexcept\r
-    {\r
-        auto oldObject = referencedObject;  // need to null the pointer before deleting the object\r
-        referencedObject = nullptr;         // in case this ptr is itself deleted as a side-effect\r
-        decIfNotNull (oldObject);           // of the destructor\r
-    }\r
+    /** Returns the object that this pointer references.\r
+        The pointer returned may be null, of course.\r
+    */\r
+    ReferencedType* get() const noexcept            { return referencedObject; }\r
+\r
+    /** Returns the object that this pointer references.\r
+        The pointer returned may be null, of course.\r
+    */\r
+    ReferencedType* getObject() const noexcept      { return referencedObject; }\r
 \r
     // the -> operator is called on the referenced object\r
     ReferencedType* operator->() const noexcept\r
@@ -390,43 +362,6 @@ public:
         return referencedObject;\r
     }\r
 \r
-    /** Dereferences the object that this pointer references.\r
-        The pointer returned may be null, of course.\r
-    */\r
-    ReferencedType& operator*() const noexcept              { jassert (referencedObject != nullptr); return *referencedObject; }\r
-\r
-    /** Checks whether this pointer is null */\r
-    bool operator== (decltype (nullptr)) const noexcept     { return referencedObject == nullptr; }\r
-    /** Checks whether this pointer is null */\r
-    bool operator!= (decltype (nullptr)) const noexcept     { return referencedObject != nullptr; }\r
-\r
-    /** Compares two ReferenceCountedObjectPtrs. */\r
-    bool operator== (const ObjectType* other) const noexcept                 { return referencedObject == other; }\r
-    /** Compares two ReferenceCountedObjectPtrs. */\r
-    bool operator== (const ReferenceCountedObjectPtr& other) const noexcept  { return referencedObject == other.get(); }\r
-    /** Compares two ReferenceCountedObjectPtrs. */\r
-    bool operator!= (const ObjectType* other) const noexcept                 { return referencedObject != other; }\r
-    /** Compares two ReferenceCountedObjectPtrs. */\r
-    bool operator!= (const ReferenceCountedObjectPtr& other) const noexcept  { return referencedObject != other.get(); }\r
-\r
-   #if JUCE_STRICT_REFCOUNTEDPOINTER\r
-    /** Checks whether this pointer is null */\r
-    explicit operator bool() const noexcept                 { return referencedObject != nullptr; }\r
-\r
-   #else\r
-    /** Returns the object that this pointer references.\r
-        The pointer returned may be null, of course.\r
-        Note that this methods allows the compiler to be very lenient with what it allows you to do\r
-        with the pointer, it's safer to disable this by setting JUCE_STRICT_REFCOUNTEDPOINTER=1, which\r
-        increased type safety and can prevent some common slip-ups.\r
-    */\r
-    operator ReferencedType*() const noexcept               { return referencedObject; }\r
-   #endif\r
-\r
-\r
-    // This old method is deprecated in favour of the shorter and more standard get() method.\r
-    JUCE_DEPRECATED_WITH_BODY (ReferencedType* getObject() const, { return get(); })\r
-\r
 private:\r
     //==============================================================================\r
     ReferencedType* referencedObject = nullptr;\r
@@ -447,15 +382,43 @@ private:
 \r
 //==============================================================================\r
 /** Compares two ReferenceCountedObjectPtrs. */\r
-template <typename Type>\r
-bool operator== (const Type* object1, const ReferenceCountedObjectPtr<Type>& object2) noexcept\r
+template <typename ObjectType>\r
+bool operator== (const ReferenceCountedObjectPtr<ObjectType>& object1, ObjectType* const object2) noexcept\r
+{\r
+    return object1.get() == object2;\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator== (const ReferenceCountedObjectPtr<ObjectType>& object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
+{\r
+    return object1.get() == object2.get();\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator== (ObjectType* object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
 {\r
     return object1 == object2.get();\r
 }\r
 \r
 /** Compares two ReferenceCountedObjectPtrs. */\r
-template <typename Type>\r
-bool operator!= (const Type* object1, const ReferenceCountedObjectPtr<Type>& object2) noexcept\r
+template <typename ObjectType>\r
+bool operator!= (const ReferenceCountedObjectPtr<ObjectType>& object1, const ObjectType* object2) noexcept\r
+{\r
+    return object1.get() != object2;\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator!= (const ReferenceCountedObjectPtr<ObjectType>& object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
+{\r
+    return object1.get() != object2.get();\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator!= (ObjectType* object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
 {\r
     return object1 != object2.get();\r
 }\r
index 015b84f7bba6bf78a009e114efd0254028996696..186889366a63fd400b3fb29bd9959ae4b4c0063c 100644 (file)
@@ -162,12 +162,6 @@ public:
             object = newObject;\r
             ContainerDeletePolicy<ObjectType>::destroy (oldObject);\r
         }\r
-        else\r
-        {\r
-            // You're trying to reset this ScopedPointer to itself! This will work here as ScopedPointer does an equality check\r
-            // but be aware that std::unique_ptr won't do this and you could end up with some nasty, subtle bugs!\r
-            jassert (newObject == nullptr);\r
-        }\r
     }\r
 \r
     /** Sets this pointer to a new object, deleting the old object that it was previously pointing to if there was one. */\r
index 234b799c5c24d964d7e564d9c1d44a6d63f0e079..80fdf33a4e3f79eead41bbc7a7cd27065d05dc95 100644 (file)
@@ -39,7 +39,7 @@ namespace juce
     the underlying object is also immediately destroyed. This allows you to use scoping\r
     to manage the lifetime of a shared resource.\r
 \r
-    Note: The construction/deletion of the shared object must not involve any\r
+    Note: the construction/deletion of the shared object must not involve any\r
     code that makes recursive calls to a SharedResourcePointer, or you'll cause\r
     a deadlock.\r
 \r
index 166313b48660b2906a45f657824a8d3e00d814a8..b3d3d3f996a8bffd5195cb65a100d0a4aa57680e 100644 (file)
@@ -32,16 +32,18 @@ namespace juce
     It must embed a WeakReference::Master object, which stores a shared pointer object, and must clear\r
     this master pointer in its destructor.\r
 \r
-    Note that WeakReference is not designed to be thread-safe, so if you're accessing it from\r
-    different threads, you'll need to do your own locking around all uses of the pointer and\r
-    the object it refers to.\r
-\r
     E.g.\r
     @code\r
     class MyObject\r
     {\r
     public:\r
-        MyObject() {}\r
+        MyObject()\r
+        {\r
+            // If you're planning on using your WeakReferences in a multi-threaded situation, you may choose\r
+            // to create a WeakReference to the object here in the constructor, which will pre-initialise the\r
+            // embedded object, avoiding an (extremely unlikely) race condition that could occur if multiple\r
+            // threads overlap while creating the first WeakReference to it.\r
+        }\r
 \r
         ~MyObject()\r
         {\r
@@ -61,12 +63,12 @@ namespace juce
 \r
     // Here's an example of using a pointer..\r
 \r
-    auto* n = new MyObject();\r
+    MyObject* n = new MyObject();\r
     WeakReference<MyObject> myObjectRef = n;\r
 \r
-    auto pointer1 = myObjectRef.get();  // returns a valid pointer to 'n'\r
+    MyObject* pointer1 = myObjectRef;  // returns a valid pointer to 'n'\r
     delete n;\r
-    auto pointer2 = myObjectRef.get();  // now returns nullptr\r
+    MyObject* pointer2 = myObjectRef;  // returns a null pointer\r
     @endcode\r
 \r
     @see WeakReference::Master\r
@@ -141,7 +143,7 @@ public:
         JUCE_DECLARE_NON_COPYABLE (SharedPointer)\r
     };\r
 \r
-    using SharedRef = ReferenceCountedObjectPtr<SharedPointer>;\r
+    typedef ReferenceCountedObjectPtr<SharedPointer> SharedRef;\r
 \r
     //==============================================================================\r
     /**\r
@@ -164,11 +166,11 @@ public:
         /** The first call to this method will create an internal object that is shared by all weak\r
             references to the object.\r
         */\r
-        SharedRef getSharedPointer (ObjectType* object)\r
+        SharedPointer* getSharedPointer (ObjectType* object)\r
         {\r
             if (sharedPointer == nullptr)\r
             {\r
-                sharedPointer = *new SharedPointer (object);\r
+                sharedPointer = new SharedPointer (object);\r
             }\r
             else\r
             {\r
@@ -204,12 +206,9 @@ public:
 private:\r
     SharedRef holder;\r
 \r
-    static inline SharedRef getRef (ObjectType* o)\r
+    static inline SharedPointer* getRef (ObjectType* o)\r
     {\r
-        if (o != nullptr)\r
-            return o->masterReference.getSharedPointer (o);\r
-\r
-        return {};\r
+        return (o != nullptr) ? o->masterReference.getSharedPointer (o) : nullptr;\r
     }\r
 };\r
 \r
@@ -235,9 +234,9 @@ private:
      @see WeakReference, WeakReference::Master\r
 */\r
 #define JUCE_DECLARE_WEAK_REFERENCEABLE(Class) \\r
-    struct WeakRefMaster  : public juce::WeakReference<Class>::Master { ~WeakRefMaster() { this->clear(); } }; \\r
+    struct WeakRefMaster  : public WeakReference<Class>::Master { ~WeakRefMaster() { this->clear(); } }; \\r
     WeakRefMaster masterReference; \\r
-    friend class juce::WeakReference<Class>; \\r
+    friend class WeakReference<Class>; \\r
 \r
 \r
 } // namespace juce\r
diff --git a/modules/juce_core/misc/juce_ConsoleApplication.cpp b/modules/juce_core/misc/juce_ConsoleApplication.cpp
deleted file mode 100644 (file)
index ccc76b9..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-File ArgumentList::Argument::resolveAsFile() const\r
-{\r
-    return File::getCurrentWorkingDirectory().getChildFile (text.unquoted());\r
-}\r
-\r
-File ArgumentList::Argument::resolveAsExistingFile() const\r
-{\r
-    auto f = resolveAsFile();\r
-\r
-    if (! f.exists())\r
-        ConsoleApplication::fail ("Could not find file: " + f.getFullPathName());\r
-\r
-    return f;\r
-}\r
-\r
-File ArgumentList::Argument::resolveAsExistingFolder() const\r
-{\r
-    auto f = resolveAsFile();\r
-\r
-    if (! f.isDirectory())\r
-        ConsoleApplication::fail ("Could not find folder: " + f.getFullPathName());\r
-\r
-    return f;\r
-}\r
-\r
-bool ArgumentList::Argument::isLongOption() const     { return text[0] == '-' && text[1] == '-' && text[2] != '-'; }\r
-bool ArgumentList::Argument::isShortOption() const    { return text[0] == '-' && text[1] != '-'; }\r
-\r
-bool ArgumentList::Argument::isLongOption (const String& option) const\r
-{\r
-    if (option.startsWith ("--"))\r
-        return text == option;\r
-\r
-    jassert (! option.startsWithChar ('-')); // this will always fail to match\r
-\r
-    return text == "--" + option;\r
-}\r
-\r
-bool ArgumentList::Argument::isShortOption (char option) const\r
-{\r
-    jassert (option != '-'); // this is probably not what you intended to pass in\r
-\r
-    return isShortOption() && text.containsChar (option);\r
-}\r
-\r
-static bool compareOptionStrings (StringRef s1, StringRef s2)\r
-{\r
-    if (s1 == s2)\r
-        return true;\r
-\r
-    auto toks1 = StringArray::fromTokens (s1, "|", {});\r
-    auto toks2 = StringArray::fromTokens (s2, "|", {});\r
-\r
-    for (auto& part1 : toks1)\r
-        for (auto& part2 : toks2)\r
-            if (part1.trim() == part2.trim())\r
-                return true;\r
-\r
-    return false;\r
-}\r
-\r
-bool ArgumentList::Argument::operator== (StringRef s) const   { return compareOptionStrings (text, s); }\r
-bool ArgumentList::Argument::operator!= (StringRef s) const   { return ! operator== (s); }\r
-\r
-//==============================================================================\r
-ArgumentList::ArgumentList (String exeName, StringArray args)\r
-    : executableName (std::move (exeName))\r
-{\r
-    args.trim();\r
-\r
-    for (auto& a : args)\r
-        arguments.add ({ a });\r
-}\r
-\r
-ArgumentList::ArgumentList (int argc, char* argv[])\r
-    : ArgumentList (argv[0], StringArray (argv + 1, argc - 1))\r
-{\r
-}\r
-\r
-ArgumentList::ArgumentList (const String& exeName, const String& args)\r
-    : ArgumentList (exeName, StringArray::fromTokens (args, true))\r
-{\r
-}\r
-\r
-int ArgumentList::size() const                                      { return arguments.size(); }\r
-ArgumentList::Argument ArgumentList::operator[] (int index) const   { return arguments[index]; }\r
-\r
-void ArgumentList::checkMinNumArguments (int expectedMinNumberOfArgs) const\r
-{\r
-    if (size() < expectedMinNumberOfArgs)\r
-        ConsoleApplication::fail ("Not enough arguments!");\r
-}\r
-\r
-int ArgumentList::indexOfOption (StringRef option) const\r
-{\r
-    jassert (option == String (option).trim()); // passing non-trimmed strings will always fail to find a match!\r
-\r
-    for (int i = 0; i < arguments.size(); ++i)\r
-        if (arguments.getReference(i) == option)\r
-            return i;\r
-\r
-    return -1;\r
-}\r
-\r
-bool ArgumentList::containsOption (StringRef option) const\r
-{\r
-    return indexOfOption (option) >= 0;\r
-}\r
-\r
-void ArgumentList::failIfOptionIsMissing (StringRef option) const\r
-{\r
-    if (! containsOption (option))\r
-        ConsoleApplication::fail ("Expected the option " + option);\r
-}\r
-\r
-ArgumentList::Argument ArgumentList::getArgumentAfterOption (StringRef option) const\r
-{\r
-    for (int i = 0; i < arguments.size() - 1; ++i)\r
-        if (arguments.getReference(i) == option)\r
-            return arguments.getReference (i + 1);\r
-\r
-    return {};\r
-}\r
-\r
-File ArgumentList::getFileAfterOption (StringRef option) const\r
-{\r
-    failIfOptionIsMissing (option);\r
-    auto arg = getArgumentAfterOption (option);\r
-\r
-    if (arg.text.isEmpty() || arg.text.startsWithChar ('-'))\r
-        ConsoleApplication::fail ("Expected a filename after the " + option + " option");\r
-\r
-    return arg.resolveAsFile();\r
-}\r
-\r
-File ArgumentList::getExistingFileAfterOption (StringRef option) const\r
-{\r
-    failIfOptionIsMissing (option);\r
-    auto arg = getArgumentAfterOption (option);\r
-\r
-    if (arg.text.isEmpty())\r
-        ConsoleApplication::fail ("Expected a filename after the " + option + " option");\r
-\r
-    return arg.resolveAsExistingFile();\r
-}\r
-\r
-File ArgumentList::getExistingFolderAfterOption (StringRef option) const\r
-{\r
-    failIfOptionIsMissing (option);\r
-    auto arg = getArgumentAfterOption (option);\r
-\r
-    if (arg.text.isEmpty())\r
-        ConsoleApplication::fail ("Expected a folder name after the " + option + " option");\r
-\r
-    return arg.resolveAsExistingFolder();\r
-}\r
-\r
-//==============================================================================\r
-struct ConsoleAppFailureCode\r
-{\r
-    String errorMessage;\r
-    int returnCode;\r
-};\r
-\r
-void ConsoleApplication::fail (String errorMessage, int returnCode)\r
-{\r
-    throw ConsoleAppFailureCode { std::move (errorMessage), returnCode };\r
-}\r
-\r
-int ConsoleApplication::invokeCatchingFailures (std::function<int()>&& f)\r
-{\r
-    int returnCode = 0;\r
-\r
-    try\r
-    {\r
-        returnCode = f();\r
-    }\r
-    catch (const ConsoleAppFailureCode& error)\r
-    {\r
-        std::cout << error.errorMessage << std::endl;\r
-        returnCode = error.returnCode;\r
-    }\r
-\r
-    return returnCode;\r
-}\r
-\r
-int ConsoleApplication::findAndRunCommand (const ArgumentList& args) const\r
-{\r
-    for (auto& c : commands)\r
-        if (args.containsOption (c.commandOption))\r
-            return invokeCatchingFailures ([&] { c.command (args); return 0; });\r
-\r
-    if (commandIfNoOthersRecognised.isNotEmpty())\r
-        for (auto& c : commands)\r
-            if (compareOptionStrings (c.commandOption, commandIfNoOthersRecognised))\r
-                return invokeCatchingFailures ([&] { c.command (args); return 0; });\r
-\r
-    fail ("Unrecognised arguments");\r
-    return 0;\r
-}\r
-\r
-int ConsoleApplication::findAndRunCommand (int argc, char* argv[]) const\r
-{\r
-    return findAndRunCommand (ArgumentList (argc, argv));\r
-}\r
-\r
-void ConsoleApplication::addCommand (Command c)\r
-{\r
-    commands.emplace_back (std::move (c));\r
-}\r
-\r
-void ConsoleApplication::addHelpCommand (String arg, String helpMessage, bool invokeIfNoOtherCommandRecognised)\r
-{\r
-    addCommand ({ arg, arg, "Prints this message",\r
-                  [this, helpMessage] (const ArgumentList& args) { printHelp (helpMessage, args); }});\r
-\r
-    if (invokeIfNoOtherCommandRecognised)\r
-        commandIfNoOthersRecognised = arg;\r
-}\r
-\r
-void ConsoleApplication::addVersionCommand (String arg, String versionText)\r
-{\r
-    addCommand ({ arg, arg, "Prints the current version number",\r
-                  [versionText] (const ArgumentList&)\r
-                  {\r
-                      std::cout << versionText << std::endl;\r
-                  }});\r
-}\r
-\r
-void ConsoleApplication::printHelp (const String& preamble, const ArgumentList& args) const\r
-{\r
-    std::cout << preamble << std::endl;\r
-\r
-    auto exeName = args.executableName.fromLastOccurrenceOf ("/", false, false)\r
-                                      .fromLastOccurrenceOf ("\\", false, false);\r
-\r
-    StringArray namesAndArgs;\r
-    int maxLength = 0;\r
-\r
-    for (auto& c : commands)\r
-    {\r
-        auto nameAndArgs = exeName + " " + c.argumentDescription;\r
-        namesAndArgs.add (nameAndArgs);\r
-        maxLength = std::max (maxLength, nameAndArgs.length());\r
-    }\r
-\r
-    for (size_t i = 0; i < commands.size(); ++i)\r
-        std::cout << " " << namesAndArgs[(int) i].paddedRight (' ', maxLength + 2)\r
-                  << commands[i].commandDescription << std::endl;\r
-\r
-    std::cout << std::endl;\r
-}\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_core/misc/juce_ConsoleApplication.h b/modules/juce_core/misc/juce_ConsoleApplication.h
deleted file mode 100644 (file)
index c6ff882..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
-    Holds a list of command-line arguments, and provides useful methods for searching\r
-    and operating on them.\r
-\r
-    You can create an ArgumentList manually, or give it some argv/argc values from a\r
-    main() function to parse.\r
-\r
-    @see ConsoleApplication\r
-*/\r
-struct ArgumentList\r
-{\r
-    /** Creates an argument list for a given executable. */\r
-    ArgumentList (String executable, StringArray arguments);\r
-\r
-    /** Parses a standard argv/argc pair to create an argument list. */\r
-    ArgumentList (int argc, char* argv[]);\r
-\r
-    /** Tokenises a string containing all the arguments to create an argument list. */\r
-    ArgumentList (const String& executable, const String& arguments);\r
-\r
-    ArgumentList (const ArgumentList&) = default;\r
-    ArgumentList& operator= (const ArgumentList&) = default;\r
-\r
-    //==============================================================================\r
-    /**\r
-        One of the arguments in an ArgumentList.\r
-    */\r
-    struct Argument\r
-    {\r
-        /** The original text of this argument. */\r
-        String text;\r
-\r
-        /** Resolves this argument as an absolute File, using the current working\r
-            directory as a base for resolving relative paths, and stripping quotes, etc.\r
-        */\r
-        File resolveAsFile() const;\r
-\r
-        /** Resolves this argument as an absolute File, using the current working\r
-            directory as a base for resolving relative paths, and also doing a check to\r
-            make sure the file exists.\r
-            If the file doesn't exist, this will call fail() with a suitable error.\r
-            @see resolveAsFile, resolveAsExistingFolder\r
-        */\r
-        File resolveAsExistingFile() const;\r
-\r
-        /** Resolves a user-supplied folder name into an absolute File, using the current working\r
-            directory as a base for resolving relative paths, and also doing a check to make\r
-            sure the folder exists.\r
-            If the folder doesn't exist, this will call fail() with a suitable error.\r
-            @see resolveAsFile, resolveAsExistingFile\r
-        */\r
-        File resolveAsExistingFolder() const;\r
-\r
-        /** Returns true if this argument starts with a double dash. */\r
-        bool isLongOption() const;\r
-\r
-        /** Returns true if this argument starts with a single dash. */\r
-        bool isShortOption() const;\r
-\r
-        /** Returns true if this argument starts with a double dash, followed by the given string. */\r
-        bool isLongOption (const String& optionRoot) const;\r
-\r
-        /** Returns true if this argument starts with a single dash and then contains the given character somewhere inside it. */\r
-        bool isShortOption (char shortOptionCharacter) const;\r
-\r
-        /** Compares this argument against a string.\r
-            The string may be a pipe-separated list of options, e.g. "--help|-h"\r
-        */\r
-        bool operator== (StringRef stringToCompare) const;\r
-\r
-        /** Compares this argument against a string.\r
-            The string may be a pipe-separated list of options, e.g. "--help|-h"\r
-        */\r
-        bool operator!= (StringRef stringToCompare) const;\r
-    };\r
-\r
-    //==============================================================================\r
-    /** Returns the number of arguments in the list. */\r
-    int size() const;\r
-\r
-    /** Returns one of the arguments */\r
-    Argument operator[] (int index) const;\r
-\r
-    /** Throws an error unless there are at least the given number of arguments. */\r
-    void checkMinNumArguments (int expectedMinNumberOfArgs) const;\r
-\r
-    /** Returns true if the given string matches one of the arguments.\r
-        The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-    */\r
-    bool containsOption (StringRef option) const;\r
-\r
-    /** Returns the index of the given string if it matches one of the arguments, or -1 if it doesn't.\r
-        The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-    */\r
-    int indexOfOption (StringRef option) const;\r
-\r
-    /** Throws an error unless the given option is found in the argument list. */\r
-    void failIfOptionIsMissing (StringRef option) const;\r
-\r
-    /** Looks for the given argument and returns the one that follows it in the list.\r
-        The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-        If the argument isn't found, this returns an empty string.\r
-    */\r
-    Argument getArgumentAfterOption (StringRef option) const;\r
-\r
-    /** Looks for a given argument and tries to parse the following argument as a file.\r
-        The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-        If the option isn't found, or if the next argument isn't a filename, it will throw\r
-        an error.\r
-    */\r
-    File getFileAfterOption (StringRef option) const;\r
-\r
-    /** Looks for a given argument and tries to parse the following argument as a file\r
-        which must exist for this to succeed.\r
-        The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-        If the option isn't found, or if the next argument isn't a filename, or if the file\r
-        doesn't exist, or if it's a folder rather than a file, then it will throw a suitable error.\r
-    */\r
-    File getExistingFileAfterOption (StringRef option) const;\r
-\r
-    /** Looks for a given argument and tries to parse the following argument as a folder\r
-        which must exist for this to succeed.\r
-        The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-        If the option isn't found, or if the next argument isn't a filename, or if it doesn't\r
-        point to a folder, then it will throw a suitable error.\r
-    */\r
-    File getExistingFolderAfterOption (StringRef option) const;\r
-\r
-    /** The name or path of the executable that was invoked, as it was specified on the command-line. */\r
-    String executableName;\r
-\r
-    /** The list of arguments (not including the name of the executable that was invoked). */\r
-    Array<Argument> arguments;\r
-};\r
-\r
-\r
-//==============================================================================\r
-/**\r
-    Represents a the set of commands that a console app can perform, and provides\r
-    helper functions for performing them.\r
-\r
-    When using these helper classes to implement a console app, you probably want to\r
-    do something along these lines:\r
-\r
-    @code\r
-    int main (int argc, char* argv[])\r
-    {\r
-        ConsoleApplication app;\r
-\r
-        app.addHelpCommand ("--help|-h", "Usage:", true);\r
-        app.addVersionCommand ("--version|-v", "MyApp version 1.2.3");\r
-\r
-        app.addCommand ({ "--foo",\r
-                          "--foo filename",\r
-                          "Performs a foo operation on the given file",\r
-                          [] (const auto& args) { doFoo (args); }});\r
-\r
-        return app.findAndRunCommand (argc, argv);\r
-    }\r
-    @endcode\r
-\r
-    @see ArgumentList\r
-*/\r
-struct ConsoleApplication\r
-{\r
-    //==============================================================================\r
-    /**\r
-        Represents a command that can be executed if its command-line arguments are matched.\r
-        @see ConsoleApplication::addCommand(), ConsoleApplication::findAndRunCommand()\r
-    */\r
-    struct Command\r
-    {\r
-        /** The option string that must appear in the argument list for this command to be invoked.\r
-            This can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
-        */\r
-        String commandOption;\r
-\r
-        /** A description of the command-line arguments needed for this command, which will be\r
-            printed as part of the help text.\r
-        */\r
-        String argumentDescription;\r
-\r
-        /** A description of the meaning of this command, for use in the help text. */\r
-        String commandDescription;\r
-\r
-        /** The actual command that should be invoked to perform this action. */\r
-        std::function<void(const ArgumentList&)> command;\r
-    };\r
-\r
-    //==============================================================================\r
-    /** Adds a command to the list. */\r
-    void addCommand (Command);\r
-\r
-    /** Adds a help command to the list.\r
-        This command will print the user-supplied message that's passed in here as an\r
-        argument, followed by a list of all the registered commands.\r
-    */\r
-    void addHelpCommand (String helpArgument, String helpMessage,\r
-                         bool invokeIfNoOtherCommandRecognised);\r
-\r
-    /** Adds a command that will print the given text in response to the "--version" option. */\r
-    void addVersionCommand (String versionArgument, String versionText);\r
-\r
-    //==============================================================================\r
-    /** Throws a failure exception to cause a command-line app to terminate.\r
-        This is intended to be called from code in a Command, so that the\r
-        exception will be automatically caught and turned into a printed error message\r
-        and a return code which will be returned from main().\r
-        @see ConsoleApplication::invokeCatchingFailures()\r
-    */\r
-    static void fail (String errorMessage, int returnCode = 1);\r
-\r
-    /** Invokes a function, catching any fail() calls that it might trigger, and handling\r
-        them by printing their error message and returning their error code.\r
-        @see ConsoleApplication::fail()\r
-    */\r
-    static int invokeCatchingFailures (std::function<int()>&& functionToCall);\r
-\r
-    //==============================================================================\r
-    /** Looks for the first command in the list which matches the given arguments, and\r
-        tries to invoke it.\r
-\r
-        If no command is found, it prints a help message listing the available commands.\r
-        If the command calls the fail() function, this will throw an exception that gets\r
-        automatically caught and handled, and this method will return the error code that\r
-        was passed into the fail() call.\r
-    */\r
-    int findAndRunCommand (const ArgumentList&) const;\r
-\r
-    /** Creates an ArgumentList object from the argc and argv variablrs, and invokes\r
-        findAndRunCommand() using it.\r
-    */\r
-    int findAndRunCommand (int argc, char* argv[]) const;\r
-\r
-private:\r
-    //==============================================================================\r
-    std::vector<Command> commands;\r
-    String commandIfNoOthersRecognised;\r
-\r
-    void printHelp (const String& preamble, const ArgumentList&) const;\r
-};\r
-\r
-} // namespace juce\r
index 25d87fc6fdb7063fa3b0abce23983d97e68821d6..532a0038ea8a109f4103538f33234c7f6d7c97a5 100644 (file)
@@ -91,7 +91,7 @@ public:
 \r
     //==============================================================================\r
     /** Function type of runtime permission request callbacks. */\r
-    using Callback = std::function<void (bool)>;\r
+    typedef std::function<void (bool)> Callback;\r
 \r
     //==============================================================================\r
     /** Call this method to request a runtime permission.\r
index 1687201fcf4ea33704d4e7d38e6f74c149aaccb9..70e3547149ceafbcab92b4610ba920cc9335681c 100644 (file)
@@ -62,7 +62,7 @@ namespace FunctionTestsHelpers
 \r
     struct FunctionObject\r
     {\r
-        FunctionObject() = default;\r
+        FunctionObject() {}\r
 \r
         FunctionObject (const FunctionObject& other)\r
         {\r
@@ -72,26 +72,6 @@ namespace FunctionTestsHelpers
         int operator()(int i) const { return bigData->sum() + i; }\r
 \r
         std::unique_ptr<BigData> bigData { new BigData() };\r
-\r
-        JUCE_LEAK_DETECTOR (FunctionObject)\r
-    };\r
-\r
-    struct BigFunctionObject\r
-    {\r
-        BigFunctionObject() = default;\r
-\r
-        BigFunctionObject (const BigFunctionObject& other)\r
-        {\r
-            bigData.reset (new BigData (*other.bigData));\r
-        }\r
-\r
-        int operator()(int i) const { return bigData->sum() + i; }\r
-\r
-        std::unique_ptr<BigData> bigData { new BigData() };\r
-\r
-        int stackUsage[32];\r
-\r
-        JUCE_LEAK_DETECTOR (BigFunctionObject)\r
     };\r
 }\r
 \r
@@ -115,16 +95,13 @@ public:
 \r
             std::function<double(double, double)> f2 (FunctionTestsHelpers::multiply);\r
             expectEquals (6.0, f2 (2.0, 3.0));\r
+\r
         }\r
 \r
         {\r
             beginTest ("Function objects");\r
-\r
             std::function<int(int)> f1 = FunctionTestsHelpers::FunctionObject();\r
             expectEquals (f1 (5), FunctionTestsHelpers::BigData::bigDataSum + 5);\r
-\r
-            std::function<int(int)> f2 { FunctionTestsHelpers::BigFunctionObject() };\r
-            expectEquals (f2 (5), FunctionTestsHelpers::BigData::bigDataSum + 5);\r
         }\r
 \r
         {\r
index 5406cd92397bb42788eacc5e2326c29d505b87e6..cccdaae93f321a0964822eea5c25c16caf767646 100644 (file)
@@ -51,7 +51,7 @@ namespace std
         /** Creates an empty function. */\r
         function (decltype (nullptr)) noexcept {}\r
 \r
-        /** Creates a function targeting the provided Functor. */\r
+        /** Creates a function targetting the provided Functor. */\r
         template <typename Functor>\r
         function (Functor f)\r
         {\r
@@ -192,7 +192,11 @@ namespace std
         {\r
             if (functorHolderHelper != nullptr)\r
             {\r
-                functorHolderHelper->~FunctorHolderBase<Result, Arguments...>();\r
+                if (functorHolderHelper->getSize() > functorHolderStackSize)\r
+                    delete[] reinterpret_cast<char*> (functorHolderHelper);\r
+                else\r
+                    functorHolderHelper->~FunctorHolderBase<Result, Arguments...>();\r
+\r
                 functorHolderHelper = nullptr;\r
             }\r
         }\r
diff --git a/modules/juce_core/native/java/AndroidVideo.java b/modules/juce_core/native/java/AndroidVideo.java
deleted file mode 100644 (file)
index abda5e0..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-$$VideoApi21\r
-    //==============================================================================\r
-    public class MediaControllerCallback  extends MediaController.Callback\r
-    {\r
-        private native void mediaControllerAudioInfoChanged     (long host, MediaController.PlaybackInfo info);\r
-        private native void mediaControllerMetadataChanged      (long host, MediaMetadata metadata);\r
-        private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
-        private native void mediaControllerSessionDestroyed     (long host);\r
-\r
-        MediaControllerCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
-        {\r
-            mediaControllerAudioInfoChanged (host, info);\r
-        }\r
-\r
-        @Override\r
-        public void onMetadataChanged (MediaMetadata metadata)\r
-        {\r
-            mediaControllerMetadataChanged (host, metadata);\r
-        }\r
-\r
-        @Override\r
-        public void onPlaybackStateChanged (PlaybackState state)\r
-        {\r
-             mediaControllerPlaybackStateChanged (host, state);\r
-        }\r
-\r
-        @Override\r
-        public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
-        @Override\r
-        public void onSessionDestroyed()\r
-        {\r
-            mediaControllerSessionDestroyed (host);\r
-        }\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class MediaSessionCallback  extends MediaSession.Callback\r
-    {\r
-        private native void mediaSessionPause           (long host);\r
-        private native void mediaSessionPlay            (long host);\r
-        private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
-        private native void mediaSessionSeekTo          (long host, long pos);\r
-        private native void mediaSessionStop            (long host);\r
-\r
-\r
-        MediaSessionCallback (long hostToUse)\r
-        {\r
-            host = hostToUse;\r
-        }\r
-\r
-        @Override\r
-        public void onPause()\r
-        {\r
-            mediaSessionPause (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlay()\r
-        {\r
-            mediaSessionPlay (host);\r
-        }\r
-\r
-        @Override\r
-        public void onPlayFromMediaId (String mediaId, Bundle extras)\r
-        {\r
-            mediaSessionPlayFromMediaId (host, mediaId, extras);\r
-        }\r
-\r
-        @Override\r
-        public void onSeekTo (long pos)\r
-        {\r
-            mediaSessionSeekTo (host, pos);\r
-        }\r
-\r
-        @Override\r
-        public void onStop()\r
-        {\r
-            mediaSessionStop (host);\r
-        }\r
-\r
-        @Override\r
-        public void onFastForward() {}\r
-\r
-        @Override\r
-        public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
-        {\r
-            return true;\r
-        }\r
-\r
-        @Override\r
-        public void onRewind() {}\r
-\r
-        @Override\r
-        public void onSkipToNext() {}\r
-\r
-        @Override\r
-        public void onSkipToPrevious() {}\r
-\r
-        @Override\r
-        public void onSkipToQueueItem (long id) {}\r
-\r
-        private long host;\r
-    }\r
-\r
-    //==============================================================================\r
-    public class SystemVolumeObserver extends ContentObserver\r
-    {\r
-        private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
-        SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
-        {\r
-            super (null);\r
-\r
-            activity = activityToUse;\r
-            host = hostToUse;\r
-        }\r
-\r
-        void setEnabled (boolean shouldBeEnabled)\r
-        {\r
-            if (shouldBeEnabled)\r
-                activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
-            else\r
-                activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
-        }\r
-\r
-        @Override\r
-        public void onChange (boolean selfChange, Uri uri)\r
-        {\r
-            if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
-                mediaSessionSystemVolumeChanged (host);\r
-        }\r
-\r
-        private Activity activity;\r
-        private long host;\r
-    }\r
-\r
-VideoApi21$$\r
index 28939a2f9cf4391dc2569225adc09e885b6ef875..4fdeac0d9d8e2171b5847977d96f0943d003d094 100644 (file)
@@ -31,7 +31,6 @@ import android.content.res.Configuration;
 import android.content.pm.PackageInfo;\r
 import android.content.pm.PackageManager;\r
 $$JuceAndroidCameraImports$$       // If you get an error here, you need to re-save your project with the Projucer!\r
-$$JuceAndroidVideoImports$$        // If you get an error here, you need to re-save your project with the Projucer!\r
 import android.net.http.SslError;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
@@ -90,11 +89,8 @@ public class JuceAppActivity   extends $$JuceAppActivityBaseClass$$
     //==============================================================================\r
     public boolean isPermissionDeclaredInManifest (int permissionID)\r
     {\r
-        return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
-    }\r
+        String permissionToCheck = getAndroidPermissionName(permissionID);\r
 \r
-    public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
-    {\r
         try\r
         {\r
             PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
@@ -478,9 +474,7 @@ public class JuceAppActivity   extends $$JuceAppActivityBaseClass$$
     public final String getClipboardContent()\r
     {\r
         ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
-        CharSequence content = clipboard.getText();\r
-        return content != null ? content.toString() : new String();\r
+        return clipboard.getText().toString();\r
     }\r
 \r
     public final void setClipboardContent (String newText)\r
@@ -989,13 +983,11 @@ public class JuceAppActivity   extends $$JuceAppActivityBaseClass$$
                                           implements SurfaceHolder.Callback\r
     {\r
         private long nativeContext = 0;\r
-        private boolean forVideo;\r
 \r
-        NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+        NativeSurfaceView (Context context, long nativeContextPtr)\r
         {\r
             super (context);\r
             nativeContext = nativeContextPtr;\r
-            forVideo = createdForVideo;\r
         }\r
 \r
         public Surface getNativeSurface()\r
@@ -1013,51 +1005,38 @@ public class JuceAppActivity   extends $$JuceAppActivityBaseClass$$
         @Override\r
         public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
         {\r
-            if (forVideo)\r
-                surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
-            else\r
-                surfaceChangedNative (nativeContext, holder, format, width, height);\r
+            surfaceChangedNative (nativeContext, holder, format, width, height);\r
         }\r
 \r
         @Override\r
         public void surfaceCreated (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceCreatedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceCreatedNative (nativeContext, holder);\r
+            surfaceCreatedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         public void surfaceDestroyed (SurfaceHolder holder)\r
         {\r
-            if (forVideo)\r
-                surfaceDestroyedNativeVideo (nativeContext, holder);\r
-            else\r
-                surfaceDestroyedNative (nativeContext, holder);\r
+            surfaceDestroyedNative (nativeContext, holder);\r
         }\r
 \r
         @Override\r
         protected void dispatchDraw (Canvas canvas)\r
         {\r
             super.dispatchDraw (canvas);\r
-\r
-            if (forVideo)\r
-                dispatchDrawNativeVideo (nativeContext, canvas);\r
-            else\r
-                dispatchDrawNative (nativeContext, canvas);\r
+            dispatchDrawNative (nativeContext, canvas);\r
         }\r
 \r
         //==============================================================================\r
         @Override\r
-        protected void onAttachedToWindow()\r
+        protected void onAttachedToWindow ()\r
         {\r
             super.onAttachedToWindow();\r
             getHolder().addCallback (this);\r
         }\r
 \r
         @Override\r
-        protected void onDetachedFromWindow()\r
+        protected void onDetachedFromWindow ()\r
         {\r
             super.onDetachedFromWindow();\r
             getHolder().removeCallback (this);\r
@@ -1069,17 +1048,11 @@ public class JuceAppActivity   extends $$JuceAppActivityBaseClass$$
         private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
         private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
                                                   int format, int width, int height);\r
-\r
-        private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
-        private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
-        private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
-                                                       int format, int width, int height);\r
     }\r
 \r
-    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+    public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
     {\r
-        return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+        return new NativeSurfaceView (this, nativeSurfacePtr);\r
     }\r
 \r
     //==============================================================================\r
@@ -1638,7 +1611,6 @@ $$JuceAndroidWebViewNativeCode$$ // If you get an error here, you need to re-sav
     }\r
 \r
     $$JuceAndroidCameraCode$$ // If you get an error here, you need to re-save your project with the Projucer!\r
-    $$JuceAndroidVideoCode$$ // If you get an error here, you need to re-save your project with the Projucer!\r
 \r
     //==============================================================================\r
     public static final String getLocaleValue (boolean isRegion)\r
index 180935429ad2c47a6132244d06046578edd3c4cf..a4c3458d4e46b64ec54cc59aace0bdd455795049 100644 (file)
@@ -29,7 +29,7 @@ namespace juce
   METHOD (disconnect,  "disconnect", "()V") \\r
   METHOD (scanFile,    "scanFile",   "(Ljava/lang/String;Ljava/lang/String;)V") \\r
 \r
-DECLARE_JNI_CLASS (MediaScannerConnection, "android/media/MediaScannerConnection")\r
+DECLARE_JNI_CLASS (MediaScannerConnection, "android/media/MediaScannerConnection");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -37,7 +37,7 @@ DECLARE_JNI_CLASS (MediaScannerConnection, "android/media/MediaScannerConnection
  METHOD (openInputStream,  "openInputStream",  "(Landroid/net/Uri;)Ljava/io/InputStream;") \\r
  METHOD (openOutputStream, "openOutputStream", "(Landroid/net/Uri;)Ljava/io/OutputStream;")\r
 \r
-DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver")\r
+DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -46,14 +46,14 @@ DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver")
  METHOD (getString,       "getString",       "(I)Ljava/lang/String;") \\r
  METHOD (close,           "close",           "()V") \\r
 \r
-DECLARE_JNI_CLASS (AndroidCursor, "android/database/Cursor")\r
+DECLARE_JNI_CLASS (AndroidCursor, "android/database/Cursor");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  STATICMETHOD (getExternalStorageDirectory, "getExternalStorageDirectory", "()Ljava/io/File;") \\r
  STATICMETHOD (getExternalStoragePublicDirectory, "getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;") \\r
 \r
-DECLARE_JNI_CLASS (AndroidEnvironment, "android/os/Environment")\r
+DECLARE_JNI_CLASS (AndroidEnvironment, "android/os/Environment");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -61,7 +61,7 @@ DECLARE_JNI_CLASS (AndroidEnvironment, "android/os/Environment")
  METHOD (flush, "flush", "()V") \\r
  METHOD (write, "write", "([BII)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream")\r
+DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -188,13 +188,6 @@ private:
                                                              uri.get(), projection.get(), jSelection.get(),\r
                                                              args.get(), nullptr));\r
 \r
-            if (jniCheckHasExceptionOccurredAndClear())\r
-            {\r
-                // An exception has occurred, have you acquired RuntimePermission::readExternalStorage permission?\r
-                jassertfalse;\r
-                return {};\r
-            }\r
-\r
             if (cursor)\r
             {\r
                 if (env->CallBooleanMethod (cursor.get(), AndroidCursor.moveToFirst) != 0)\r
@@ -387,13 +380,6 @@ private:
                                                          uri.get(), projection.get(), nullptr,\r
                                                          nullptr, nullptr));\r
 \r
-        if (jniCheckHasExceptionOccurredAndClear())\r
-        {\r
-            // An exception has occurred, have you acquired RuntimePermission::readExternalStorage permission?\r
-            jassertfalse;\r
-            return {};\r
-        }\r
-\r
         if (cursor == 0)\r
             return {};\r
 \r
index 5a6d83cd88668344bfa2f2261e86cc04032e5ad3..1324649685bdcd704884505c632a32491501922d 100644 (file)
@@ -250,79 +250,60 @@ extern AndroidSystem android;
 \r
 //==============================================================================\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (createNewView,                        "createNewView",                   "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \\r
- METHOD (deleteView,                           "deleteView",                      "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \\r
- METHOD (createNativeSurfaceView,              "createNativeSurfaceView",         "(JZ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$NativeSurfaceView;") \\r
- METHOD (finish,                               "finish",                          "()V") \\r
- METHOD (getWindowManager,                     "getWindowManager",                "()Landroid/view/WindowManager;") \\r
- METHOD (setRequestedOrientation,              "setRequestedOrientation",         "(I)V") \\r
- METHOD (getClipboardContent,                  "getClipboardContent",             "()Ljava/lang/String;") \\r
- METHOD (setClipboardContent,                  "setClipboardContent",             "(Ljava/lang/String;)V") \\r
- METHOD (excludeClipRegion,                    "excludeClipRegion",               "(Landroid/graphics/Canvas;FFFF)V") \\r
- METHOD (renderGlyph,                          "renderGlyph",                     "(CCLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \\r
- STATICMETHOD (createHTTPStream,               "createHTTPStream",                "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;ILjava/lang/String;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \\r
- METHOD (launchURL,                            "launchURL",                       "(Ljava/lang/String;)V") \\r
- METHOD (showMessageBox,                       "showMessageBox",                  "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
- METHOD (showOkCancelBox,                      "showOkCancelBox",                 "(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V") \\r
- METHOD (showYesNoCancelBox,                   "showYesNoCancelBox",              "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
- STATICMETHOD (getLocaleValue,                 "getLocaleValue",                  "(Z)Ljava/lang/String;") \\r
- STATICMETHOD (getDocumentsFolder,             "getDocumentsFolder",              "()Ljava/lang/String;") \\r
- STATICMETHOD (getPicturesFolder,              "getPicturesFolder",               "()Ljava/lang/String;") \\r
- STATICMETHOD (getMusicFolder,                 "getMusicFolder",                  "()Ljava/lang/String;") \\r
- STATICMETHOD (getDownloadsFolder,             "getDownloadsFolder",              "()Ljava/lang/String;") \\r
- STATICMETHOD (getMoviesFolder,                "getMoviesFolder",                 "()Ljava/lang/String;") \\r
- METHOD (getTypeFaceFromAsset,                 "getTypeFaceFromAsset",            "(Ljava/lang/String;)Landroid/graphics/Typeface;") \\r
- METHOD (getTypeFaceFromByteArray,             "getTypeFaceFromByteArray",        "([B)Landroid/graphics/Typeface;") \\r
- METHOD (setScreenSaver,                       "setScreenSaver",                  "(Z)V") \\r
- METHOD (getScreenSaver,                       "getScreenSaver",                  "()Z") \\r
- METHOD (getAndroidMidiDeviceManager,          "getAndroidMidiDeviceManager",     "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$MidiDeviceManager;") \\r
- METHOD (getAndroidBluetoothManager,           "getAndroidBluetoothManager",      "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager;") \\r
- STATICMETHOD (getAndroidSDKVersion,           "getAndroidSDKVersion",            "()I") \\r
- METHOD (audioManagerGetProperty,              "audioManagerGetProperty",         "(Ljava/lang/String;)Ljava/lang/String;") \\r
- METHOD (hasSystemFeature,                     "hasSystemFeature",                "(Ljava/lang/String;)Z" ) \\r
- METHOD (requestRuntimePermission,             "requestRuntimePermission",        "(IJ)V" ) \\r
- METHOD (isPermissionGranted,                  "isPermissionGranted",             "(I)Z" ) \\r
- METHOD (isPermissionDeclaredInManifest,       "isPermissionDeclaredInManifest",  "(I)Z" ) \\r
- METHOD (isPermissionDeclaredInManifestString, "isPermissionDeclaredInManifest",  "(Ljava/lang/String;)Z") \\r
- METHOD (getAssets,                            "getAssets",                       "()Landroid/content/res/AssetManager;") \\r
- METHOD (getSystemService,                     "getSystemService",                "(Ljava/lang/String;)Ljava/lang/Object;") \\r
- METHOD (getPackageManager,                    "getPackageManager",               "()Landroid/content/pm/PackageManager;") \\r
- METHOD (getPackageName,                       "getPackageName",                  "()Ljava/lang/String;") \\r
- METHOD (getResources,                         "getResources",                    "()Landroid/content/res/Resources;") \\r
- METHOD (createInvocationHandler,              "createInvocationHandler",         "(J)Ljava/lang/reflect/InvocationHandler;") \\r
- METHOD (invocationHandlerContextDeleted,      "invocationHandlerContextDeleted", "(Ljava/lang/reflect/InvocationHandler;)V") \\r
- METHOD (bindService,                          "bindService",                     "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z") \\r
- METHOD (unbindService,                        "unbindService",                   "(Landroid/content/ServiceConnection;)V") \\r
- METHOD (startIntentSenderForResult,           "startIntentSenderForResult",      "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V") \\r
- METHOD (moveTaskToBack,                       "moveTaskToBack",                  "(Z)Z") \\r
- METHOD (startActivity,                        "startActivity",                   "(Landroid/content/Intent;)V") \\r
- METHOD (startActivityForResult,               "startActivityForResult",          "(Landroid/content/Intent;I)V") \\r
- METHOD (getContentResolver,                   "getContentResolver",              "()Landroid/content/ContentResolver;") \\r
- METHOD (addAppPausedResumedListener,          "addAppPausedResumedListener",     "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V") \\r
- METHOD (removeAppPausedResumedListener,       "removeAppPausedResumedListener",  "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V")\r
-\r
-DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH)\r
+ METHOD (createNewView,                   "createNewView",                   "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \\r
+ METHOD (deleteView,                      "deleteView",                      "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \\r
+ METHOD (createNativeSurfaceView,         "createNativeSurfaceView",         "(J)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$NativeSurfaceView;") \\r
+ METHOD (finish,                          "finish",                          "()V") \\r
+ METHOD (getWindowManager,                "getWindowManager",                "()Landroid/view/WindowManager;") \\r
+ METHOD (setRequestedOrientation,         "setRequestedOrientation",         "(I)V") \\r
+ METHOD (getClipboardContent,             "getClipboardContent",             "()Ljava/lang/String;") \\r
+ METHOD (setClipboardContent,             "setClipboardContent",             "(Ljava/lang/String;)V") \\r
+ METHOD (excludeClipRegion,               "excludeClipRegion",               "(Landroid/graphics/Canvas;FFFF)V") \\r
+ METHOD (renderGlyph,                     "renderGlyph",                     "(CCLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \\r
+ STATICMETHOD (createHTTPStream,          "createHTTPStream",                "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;ILjava/lang/String;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \\r
+ METHOD (launchURL,                       "launchURL",                       "(Ljava/lang/String;)V") \\r
+ METHOD (showMessageBox,                  "showMessageBox",                  "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
+ METHOD (showOkCancelBox,                 "showOkCancelBox",                 "(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V") \\r
+ METHOD (showYesNoCancelBox,              "showYesNoCancelBox",              "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
+ STATICMETHOD (getLocaleValue,            "getLocaleValue",                  "(Z)Ljava/lang/String;") \\r
+ STATICMETHOD (getDocumentsFolder,        "getDocumentsFolder",              "()Ljava/lang/String;") \\r
+ STATICMETHOD (getPicturesFolder,         "getPicturesFolder",               "()Ljava/lang/String;") \\r
+ STATICMETHOD (getMusicFolder,            "getMusicFolder",                  "()Ljava/lang/String;") \\r
+ STATICMETHOD (getDownloadsFolder,        "getDownloadsFolder",              "()Ljava/lang/String;") \\r
+ STATICMETHOD (getMoviesFolder,           "getMoviesFolder",                 "()Ljava/lang/String;") \\r
+ METHOD (getTypeFaceFromAsset,            "getTypeFaceFromAsset",            "(Ljava/lang/String;)Landroid/graphics/Typeface;") \\r
+ METHOD (getTypeFaceFromByteArray,        "getTypeFaceFromByteArray",        "([B)Landroid/graphics/Typeface;") \\r
+ METHOD (setScreenSaver,                  "setScreenSaver",                  "(Z)V") \\r
+ METHOD (getScreenSaver,                  "getScreenSaver",                  "()Z") \\r
+ METHOD (getAndroidMidiDeviceManager,     "getAndroidMidiDeviceManager",     "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$MidiDeviceManager;") \\r
+ METHOD (getAndroidBluetoothManager,      "getAndroidBluetoothManager",      "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager;") \\r
+ STATICMETHOD (getAndroidSDKVersion,      "getAndroidSDKVersion",            "()I") \\r
+ METHOD (audioManagerGetProperty,         "audioManagerGetProperty",         "(Ljava/lang/String;)Ljava/lang/String;") \\r
+ METHOD (hasSystemFeature,                "hasSystemFeature",                "(Ljava/lang/String;)Z" ) \\r
+ METHOD (requestRuntimePermission,        "requestRuntimePermission",        "(IJ)V" ) \\r
+ METHOD (isPermissionGranted,             "isPermissionGranted",             "(I)Z" ) \\r
+ METHOD (isPermissionDeclaredInManifest,  "isPermissionDeclaredInManifest",  "(I)Z" ) \\r
+ METHOD (getAssets,                       "getAssets",                       "()Landroid/content/res/AssetManager;") \\r
+ METHOD (getSystemService,                "getSystemService",                "(Ljava/lang/String;)Ljava/lang/Object;") \\r
+ METHOD (getPackageManager,               "getPackageManager",               "()Landroid/content/pm/PackageManager;") \\r
+ METHOD (getPackageName,                  "getPackageName",                  "()Ljava/lang/String;") \\r
+ METHOD (getResources,                    "getResources",                    "()Landroid/content/res/Resources;") \\r
+ METHOD (createInvocationHandler,         "createInvocationHandler",         "(J)Ljava/lang/reflect/InvocationHandler;") \\r
+ METHOD (invocationHandlerContextDeleted, "invocationHandlerContextDeleted", "(Ljava/lang/reflect/InvocationHandler;)V") \\r
+ METHOD (bindService,                     "bindService",                     "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z") \\r
+ METHOD (unbindService,                   "unbindService",                   "(Landroid/content/ServiceConnection;)V") \\r
+ METHOD (startIntentSenderForResult,      "startIntentSenderForResult",      "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V") \\r
+ METHOD (moveTaskToBack,                  "moveTaskToBack",                  "(Z)Z") \\r
+ METHOD (startActivity,                   "startActivity",                   "(Landroid/content/Intent;)V") \\r
+ METHOD (startActivityForResult,          "startActivityForResult",          "(Landroid/content/Intent;I)V") \\r
+ METHOD (getContentResolver,              "getContentResolver",              "()Landroid/content/ContentResolver;") \\r
+ METHOD (addAppPausedResumedListener,     "addAppPausedResumedListener",     "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V") \\r
+ METHOD (removeAppPausedResumedListener,  "removeAppPausedResumedListener",  "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V")\r
+\r
+DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH);\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
-#if __ANDROID_API__ >= 21\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
-  METHOD (build,          "build",          "()Landroid/media/AudioAttributes;") \\r
-  METHOD (constructor,    "<init>",         "()V") \\r
-  METHOD (setContentType, "setContentType", "(I)Landroid/media/AudioAttributes$Builder;") \\r
-  METHOD (setUsage,       "setUsage",       "(I)Landroid/media/AudioAttributes$Builder;")\r
-\r
-DECLARE_JNI_CLASS (AndroidAudioAttributesBuilder, "android/media/AudioAttributes$Builder")\r
-#undef JNI_CLASS_MEMBERS\r
-#endif\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
-  METHOD (abandonAudioFocus, "abandonAudioFocus", "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I") \\r
-  METHOD (requestAudioFocus, "requestAudioFocus", "(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I")\r
-\r
-DECLARE_JNI_CLASS (AndroidAudioManager, "android/media/AudioManager")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (createBitmap,     "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;") \\r
   STATICMETHOD (createBitmapFrom, "createBitmap", "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;") \\r
@@ -332,51 +313,25 @@ DECLARE_JNI_CLASS (AndroidAudioManager, "android/media/AudioManager")
   METHOD (recycle,   "recycle",   "()V") \\r
   METHOD (setPixel,  "setPixel",  "(III)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidBitmap, "android/graphics/Bitmap")\r
+DECLARE_JNI_CLASS (AndroidBitmap, "android/graphics/Bitmap");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (valueOf, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;")\r
 \r
-DECLARE_JNI_CLASS (AndroidBitmapConfig, "android/graphics/Bitmap$Config")\r
+DECLARE_JNI_CLASS (AndroidBitmapConfig, "android/graphics/Bitmap$Config");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (decodeByteArray, "decodeByteArray", "([BII)Landroid/graphics/Bitmap;")\r
 \r
-DECLARE_JNI_CLASS (AndroidBitmapFactory, "android/graphics/BitmapFactory")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
-  METHOD (constructor,        "<init>",             "()V") \\r
-  METHOD (containsKey,        "containsKey",        "(Ljava/lang/String;)Z") \\r
-  METHOD (get,                "get",                "(Ljava/lang/String;)Ljava/lang/Object;") \\r
-  METHOD (getBoolean,         "getBoolean",         "(Ljava/lang/String;)Z") \\r
-  METHOD (getBundle,          "getBundle",          "(Ljava/lang/String;)Landroid/os/Bundle;") \\r
-  METHOD (getCharSequence,    "getCharSequence",    "(Ljava/lang/String;)Ljava/lang/CharSequence;") \\r
-  METHOD (getInt,             "getInt",             "(Ljava/lang/String;)I") \\r
-  METHOD (getLong,            "getLong",            "(Ljava/lang/String;)J") \\r
-  METHOD (getLongArray,       "getLongArray",       "(Ljava/lang/String;)[J") \\r
-  METHOD (getParcelable,      "getParcelable",      "(Ljava/lang/String;)Landroid/os/Parcelable;") \\r
-  METHOD (getString,          "getString",          "(Ljava/lang/String;)Ljava/lang/String;") \\r
-  METHOD (getStringArrayList, "getStringArrayList", "(Ljava/lang/String;)Ljava/util/ArrayList;") \\r
-  METHOD (keySet,             "keySet",             "()Ljava/util/Set;") \\r
-  METHOD (putBoolean,         "putBoolean",         "(Ljava/lang/String;Z)V") \\r
-  METHOD (putBundle,          "putBundle",          "(Ljava/lang/String;Landroid/os/Bundle;)V") \\r
-  METHOD (putFloat,           "putFloat",           "(Ljava/lang/String;F)V") \\r
-  METHOD (putInt,             "putInt",             "(Ljava/lang/String;I)V") \\r
-  METHOD (putLong,            "putLong",            "(Ljava/lang/String;J)V") \\r
-  METHOD (putLongArray,       "putLongArray",       "(Ljava/lang/String;[J)V") \\r
-  METHOD (putString,          "putString",          "(Ljava/lang/String;Ljava/lang/String;)V") \\r
-  METHOD (putStringArrayList, "putStringArrayList", "(Ljava/lang/String;Ljava/util/ArrayList;)V")\r
-\r
-DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle")\r
+DECLARE_JNI_CLASS (AndroidBitmapFactory, "android/graphics/BitmapFactory");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (dumpReferenceTables, "dumpReferenceTables", "()V")\r
 \r
-  DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug")\r
+  DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JUCE_LOG_JNI_REFERENCES_TABLE getEnv()->CallStaticVoidMethod (AndroidDebug, AndroidDebug.dumpReferenceTables);\r
@@ -384,7 +339,7 @@ DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (getRotation, "getRotation", "()I")\r
 \r
-DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display")\r
+DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -393,7 +348,7 @@ DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display")
   METHOD (post,                  "post",        "(Ljava/lang/Runnable;)Z") \\r
   METHOD (postDelayed,           "postDelayed", "(Ljava/lang/Runnable;J)Z") \\r
 \r
-DECLARE_JNI_CLASS (AndroidHandler, "android/os/Handler")\r
+DECLARE_JNI_CLASS (AndroidHandler, "android/os/Handler");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -403,7 +358,7 @@ DECLARE_JNI_CLASS (AndroidHandler, "android/os/Handler")
   METHOD (quitSafely,  "quitSafely", "()Z") \\r
   METHOD (start,       "start",      "()V")\r
 \r
-DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread")\r
+DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -429,7 +384,7 @@ DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread")
   METHOD (setPackage,                     "setPackage",     "(Ljava/lang/String;)Landroid/content/Intent;") \\r
   METHOD (setType,                        "setType",        "(Ljava/lang/String;)Landroid/content/Intent;") \\r
 \r
-DECLARE_JNI_CLASS (AndroidIntent, "android/content/Intent")\r
+DECLARE_JNI_CLASS (AndroidIntent, "android/content/Intent");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -439,13 +394,13 @@ DECLARE_JNI_CLASS (AndroidIntent, "android/content/Intent")
  METHOD (postTranslate,  "postTranslate", "(FF)Z") \\r
  METHOD (setValues,      "setValues",     "([F)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidMatrix, "android/graphics/Matrix")\r
+DECLARE_JNI_CLASS (AndroidMatrix, "android/graphics/Matrix");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (getPackageInfo, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;")\r
 \r
-DECLARE_JNI_CLASS (AndroidPackageManager, "android/content/pm/PackageManager")\r
+DECLARE_JNI_CLASS (AndroidPackageManager, "android/content/pm/PackageManager");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -461,20 +416,20 @@ DECLARE_JNI_CLASS (AndroidPackageManager, "android/content/pm/PackageManager")
  METHOD (getTextPath,   "getTextPath",      "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \\r
  METHOD (setShader,     "setShader",        "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \\r
 \r
-DECLARE_JNI_CLASS (AndroidPaint, "android/graphics/Paint")\r
+DECLARE_JNI_CLASS (AndroidPaint, "android/graphics/Paint");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (getActivity, "getActivity", "(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;") \\r
   METHOD (getIntentSender, "getIntentSender", "()Landroid/content/IntentSender;")\r
 \r
-DECLARE_JNI_CLASS (AndroidPendingIntent, "android/app/PendingIntent")\r
+DECLARE_JNI_CLASS (AndroidPendingIntent, "android/app/PendingIntent");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (toString, "toString", "()Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (AndroidRange, "android/util/Range")\r
+DECLARE_JNI_CLASS (AndroidRange, "android/util/Range");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -484,7 +439,7 @@ DECLARE_JNI_CLASS (AndroidRange, "android/util/Range")
  FIELD (top,            "top",      "I") \\r
  FIELD (bottom,         "bottom",   "I") \\r
 \r
-DECLARE_JNI_CLASS (AndroidRect, "android/graphics/Rect")\r
+DECLARE_JNI_CLASS (AndroidRect, "android/graphics/Rect");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -498,14 +453,14 @@ DECLARE_JNI_CLASS (AndroidResources, "android/content/res/Resources")
   METHOD (getHeight, "getHeight", "()I") \\r
   METHOD (getWidth,  "getWidth",  "()I")\r
 \r
-DECLARE_JNI_CLASS (AndroidSize, "android/util/Size")\r
+DECLARE_JNI_CLASS (AndroidSize, "android/util/Size");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (parse, "parse", "(Ljava/lang/String;)Landroid/net/Uri;") \\r
   METHOD (toString, "toString", "()Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri")\r
+DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -522,7 +477,7 @@ DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri")
  METHOD (invalidate,          "invalidate",          "(IIII)V") \\r
  METHOD (setVisibility,       "setVisibility",       "(I)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidView, "android/view/View")\r
+DECLARE_JNI_CLASS (AndroidView, "android/view/View");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -535,7 +490,7 @@ DECLARE_JNI_CLASS (AndroidViewGroup, "android/view/ViewGroup")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (getDefaultDisplay, "getDefaultDisplay", "()Landroid/view/Display;")\r
 \r
-DECLARE_JNI_CLASS (AndroidWindowManager, "android/view/WindowManager")\r
+DECLARE_JNI_CLASS (AndroidWindowManager, "android/view/WindowManager");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -546,27 +501,52 @@ DECLARE_JNI_CLASS (AndroidWindowManager, "android/view/WindowManager")
   METHOD (get,         "get",      "(I)Ljava/lang/Object;") \\r
   METHOD (size,        "size",     "()I")\r
 \r
-DECLARE_JNI_CLASS (JavaArrayList, "java/util/ArrayList")\r
+DECLARE_JNI_CLASS (JavaArrayList, "java/util/ArrayList");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (valueOf, "valueOf", "(Z)Ljava/lang/Boolean;") \\r
   METHOD (booleanValue, "booleanValue", "()Z")\r
 \r
-DECLARE_JNI_CLASS (JavaBoolean, "java/lang/Boolean")\r
+DECLARE_JNI_CLASS (JavaBoolean, "java/lang/Boolean");\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
+  METHOD (constructor,        "<init>",             "()V") \\r
+  METHOD (containsKey,        "containsKey",        "(Ljava/lang/String;)Z") \\r
+  METHOD (get,                "get",                "(Ljava/lang/String;)Ljava/lang/Object;") \\r
+  METHOD (getBoolean,         "getBoolean",         "(Ljava/lang/String;)Z") \\r
+  METHOD (getBundle,          "getBundle",          "(Ljava/lang/String;)Landroid/os/Bundle;") \\r
+  METHOD (getCharSequence,    "getCharSequence",    "(Ljava/lang/String;)Ljava/lang/CharSequence;") \\r
+  METHOD (getInt,             "getInt",             "(Ljava/lang/String;)I") \\r
+  METHOD (getLong,            "getLong",            "(Ljava/lang/String;)J") \\r
+  METHOD (getLongArray,       "getLongArray",       "(Ljava/lang/String;)[J") \\r
+  METHOD (getParcelable,      "getParcelable",      "(Ljava/lang/String;)Landroid/os/Parcelable;") \\r
+  METHOD (getString,          "getString",          "(Ljava/lang/String;)Ljava/lang/String;") \\r
+  METHOD (getStringArrayList, "getStringArrayList", "(Ljava/lang/String;)Ljava/util/ArrayList;") \\r
+  METHOD (keySet,             "keySet",             "()Ljava/util/Set;") \\r
+  METHOD (putBoolean,         "putBoolean",         "(Ljava/lang/String;Z)V") \\r
+  METHOD (putBundle,          "putBundle",          "(Ljava/lang/String;Landroid/os/Bundle;)V") \\r
+  METHOD (putInt,             "putInt",             "(Ljava/lang/String;I)V") \\r
+  METHOD (putLong,            "putLong",            "(Ljava/lang/String;J)V") \\r
+  METHOD (putLongArray,       "putLongArray",       "(Ljava/lang/String;[J)V") \\r
+  METHOD (putString,          "putString",          "(Ljava/lang/String;Ljava/lang/String;)V") \\r
+  METHOD (putStringArrayList, "putStringArrayList", "(Ljava/lang/String;Ljava/util/ArrayList;)V")\r
+\r
+DECLARE_JNI_CLASS (JavaBundle, "android/os/Bundle");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (get,       "get",       "([B)Ljava/nio/ByteBuffer;") \\r
   METHOD (remaining, "remaining", "()I")\r
 \r
-DECLARE_JNI_CLASS (JavaByteBuffer, "java/nio/ByteBuffer")\r
+DECLARE_JNI_CLASS (JavaByteBuffer, "java/nio/ByteBuffer");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (toString, "toString", "()Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (JavaCharSequence, "java/lang/CharSequence")\r
+DECLARE_JNI_CLASS (JavaCharSequence, "java/lang/CharSequence");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -586,13 +566,13 @@ DECLARE_JNI_CLASS (JavaCharSequence, "java/lang/CharSequence")
   METHOD (getSuperclass,     "getSuperclass",     "()Ljava/lang/Class;") \\r
   METHOD (getClassLoader,    "getClassLoader",    "()Ljava/lang/ClassLoader;") \\r
 \r
-DECLARE_JNI_CLASS (JavaClass, "java/lang/Class")\r
+DECLARE_JNI_CLASS (JavaClass, "java/lang/Class");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (toString, "toString", "()Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (JavaEnum, "java/lang/Enum")\r
+DECLARE_JNI_CLASS (JavaEnum, "java/lang/Enum");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -600,7 +580,7 @@ DECLARE_JNI_CLASS (JavaEnum, "java/lang/Enum")
  METHOD (getAbsolutePath, "getAbsolutePath", "()Ljava/lang/String;") \\r
  METHOD (length,          "length",          "()J")\r
 \r
-DECLARE_JNI_CLASS (JavaFile, "java/io/File")\r
+DECLARE_JNI_CLASS (JavaFile, "java/io/File");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -608,7 +588,7 @@ DECLARE_JNI_CLASS (JavaFile, "java/io/File")
  METHOD (close,       "close",  "()V") \\r
  METHOD (read,        "read",   "([B)I")\r
 \r
-DECLARE_JNI_CLASS (JavaFileInputStream, "java/io/FileInputStream")\r
+DECLARE_JNI_CLASS (JavaFileInputStream, "java/io/FileInputStream");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -616,14 +596,14 @@ DECLARE_JNI_CLASS (JavaFileInputStream, "java/io/FileInputStream")
  METHOD (close,       "close",  "()V") \\r
  METHOD (write,       "write",  "([BII)V")\r
 \r
-DECLARE_JNI_CLASS (JavaFileOutputStream, "java/io/FileOutputStream")\r
+DECLARE_JNI_CLASS (JavaFileOutputStream, "java/io/FileOutputStream");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor,             "<init>", "()V") \\r
   METHOD (constructorWithCapacity, "<init>", "(I)V")\r
 \r
-DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap")\r
+DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -631,27 +611,27 @@ DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap")
   STATICMETHOD (valueOf,  "valueOf",  "(I)Ljava/lang/Integer;") \\r
   METHOD (intValue, "intValue", "()I")\r
 \r
-DECLARE_JNI_CLASS (JavaInteger, "java/lang/Integer")\r
+DECLARE_JNI_CLASS (JavaInteger, "java/lang/Integer");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (hasNext, "hasNext", "()Z") \\r
   METHOD (next,    "next",    "()Ljava/lang/Object;")\r
 \r
-DECLARE_JNI_CLASS (JavaIterator, "java/util/Iterator")\r
+DECLARE_JNI_CLASS (JavaIterator, "java/util/Iterator");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (get,  "get",  "(I)Ljava/lang/Object;") \\r
   METHOD (size, "size", "()I")\r
 \r
-DECLARE_JNI_CLASS (JavaList, "java/util/List")\r
+DECLARE_JNI_CLASS (JavaList, "java/util/List");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor, "<init>", "(J)V")\r
 \r
-DECLARE_JNI_CLASS (JavaLong, "java/lang/Long")\r
+DECLARE_JNI_CLASS (JavaLong, "java/lang/Long");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -659,7 +639,7 @@ DECLARE_JNI_CLASS (JavaLong, "java/lang/Long")
   METHOD (keySet, "keySet", "()Ljava/util/Set;") \\r
   METHOD (put,    "put",    "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")\r
 \r
-DECLARE_JNI_CLASS (JavaMap, "java/util/Map")\r
+DECLARE_JNI_CLASS (JavaMap, "java/util/Map");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -671,7 +651,7 @@ DECLARE_JNI_CLASS (JavaMap, "java/util/Map")
   METHOD (hashCode,          "hashCode",          "()I") \\r
   METHOD (equals,            "equals",            "(Ljava/lang/Object;)Z") \\r
 \r
-DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method")\r
+DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 \r
@@ -680,7 +660,7 @@ DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method")
   METHOD (getClass, "getClass", "()Ljava/lang/Class;") \\r
   METHOD (toString, "toString", "()Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (JavaObject, "java/lang/Object")\r
+DECLARE_JNI_CLASS (JavaObject, "java/lang/Object");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -688,14 +668,14 @@ DECLARE_JNI_CLASS (JavaObject, "java/lang/Object")
   METHOD (iterator, "iterator", "()Ljava/util/Iterator;") \\r
   METHOD (size,     "size",     "()I")\r
 \r
-DECLARE_JNI_CLASS (JavaSet, "java/util/Set")\r
+DECLARE_JNI_CLASS (JavaSet, "java/util/Set");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (concat,   "concat",   "(Ljava/lang/String;)Ljava/lang/String;") \\r
   METHOD (getBytes, "getBytes", "()[B")\r
 \r
-DECLARE_JNI_CLASS (JavaString, "java/lang/String")\r
+DECLARE_JNI_CLASS (JavaString, "java/lang/String");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -761,21 +741,6 @@ namespace
 \r
         return result;\r
     }\r
-\r
-    inline bool jniCheckHasExceptionOccurredAndClear()\r
-    {\r
-        auto* env = getEnv();\r
-\r
-        LocalRef<jobject> exception (env->ExceptionOccurred());\r
-\r
-        if (exception != nullptr)\r
-        {\r
-            env->ExceptionClear();\r
-            return true;\r
-        }\r
-\r
-        return false;\r
-    }\r
 }\r
 \r
 //==============================================================================\r
@@ -813,24 +778,4 @@ LocalRef<jobject> CreateJavaInterface (AndroidInterfaceImplementer* implementer,
 LocalRef<jobject> CreateJavaInterface (AndroidInterfaceImplementer* implementer,\r
                                        const String& interfaceName);\r
 \r
-//==============================================================================\r
-class AppPausedResumedListener     : public AndroidInterfaceImplementer\r
-{\r
-public:\r
-    struct Owner\r
-    {\r
-        virtual ~Owner() {}\r
-\r
-        virtual void appPaused() = 0;\r
-        virtual void appResumed() = 0;\r
-    };\r
-\r
-    AppPausedResumedListener (Owner&);\r
-\r
-    jobject invoke (jobject proxy, jobject method, jobjectArray args) override;\r
-\r
-private:\r
-    Owner& owner;\r
-};\r
-\r
 } // namespace juce\r
index 13f97fecde61567489854e3ad3db253b23ed5034..bc231a734703c74989743e0b48f33e9275f6e219 100644 (file)
@@ -27,7 +27,7 @@ namespace juce
  METHOD (constructor, "<init>", "()V") \\r
  METHOD (toString, "toString", "()Ljava/lang/String;") \\r
 \r
-DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer")\r
+DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -40,7 +40,7 @@ DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer")
  METHOD (isExhausted, "isExhausted", "()Z") \\r
  METHOD (setPosition, "setPosition", "(J)Z") \\r
 \r
-DECLARE_JNI_CLASS (HTTPStream, JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream")\r
+DECLARE_JNI_CLASS (HTTPStream, JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -48,7 +48,7 @@ DECLARE_JNI_CLASS (HTTPStream, JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream")
  METHOD (close,     "close",     "()V") \\r
  METHOD (read,      "read",      "([BII)I") \\r
 \r
-DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream")\r
+DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -342,22 +342,15 @@ URL::DownloadTask* URL::downloadToFile (const File& targetLocation, String extra
 }\r
 \r
 //==============================================================================\r
-#if __ANDROID_API__ < 24   // Android support for getifadds was added in Android 7.0 (API 24) so the posix implementation does not apply\r
-\r
-static IPAddress makeAddress (const sockaddr_in *addr_in)\r
+static void addAddress (const sockaddr_in* addr_in, Array<IPAddress>& result)\r
 {\r
-    if (addr_in->sin_addr.s_addr == INADDR_NONE)\r
-        return {};\r
+    in_addr_t addr = addr_in->sin_addr.s_addr;\r
 \r
-    return IPAddress (ntohl (addr_in->sin_addr.s_addr));\r
+    if (addr != INADDR_NONE)\r
+        result.addIfNotAlreadyThere (IPAddress (ntohl (addr)));\r
 }\r
 \r
-struct InterfaceInfo\r
-{\r
-    IPAddress interfaceAddress, broadcastAddress;\r
-};\r
-\r
-static Array<InterfaceInfo> findIPAddresses (int dummySocket)\r
+static void findIPAddresses (int sock, Array<IPAddress>& result)\r
 {\r
     ifconf cfg;\r
     HeapBlock<char> buffer;\r
@@ -371,66 +364,40 @@ static Array<InterfaceInfo> findIPAddresses (int dummySocket)
         cfg.ifc_len = bufferSize;\r
         cfg.ifc_buf = buffer;\r
 \r
-        if (ioctl (dummySocket, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL)\r
-            return {};\r
+        if (ioctl (sock, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL)\r
+            return;\r
 \r
     } while (bufferSize < cfg.ifc_len + 2 * (int) (IFNAMSIZ + sizeof (struct sockaddr_in6)));\r
 \r
-    Array<InterfaceInfo> result;\r
+   #if JUCE_MAC || JUCE_IOS\r
+    while (cfg.ifc_len >= (int) (IFNAMSIZ + sizeof (struct sockaddr_in)))\r
+    {\r
+        if (cfg.ifc_req->ifr_addr.sa_family == AF_INET) // Skip non-internet addresses\r
+            addAddress ((const sockaddr_in*) &cfg.ifc_req->ifr_addr, result);\r
 \r
+        cfg.ifc_len -= IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len;\r
+        cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len;\r
+    }\r
+   #else\r
     for (size_t i = 0; i < (size_t) cfg.ifc_len / (size_t) sizeof (struct ifreq); ++i)\r
     {\r
-        auto& item = cfg.ifc_req[i];\r
+        const ifreq& item = cfg.ifc_req[i];\r
 \r
         if (item.ifr_addr.sa_family == AF_INET)\r
-        {\r
-            InterfaceInfo info;\r
-            info.interfaceAddress = makeAddress ((const sockaddr_in*) &item.ifr_addr);\r
-\r
-            if (! info.interfaceAddress.isNull())\r
-            {\r
-                if (ioctl (dummySocket, SIOCGIFBRDADDR, &item) == 0)\r
-                    info.broadcastAddress = makeAddress ((const sockaddr_in*) &item.ifr_broadaddr);\r
-\r
-                result.add (info);\r
-            }\r
-        }\r
-        else if (item.ifr_addr.sa_family == AF_INET6)\r
-        {\r
-            // TODO: IPv6\r
-        }\r
+            addAddress ((const sockaddr_in*) &item.ifr_addr, result);\r
     }\r
-\r
-    return result;\r
-}\r
-\r
-static Array<InterfaceInfo> findIPAddresses()\r
-{\r
-    auto dummySocket = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control\r
-\r
-    if (dummySocket < 0)\r
-        return {};\r
-\r
-    auto result = findIPAddresses (dummySocket);\r
-    ::close (dummySocket);\r
-    return result;\r
+   #endif\r
 }\r
 \r
 void IPAddress::findAllAddresses (Array<IPAddress>& result, bool /*includeIPv6*/)\r
 {\r
-    for (auto& a : findIPAddresses())\r
-        result.add (a.interfaceAddress);\r
-}\r
-\r
-IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress& address)\r
-{\r
-    for (auto& a : findIPAddresses())\r
-        if (a.interfaceAddress == address)\r
-            return a.broadcastAddress;\r
+    const int sock = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control\r
 \r
-    return {};\r
+    if (sock >= 0)\r
+    {\r
+        findIPAddresses (sock, result);\r
+        ::close (sock);\r
+    }\r
 }\r
 \r
-#endif\r
-\r
 } // namespace juce\r
index ff2afa64ef242c6c1f3447a155cea131422da2fc..6089fd7a289d94c30d4e0cfd0cc1011330204e0c 100644 (file)
@@ -26,7 +26,7 @@ namespace juce
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  STATICMETHOD (newProxyInstance, "newProxyInstance", "(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;") \\r
 \r
- DECLARE_JNI_CLASS (JavaProxy, "java/lang/reflect/Proxy")\r
+ DECLARE_JNI_CLASS (JavaProxy, "java/lang/reflect/Proxy");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 JNIClassBase::JNIClassBase (const char* cp)   : classPath (cp), classRef (0)\r
@@ -200,35 +200,6 @@ JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024Nativ
     juce_dispatchDelete (env, thisPtr);\r
 }\r
 \r
-//==============================================================================\r
-AppPausedResumedListener::AppPausedResumedListener (Owner& ownerToUse)\r
-    : owner (ownerToUse)\r
-{\r
-}\r
-\r
-jobject AppPausedResumedListener::invoke (jobject proxy, jobject method, jobjectArray args)\r
-{\r
-    auto* env = getEnv();\r
-\r
-    auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
-\r
-    int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
-\r
-    if (methodName == "appPaused" && numArgs == 0)\r
-    {\r
-        owner.appPaused();\r
-        return nullptr;\r
-    }\r
-\r
-    if (methodName == "appResumed" && numArgs == 0)\r
-    {\r
-        owner.appResumed();\r
-        return nullptr;\r
-    }\r
-\r
-    return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
-}\r
-\r
 //==============================================================================\r
 JavaVM* androidJNIJavaVM = nullptr;\r
 \r
@@ -364,7 +335,7 @@ namespace AndroidStatsHelpers
     #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
      STATICMETHOD (getProperty, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;")\r
 \r
-    DECLARE_JNI_CLASS (SystemClass, "java/lang/System")\r
+    DECLARE_JNI_CLASS (SystemClass, "java/lang/System");\r
     #undef JNI_CLASS_MEMBERS\r
 \r
     static inline String getSystemProperty (const String& name)\r
@@ -382,7 +353,7 @@ namespace AndroidStatsHelpers
     }\r
 \r
     #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD)\r
-    DECLARE_JNI_CLASS (BuildClass, "android/os/Build")\r
+    DECLARE_JNI_CLASS (BuildClass, "android/os/Build");\r
     #undef JNI_CLASS_MEMBERS\r
 \r
     static inline String getAndroidOsBuildValue (const char* fieldName)\r
@@ -433,7 +404,7 @@ String SystemStats::getCpuModel()
     return readPosixConfigFileValue ("/proc/cpuinfo", "Hardware");\r
 }\r
 \r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
 {\r
     int maxFreqKHz = 0;\r
 \r
index 27430b6550e32ed24d6522929164aae64f81653a..0e9927462cac584accc670d5649cf65e199a6a09 100644 (file)
 namespace juce\r
 {\r
 \r
-struct CURLSymbols\r
-{\r
-    CURL* (*curl_easy_init) (void);\r
-    CURLcode (*curl_easy_setopt) (CURL *curl, CURLoption option, ...);\r
-    void (*curl_easy_cleanup) (CURL *curl);\r
-    CURLcode (*curl_easy_getinfo) (CURL *curl, CURLINFO info, ...);\r
-    CURLMcode (*curl_multi_add_handle) (CURLM *multi_handle, CURL *curl_handle);\r
-    CURLMcode (*curl_multi_cleanup) (CURLM *multi_handle);\r
-    CURLMcode (*curl_multi_fdset) (CURLM *multi_handle, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd);\r
-    CURLMsg* (*curl_multi_info_read) (CURLM *multi_handle, int *msgs_in_queue);\r
-    CURLM* (*curl_multi_init) (void);\r
-    CURLMcode (*curl_multi_perform) (CURLM *multi_handle, int *running_handles);\r
-    CURLMcode (*curl_multi_remove_handle) (CURLM *multi_handle, CURL *curl_handle);\r
-    CURLMcode (*curl_multi_timeout) (CURLM *multi_handle, long *milliseconds);\r
-    struct curl_slist* (*curl_slist_append) (struct curl_slist *, const char *);\r
-    void (*curl_slist_free_all) (struct curl_slist *);\r
-    curl_version_info_data* (*curl_version_info) (CURLversion);\r
-\r
-    static std::unique_ptr<CURLSymbols> create()\r
-    {\r
-        std::unique_ptr<CURLSymbols> symbols (new CURLSymbols);\r
-\r
-       #if JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
-        const ScopedLock sl (getLibcurlLock());\r
-        #define JUCE_INIT_CURL_SYMBOL(name)  if (! symbols->loadSymbol (symbols->name, #name)) return nullptr;\r
-       #else\r
-        #define JUCE_INIT_CURL_SYMBOL(name)  symbols->name = ::name;\r
-       #endif\r
-\r
-        JUCE_INIT_CURL_SYMBOL (curl_easy_init)\r
-        JUCE_INIT_CURL_SYMBOL (curl_easy_setopt)\r
-        JUCE_INIT_CURL_SYMBOL (curl_easy_cleanup)\r
-        JUCE_INIT_CURL_SYMBOL (curl_easy_getinfo)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_add_handle)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_cleanup)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_fdset)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_info_read)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_init)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_perform)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_remove_handle)\r
-        JUCE_INIT_CURL_SYMBOL (curl_multi_timeout)\r
-        JUCE_INIT_CURL_SYMBOL (curl_slist_append)\r
-        JUCE_INIT_CURL_SYMBOL (curl_slist_free_all)\r
-        JUCE_INIT_CURL_SYMBOL (curl_version_info)\r
-\r
-        return symbols;\r
-    }\r
-\r
-    // liburl's curl_multi_init calls curl_global_init which is not thread safe\r
-    // so we need to get a lock during calls to curl_multi_init and curl_multi_cleanup\r
-    static CriticalSection& getLibcurlLock() noexcept\r
-    {\r
-        static CriticalSection cs;\r
-        return cs;\r
-    }\r
-\r
-private:\r
-    CURLSymbols() = default;\r
-\r
-   #if JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
-    static DynamicLibrary& getLibcurl()\r
-    {\r
-        const ScopedLock sl (getLibcurlLock());\r
-        static DynamicLibrary libcurl;\r
-\r
-        if (libcurl.getNativeHandle() == nullptr)\r
-            for (auto libName : { "libcurl.so", "libcurl.so.4", "libcurl.so.3" })\r
-                if (libcurl.open (libName))\r
-                    break;\r
-\r
-        return libcurl;\r
-    }\r
-\r
-    template <typename FuncPtr>\r
-    bool loadSymbol (FuncPtr& dst, const char* name)\r
-    {\r
-        dst = reinterpret_cast<FuncPtr> (getLibcurl().getFunction (name));\r
-        return (dst != nullptr);\r
-    }\r
-   #endif\r
-};\r
-\r
-\r
-//==============================================================================\r
 class WebInputStream::Pimpl\r
 {\r
 public:\r
@@ -114,19 +30,14 @@ public:
         : owner (ownerStream), url (urlToCopy), isPost (shouldUsePost),\r
           httpRequest (isPost ? "POST" : "GET")\r
     {\r
-        jassert (symbols); // Unable to load libcurl!\r
-\r
-        {\r
-            const ScopedLock sl (CURLSymbols::getLibcurlLock());\r
-            multi = symbols->curl_multi_init();\r
-        }\r
+        multi = curl_multi_init();\r
 \r
         if (multi != nullptr)\r
         {\r
-            curl = symbols->curl_easy_init();\r
+            curl = curl_easy_init();\r
 \r
             if (curl != nullptr)\r
-                if (symbols->curl_multi_add_handle (multi, curl) == CURLM_OK)\r
+                if (curl_multi_add_handle (multi, curl) == CURLM_OK)\r
                     return;\r
         }\r
 \r
@@ -189,25 +100,24 @@ public:
     void cleanup()\r
     {\r
         const ScopedLock lock (cleanupLock);\r
-        const ScopedLock sl (CURLSymbols::getLibcurlLock());\r
 \r
         if (curl != nullptr)\r
         {\r
-            symbols->curl_multi_remove_handle (multi, curl);\r
+            curl_multi_remove_handle (multi, curl);\r
 \r
             if (headerList != nullptr)\r
             {\r
-                symbols->curl_slist_free_all (headerList);\r
+                curl_slist_free_all (headerList);\r
                 headerList = nullptr;\r
             }\r
 \r
-            symbols->curl_easy_cleanup (curl);\r
+            curl_easy_cleanup (curl);\r
             curl = nullptr;\r
         }\r
 \r
         if (multi != nullptr)\r
         {\r
-            symbols->curl_multi_cleanup (multi);\r
+            curl_multi_cleanup (multi);\r
             multi = nullptr;\r
         }\r
     }\r
@@ -222,7 +132,7 @@ public:
     {\r
         auto address = url.toString (! isPost);\r
 \r
-        curl_version_info_data* data = symbols->curl_version_info (CURLVERSION_NOW);\r
+        curl_version_info_data* data = curl_version_info (CURLVERSION_NOW);\r
         jassert (data != nullptr);\r
 \r
         if (! requestHeaders.endsWithChar ('\n'))\r
@@ -236,22 +146,22 @@ public:
 \r
         auto userAgent = String ("curl/") + data->version;\r
 \r
-        if (symbols->curl_easy_setopt (curl, CURLOPT_URL, address.toRawUTF8()) == CURLE_OK\r
-            && symbols->curl_easy_setopt (curl, CURLOPT_WRITEDATA, this) == CURLE_OK\r
-            && symbols->curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, StaticCurlWrite) == CURLE_OK\r
-            && symbols->curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1) == CURLE_OK\r
-            && symbols->curl_easy_setopt (curl, CURLOPT_MAXREDIRS, static_cast<long> (maxRedirects)) == CURLE_OK\r
-            && symbols->curl_easy_setopt (curl, CURLOPT_USERAGENT, userAgent.toRawUTF8()) == CURLE_OK\r
-            && symbols->curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, (maxRedirects > 0 ? 1 : 0)) == CURLE_OK)\r
+        if (curl_easy_setopt (curl, CURLOPT_URL, address.toRawUTF8()) == CURLE_OK\r
+            && curl_easy_setopt (curl, CURLOPT_WRITEDATA, this) == CURLE_OK\r
+            && curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, StaticCurlWrite) == CURLE_OK\r
+            && curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1) == CURLE_OK\r
+            && curl_easy_setopt (curl, CURLOPT_MAXREDIRS, static_cast<long> (maxRedirects)) == CURLE_OK\r
+            && curl_easy_setopt (curl, CURLOPT_USERAGENT, userAgent.toRawUTF8()) == CURLE_OK\r
+            && curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, (maxRedirects > 0 ? 1 : 0)) == CURLE_OK)\r
         {\r
             if (isPost)\r
             {\r
-                if (symbols->curl_easy_setopt (curl, CURLOPT_READDATA, this) != CURLE_OK\r
-                    || symbols->curl_easy_setopt (curl, CURLOPT_READFUNCTION, StaticCurlRead) != CURLE_OK)\r
+                if (curl_easy_setopt (curl, CURLOPT_READDATA, this) != CURLE_OK\r
+                    || curl_easy_setopt (curl, CURLOPT_READFUNCTION, StaticCurlRead) != CURLE_OK)\r
                     return false;\r
 \r
-                if (symbols->curl_easy_setopt (curl, CURLOPT_POST, 1) != CURLE_OK\r
-                    || symbols->curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast<curl_off_t> (headersAndPostData.getSize())) != CURLE_OK)\r
+                if (curl_easy_setopt (curl, CURLOPT_POST, 1) != CURLE_OK\r
+                    || curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast<curl_off_t> (headersAndPostData.getSize())) != CURLE_OK)\r
                     return false;\r
             }\r
 \r
@@ -259,20 +169,20 @@ public:
             bool hasSpecialRequestCmd = isPost ? (httpRequest != "POST") : (httpRequest != "GET");\r
 \r
             if (hasSpecialRequestCmd)\r
-                if (symbols->curl_easy_setopt (curl, CURLOPT_CUSTOMREQUEST, httpRequest.toRawUTF8()) != CURLE_OK)\r
+                if (curl_easy_setopt (curl, CURLOPT_CUSTOMREQUEST, httpRequest.toRawUTF8()) != CURLE_OK)\r
                     return false;\r
 \r
-            if (symbols->curl_easy_setopt (curl, CURLOPT_HEADERDATA, this) != CURLE_OK\r
-                || symbols->curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, StaticCurlHeader) != CURLE_OK)\r
+            if (curl_easy_setopt (curl, CURLOPT_HEADERDATA, this) != CURLE_OK\r
+                || curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, StaticCurlHeader) != CURLE_OK)\r
                 return false;\r
 \r
             if (timeOutMs > 0)\r
             {\r
                 auto timeOutSecs = ((long) timeOutMs + 999) / 1000;\r
 \r
-                if (symbols->curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, timeOutSecs) != CURLE_OK\r
-                    || symbols->curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, 100) != CURLE_OK\r
-                    || symbols->curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, timeOutSecs) != CURLE_OK)\r
+                if (curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, timeOutSecs) != CURLE_OK\r
+                    || curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, 100) != CURLE_OK\r
+                    || curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, timeOutSecs) != CURLE_OK)\r
                     return false;\r
             }\r
 \r
@@ -302,10 +212,10 @@ public:
 \r
                 // fromLines will always return at least one line if the string is not empty\r
                 jassert (headerLines.size() > 0);\r
-                headerList = symbols->curl_slist_append (headerList, headerLines [0].toRawUTF8());\r
+                headerList = curl_slist_append (headerList, headerLines [0].toRawUTF8());\r
 \r
                 for (int i = 1; (i < headerLines.size() && headerList != nullptr); ++i)\r
-                    headerList = symbols->curl_slist_append (headerList, headerLines [i].toRawUTF8());\r
+                    headerList = curl_slist_append (headerList, headerLines [i].toRawUTF8());\r
 \r
                 if (headerList == nullptr)\r
                 {\r
@@ -313,7 +223,7 @@ public:
                     return false;\r
                 }\r
 \r
-                if (symbols->curl_easy_setopt (curl, CURLOPT_HTTPHEADER, headerList) != CURLE_OK)\r
+                if (curl_easy_setopt (curl, CURLOPT_HTTPHEADER, headerList) != CURLE_OK)\r
                 {\r
                     cleanup();\r
                     return false;\r
@@ -362,12 +272,12 @@ public:
                 return false;\r
 \r
             long responseCode;\r
-            if (symbols->curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &responseCode) == CURLE_OK)\r
+            if (curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &responseCode) == CURLE_OK)\r
                 statusCode = static_cast<int> (responseCode);\r
 \r
             // get content length size\r
             double curlLength;\r
-            if (symbols->curl_easy_getinfo (curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &curlLength) == CURLE_OK)\r
+            if (curl_easy_getinfo (curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &curlLength) == CURLE_OK)\r
                 contentLength = static_cast<int64> (curlLength);\r
         }\r
 \r
@@ -385,7 +295,7 @@ public:
         {\r
             int cnt = 0;\r
 \r
-            if (CURLMsg* msg = symbols->curl_multi_info_read (multi, &cnt))\r
+            if (CURLMsg* msg = curl_multi_info_read (multi, &cnt))\r
             {\r
                 if (msg->msg == CURLMSG_DONE && msg->easy_handle == curl)\r
                 {\r
@@ -418,7 +328,7 @@ public:
             if (multi == nullptr)\r
                 return;\r
 \r
-            if ((lastError = (int) symbols->curl_multi_timeout (multi, &curl_timeo)) != CURLM_OK)\r
+            if ((lastError = (int) curl_multi_timeout (multi, &curl_timeo)) != CURLM_OK)\r
                 return;\r
         }\r
 \r
@@ -440,7 +350,7 @@ public:
             if (multi == nullptr)\r
                 return;\r
 \r
-            if ((lastError = (int) symbols->curl_multi_fdset (multi, &fdread, &fdwrite, &fdexcep, &maxfd)) != CURLM_OK)\r
+            if ((lastError = (int) curl_multi_fdset (multi, &fdread, &fdwrite, &fdexcep, &maxfd)) != CURLM_OK)\r
                 return;\r
         }\r
 \r
@@ -464,7 +374,7 @@ public:
         {\r
             const ScopedLock lock (cleanupLock);\r
 \r
-            while ((curlRet = (int) symbols->curl_multi_perform (multi, &still_running)) == CURLM_CALL_MULTI_PERFORM)\r
+            while ((curlRet = (int) curl_multi_perform (multi, &still_running)) == CURLM_CALL_MULTI_PERFORM)\r
             {}\r
         }\r
 \r
@@ -600,7 +510,6 @@ public:
     //==============================================================================\r
     WebInputStream& owner;\r
     const URL url;\r
-    std::unique_ptr<CURLSymbols> symbols { CURLSymbols::create() };\r
 \r
     //==============================================================================\r
     // curl stuff\r
index 01a342841b2ab6ca4ff386679688659ade168922..6b27719693c3716eb0fccd8e04d853aae19ac165 100644 (file)
@@ -80,7 +80,7 @@ String SystemStats::getCpuModel()
     return getCpuInfo ("model name");\r
 }\r
 \r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
 {\r
     return roundToInt (getCpuInfo ("cpu MHz").getFloatValue());\r
 }\r
@@ -142,26 +142,16 @@ String SystemStats::getDisplayLanguage() { return getUserLanguage() + "-" + getU
 void CPUInformation::initialise() noexcept\r
 {\r
     auto flags = getCpuInfo ("flags");\r
-    hasMMX             = flags.contains ("mmx");\r
-    hasSSE             = flags.contains ("sse");\r
-    hasSSE2            = flags.contains ("sse2");\r
-    hasSSE3            = flags.contains ("sse3");\r
-    has3DNow           = flags.contains ("3dnow");\r
-    hasSSSE3           = flags.contains ("ssse3");\r
-    hasSSE41           = flags.contains ("sse4_1");\r
-    hasSSE42           = flags.contains ("sse4_2");\r
-    hasAVX             = flags.contains ("avx");\r
-    hasAVX2            = flags.contains ("avx2");\r
-    hasAVX512F         = flags.contains ("avx512f");\r
-    hasAVX512BW        = flags.contains ("avx512bw");\r
-    hasAVX512CD        = flags.contains ("avx512cd");\r
-    hasAVX512DQ        = flags.contains ("avx512dq");\r
-    hasAVX512ER        = flags.contains ("avx512er");\r
-    hasAVX512IFMA      = flags.contains ("avx512ifma");\r
-    hasAVX512PF        = flags.contains ("avx512pf");\r
-    hasAVX512VBMI      = flags.contains ("avx512vbmi");\r
-    hasAVX512VL        = flags.contains ("avx512vl");\r
-    hasAVX512VPOPCNTDQ = flags.contains ("avx512_vpopcntdq");\r
+    hasMMX   = flags.contains ("mmx");\r
+    hasSSE   = flags.contains ("sse");\r
+    hasSSE2  = flags.contains ("sse2");\r
+    hasSSE3  = flags.contains ("sse3");\r
+    has3DNow = flags.contains ("3dnow");\r
+    hasSSSE3 = flags.contains ("ssse3");\r
+    hasSSE41 = flags.contains ("sse4_1");\r
+    hasSSE42 = flags.contains ("sse4_2");\r
+    hasAVX   = flags.contains ("avx");\r
+    hasAVX2  = flags.contains ("avx2");\r
 \r
     numLogicalCPUs  = getCpuInfo ("processor").getIntValue() + 1;\r
 \r
index 55e2a4eeca330b2d913f3fa7f906d3f76e2f4d0d..c055621e033f1416b762f4b986f3a95ce54f53ae 100644 (file)
@@ -65,7 +65,7 @@ namespace MacFileHelpers
         {\r
             const String type (buf.f_fstypename);\r
 \r
-            while (*types != nullptr)\r
+            while (*types != 0)\r
                 if (type.equalsIgnoreCase (*types++))\r
                     return true;\r
         }\r
@@ -105,14 +105,14 @@ namespace MacFileHelpers
    #else\r
     static bool launchExecutable (const String& pathAndArguments)\r
     {\r
-        auto cpid = fork();\r
+        const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), 0 };\r
+\r
+        const int cpid = fork();\r
 \r
         if (cpid == 0)\r
         {\r
-            const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr };\r
-\r
             // Child process\r
-            if (execve (argv[0], (char**) argv, nullptr) < 0)\r
+            if (execve (argv[0], (char**) argv, 0) < 0)\r
                 exit (0);\r
         }\r
         else\r
@@ -412,8 +412,10 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String&
     JUCE_AUTORELEASEPOOL\r
     {\r
         NSString* fileNameAsNS (juceStringToNS (fileName));\r
-        NSURL* filenameAsURL = File::createFileWithoutCheckingPath (fileName).exists() ? [NSURL fileURLWithPath: fileNameAsNS]\r
-                                                                                       : [NSURL URLWithString: fileNameAsNS];\r
+        NSURL* filenameAsURL ([NSURL URLWithString: fileNameAsNS]);\r
+\r
+        if (filenameAsURL == nil)\r
+            filenameAsURL = [NSURL fileURLWithPath: fileNameAsNS];\r
 \r
       #if JUCE_IOS\r
         ignoreUnused (parameters);\r
@@ -440,13 +442,11 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String&
             StringArray params;\r
             params.addTokens (parameters, true);\r
 \r
-            NSMutableDictionary* dict = [[NSMutableDictionary new] autorelease];\r
-\r
-            NSMutableArray* paramArray = [[NSMutableArray new] autorelease];\r
-\r
+            NSMutableArray* paramArray = [[[NSMutableArray alloc] init] autorelease];\r
             for (int i = 0; i < params.size(); ++i)\r
                 [paramArray addObject: juceStringToNS (params[i])];\r
 \r
+            NSMutableDictionary* dict = [[[NSMutableDictionary alloc] init] autorelease];\r
             [dict setObject: paramArray\r
                      forKey: nsStringLiteral ("NSWorkspaceLaunchConfigurationArguments")];\r
 \r
index 8ea082e4d93f098ab3332031f6d443499e1263f2..339f014064f19cf6a47d5a4ce1050762b5a70352 100644 (file)
@@ -32,10 +32,10 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result)
         for (const ifaddrs* cursor = addrs; cursor != nullptr; cursor = cursor->ifa_next)\r
         {\r
             // Required to avoid misaligned pointer access\r
-            sockaddr sto;\r
-            std::memcpy (&sto, cursor->ifa_addr, sizeof (sockaddr));\r
+            sockaddr_storage sto;\r
+            std::memcpy (&sto, cursor->ifa_addr, sizeof (sockaddr_storage));\r
 \r
-            if (sto.sa_family == AF_LINK)\r
+            if (sto.ss_family == AF_LINK)\r
             {\r
                 auto sadd = (const sockaddr_dl*) cursor->ifa_addr;\r
 \r
@@ -331,8 +331,7 @@ public:
     NSMutableData* data = nil;\r
     NSDictionary* headers = nil;\r
     int statusCode = 0;\r
-    std::atomic<bool> initialised { false };\r
-    bool hasFailed = false, hasFinished = false, isBeingDeleted = false;\r
+    bool initialised = false, hasFailed = false, hasFinished = false, isBeingDeleted = false;\r
     const int numRedirectsToFollow;\r
     int numRedirects = 0;\r
     int64 latestTotalBytes = 0;\r
@@ -809,8 +808,7 @@ public:
     {\r
         DBG (nsStringToJuce ([error description])); ignoreUnused (error);\r
         nsUrlErrorCode = [error code];\r
-        hasFailed = true;\r
-        initialised = true;\r
+        hasFailed = initialised = true;\r
         signalThreadShouldExit();\r
     }\r
 \r
@@ -828,8 +826,7 @@ public:
 \r
     void finishedLoading()\r
     {\r
-        hasFinished = true;\r
-        initialised = true;\r
+        hasFinished = initialised = true;\r
         signalThreadShouldExit();\r
     }\r
 \r
@@ -863,7 +860,7 @@ public:
     NSDictionary* headers = nil;\r
     NSInteger nsUrlErrorCode = 0;\r
     int statusCode = 0;\r
-    std::atomic<bool> initialised { false }, hasFailed { false }, hasFinished { false };\r
+    bool initialised = false, hasFailed = false, hasFinished = false;\r
     const int numRedirectsToFollow;\r
     int numRedirects = 0;\r
     int latestTotalBytes = 0;\r
index 40be0e8a193c475babca03c9064cc3aecce9e675..61f30118cd59842345f275d7dd1ea6dd1483deeb 100644 (file)
@@ -25,7 +25,7 @@ namespace juce
 \r
 String String::fromCFString (CFStringRef cfString)\r
 {\r
-    if (cfString == nullptr)\r
+    if (cfString == 0)\r
         return {};\r
 \r
     CFRange range = { 0, CFStringGetLength (cfString) };\r
@@ -72,7 +72,7 @@ String String::convertToPrecomposedUnicode() const
 \r
     map.mappingVersion = kUnicodeUseLatestMapping;\r
 \r
-    UnicodeToTextInfo conversionInfo = {};\r
+    UnicodeToTextInfo conversionInfo = 0;\r
     String result;\r
 \r
     if (CreateUnicodeToTextInfo (&map, &conversionInfo) == noErr)\r
@@ -88,7 +88,7 @@ String String::convertToPrecomposedUnicode() const
         if (ConvertFromUnicodeToText (conversionInfo,\r
                                       bytesNeeded, (ConstUniCharArrayPtr) toUTF16().getAddress(),\r
                                       kUnicodeDefaultDirectionMask,\r
-                                      0, {}, {}, {},\r
+                                      0, 0, 0, 0,\r
                                       bytesNeeded, &bytesRead,\r
                                       &outputBufferSize, tempOut) == noErr)\r
         {\r
index 4fc323d89e59b860f827591fea6cac457902c770..993d0a01392816a9b500776867cfad01a5750e40 100644 (file)
@@ -51,17 +51,14 @@ namespace SystemStatsHelpers
     {\r
         uint32 la = a, lb = b, lc = c, ld = d;\r
 \r
-       #if JUCE_32BIT && defined (__pic__)\r
-        asm ("mov %%ebx, %%edi\n"\r
-             "cpuid\n"\r
-             "xchg %%edi, %%ebx\n"\r
-               : "=a" (la), "=D" (lb), "=c" (lc), "=d" (ld)\r
-               : "a" (type), "c" (0));\r
-       #else\r
-        asm ("cpuid\n"\r
-               : "=a" (la), "=b" (lb), "=c" (lc), "=d" (ld)\r
-               : "a" (type), "c" (0));\r
-       #endif\r
+        asm ("mov %%ebx, %%esi \n\t"\r
+             "cpuid \n\t"\r
+             "xchg %%esi, %%ebx"\r
+               : "=a" (la), "=S" (lb), "=c" (lc), "=d" (ld) : "a" (type)\r
+           #if JUCE_64BIT\r
+                  , "b" (lb), "c" (lc), "d" (ld)\r
+           #endif\r
+        );\r
 \r
         a = la; b = lb; c = lc; d = ld;\r
     }\r
@@ -86,17 +83,7 @@ void CPUInformation::initialise() noexcept
     hasAVX   = (c & (1u << 28)) != 0;\r
 \r
     SystemStatsHelpers::doCPUID (a, b, c, d, 7);\r
-    hasAVX2            = (b & (1u <<  5)) != 0;\r
-    hasAVX512F         = (b & (1u << 16)) != 0;\r
-    hasAVX512DQ        = (b & (1u << 17)) != 0;\r
-    hasAVX512IFMA      = (b & (1u << 21)) != 0;\r
-    hasAVX512PF        = (b & (1u << 26)) != 0;\r
-    hasAVX512ER        = (b & (1u << 27)) != 0;\r
-    hasAVX512CD        = (b & (1u << 28)) != 0;\r
-    hasAVX512BW        = (b & (1u << 30)) != 0;\r
-    hasAVX512VL        = (b & (1u << 31)) != 0;\r
-    hasAVX512VBMI      = (c & (1u <<  1)) != 0;\r
-    hasAVX512VPOPCNTDQ = (c & (1u << 14)) != 0;\r
+    hasAVX2  = (b & (1u <<  5)) != 0;\r
    #endif\r
 \r
     numLogicalCPUs = (int) [[NSProcessInfo processInfo] activeProcessorCount];\r
@@ -153,20 +140,17 @@ String SystemStats::getOperatingSystemName()
 String SystemStats::getDeviceDescription()\r
 {\r
    #if JUCE_IOS\r
-    const char* name = "hw.machine";\r
+    return nsStringToJuce ([[UIDevice currentDevice] model]);\r
    #else\r
-    const char* name = "hw.model";\r
-   #endif\r
-\r
     size_t size;\r
-    if (sysctlbyname (name, nullptr, &size, nullptr, 0) >= 0)\r
+    if (sysctlbyname ("hw.model", nullptr, &size, nullptr, 0) >= 0)\r
     {\r
         HeapBlock<char> model (size);\r
-        if (sysctlbyname (name, model,   &size, nullptr, 0) >= 0)\r
+        if (sysctlbyname ("hw.model", model,   &size, nullptr, 0) >= 0)\r
             return model.get();\r
     }\r
-\r
     return {};\r
+   #endif\r
 }\r
 \r
 String SystemStats::getDeviceManufacturer()\r
@@ -190,7 +174,7 @@ int SystemStats::getMemorySizeInMegabytes()
     uint64 mem = 0;\r
     size_t memSize = sizeof (mem);\r
     int mib[] = { CTL_HW, HW_MEMSIZE };\r
-    sysctl (mib, 2, &mem, &memSize, nullptr, 0);\r
+    sysctl (mib, 2, &mem, &memSize, 0, 0);\r
     return (int) (mem / (1024 * 1024));\r
 }\r
 \r
@@ -219,12 +203,12 @@ String SystemStats::getCpuModel()
     return {};\r
 }\r
 \r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
 {\r
     uint64 speedHz = 0;\r
     size_t speedSize = sizeof (speedHz);\r
     int mib[] = { CTL_HW, HW_CPU_FREQ };\r
-    sysctl (mib, 2, &speedHz, &speedSize, nullptr, 0);\r
+    sysctl (mib, 2, &speedHz, &speedSize, 0, 0);\r
 \r
    #if JUCE_BIG_ENDIAN\r
     if (speedSize == 4)\r
index 36943c77a9b906a258db6260cd1cdc5a1a25d443..25b16f7eb76f887711e84282dc445052322f527b 100644 (file)
@@ -86,7 +86,7 @@ JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() noexcept
     struct kinfo_proc info;\r
     int m[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() };\r
     size_t sz = sizeof (info);\r
-    sysctl (m, 4, &info, &sz, nullptr, 0);\r
+    sysctl (m, 4, &info, &sz, 0, 0);\r
     return (info.kp_proc.p_flag & P_TRACED) != 0;\r
 }\r
 \r
index d98af4f80306cd6bfebc8abcaf7487588d2fdb0e..30d48007868dc993c8a120f60a944d6572597fdb 100644 (file)
@@ -59,7 +59,7 @@ static inline NSURL* createNSURLFromFile (const File& f)
 \r
 static inline NSArray* createNSArrayFromStringArray (const StringArray& strings)\r
 {\r
-    auto array = [[NSMutableArray alloc] init];\r
+    auto* array = [[NSMutableArray alloc] init];\r
 \r
     for (auto string: strings)\r
         [array addObject:juceStringToNS (string)];\r
@@ -71,7 +71,7 @@ static NSArray* varArrayToNSArray (const var& varToParse);
 \r
 static NSDictionary* varObjectToNSDictionary (const var& varToParse)\r
 {\r
-    auto dictionary = [NSMutableDictionary dictionary];\r
+    auto* dictionary = [NSMutableDictionary dictionary];\r
 \r
     if (varToParse.isObject())\r
     {\r
@@ -118,7 +118,7 @@ static NSArray* varArrayToNSArray (const var& varToParse)
 \r
     const auto* varArray = varToParse.getArray();\r
 \r
-    auto array = [NSMutableArray arrayWithCapacity: (NSUInteger) varArray->size()];\r
+    auto* array = [NSMutableArray arrayWithCapacity: (NSUInteger) varArray->size()];\r
 \r
     for (const auto& aVar : *varArray)\r
     {\r
@@ -145,14 +145,29 @@ static NSArray* varArrayToNSArray (const var& varToParse)
     return array;\r
 }\r
 \r
-static var nsObjectToVar (NSObject* array);\r
+static var nsArrayToVar (NSArray* array);\r
 \r
 static var nsDictionaryToVar (NSDictionary* dictionary)\r
 {\r
-    DynamicObject::Ptr dynamicObject (new DynamicObject());\r
+    DynamicObject::Ptr dynamicObject = new DynamicObject();\r
 \r
     for (NSString* key in dictionary)\r
-        dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key]));\r
+    {\r
+        const auto keyString = nsStringToJuce (key);\r
+\r
+        id value = dictionary[key];\r
+\r
+        if ([value isKindOfClass: [NSString class]])\r
+            dynamicObject->setProperty (keyString, nsStringToJuce ((NSString*) value));\r
+        else if ([value isKindOfClass: [NSNumber class]])\r
+            dynamicObject->setProperty (keyString, nsStringToJuce ([(NSNumber*) value stringValue]));\r
+        else if ([value isKindOfClass: [NSDictionary class]])\r
+            dynamicObject->setProperty (keyString, nsDictionaryToVar ((NSDictionary*) value));\r
+        else if ([value isKindOfClass: [NSArray class]])\r
+            dynamicObject->setProperty (keyString, nsArrayToVar ((NSArray*) value));\r
+        else\r
+            jassertfalse; // Unsupported yet, add here!\r
+    }\r
 \r
     return var (dynamicObject.get());\r
 }\r
@@ -162,24 +177,20 @@ static var nsArrayToVar (NSArray* array)
     Array<var> resultArray;\r
 \r
     for (id value in array)\r
-        resultArray.add (nsObjectToVar (value));\r
-\r
-    return var (resultArray);\r
-}\r
-\r
-static var nsObjectToVar (NSObject* obj)\r
-{\r
-    if ([obj isKindOfClass: [NSString class]])          return nsStringToJuce ((NSString*) obj);\r
-    else if ([obj isKindOfClass: [NSNumber class]])     return nsStringToJuce ([(NSNumber*) obj stringValue]);\r
-    else if ([obj isKindOfClass: [NSDictionary class]]) return nsDictionaryToVar ((NSDictionary*) obj);\r
-    else if ([obj isKindOfClass: [NSArray class]])      return nsArrayToVar ((NSArray*) obj);\r
-    else\r
     {\r
-        // Unsupported yet, add here!\r
-        jassertfalse;\r
+        if ([value isKindOfClass: [NSString class]])\r
+            resultArray.add (var (nsStringToJuce ((NSString*) value)));\r
+        else if ([value isKindOfClass: [NSNumber class]])\r
+            resultArray.add (var (nsStringToJuce ([(NSNumber*) value stringValue])));\r
+        else if ([value isKindOfClass: [NSDictionary class]])\r
+            resultArray.add (nsDictionaryToVar ((NSDictionary*) value));\r
+        else if ([value isKindOfClass: [NSArray class]])\r
+            resultArray.add (nsArrayToVar ((NSArray*) value));\r
+        else\r
+            jassertfalse; // Unsupported yet, add here!\r
     }\r
 \r
-    return {};\r
+    return var (resultArray);\r
 }\r
 \r
 #if JUCE_MAC\r
@@ -200,7 +211,7 @@ static NSRect makeNSRect (const RectangleType& r) noexcept
 template <typename ReturnValue, typename... Params>\r
 static inline ReturnValue ObjCMsgSendSuper (struct objc_super* s, SEL sel, Params... params)\r
 {\r
-    using SuperFn = ReturnValue (*)(struct objc_super*, SEL, Params...);\r
+    typedef ReturnValue (*SuperFn)(struct objc_super*, SEL, Params...);\r
     SuperFn fn = reinterpret_cast<SuperFn> (objc_msgSendSuper);\r
     return fn (s, sel, params...);\r
 }\r
@@ -215,6 +226,16 @@ static inline MsgSendFPRetFn getMsgSendFPRetFn() noexcept   { return (MsgSendFPR
 #endif\r
 #endif\r
 \r
+//==============================================================================\r
+template <typename ObjectType>\r
+struct NSObjectRetainer\r
+{\r
+    inline NSObjectRetainer (ObjectType* o) : object (o)  { [object retain]; }\r
+    inline ~NSObjectRetainer()                            { [object release]; }\r
+\r
+    ObjectType* object;\r
+};\r
+\r
 //==============================================================================\r
 struct NSObjectDeleter\r
 {\r
diff --git a/modules/juce_core/native/juce_posix_IPAddress.h b/modules/juce_core/native/juce_posix_IPAddress.h
deleted file mode 100644 (file)
index f063f50..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-namespace\r
-{\r
-    static IPAddress makeAddress (const sockaddr_in6* addr_in)\r
-    {\r
-        if (addr_in == nullptr)\r
-            return {};\r
-\r
-        auto addr = addr_in->sin6_addr;\r
-\r
-        IPAddressByteUnion temp;\r
-        uint16 arr[8];\r
-\r
-        for (int i = 0; i < 8; ++i) // Swap bytes from network to host order\r
-        {\r
-            temp.split[0] = addr.s6_addr[i * 2 + 1];\r
-            temp.split[1] = addr.s6_addr[i * 2];\r
-\r
-            arr[i] = temp.combined;\r
-        }\r
-\r
-        return IPAddress (arr);\r
-    }\r
-\r
-    static IPAddress makeAddress (const sockaddr_in* addr_in)\r
-    {\r
-        if (addr_in->sin_addr.s_addr == INADDR_NONE)\r
-            return {};\r
-\r
-        return IPAddress (ntohl (addr_in->sin_addr.s_addr));\r
-    }\r
-\r
-    struct InterfaceInfo\r
-    {\r
-        IPAddress interfaceAddress, broadcastAddress;\r
-    };\r
-\r
-    bool operator== (const InterfaceInfo& lhs, const InterfaceInfo& rhs)\r
-    {\r
-        return lhs.interfaceAddress == rhs.interfaceAddress\r
-            && lhs.broadcastAddress == rhs.broadcastAddress;\r
-    }\r
-\r
-    bool populateInterfaceInfo (struct ifaddrs* ifa, InterfaceInfo& interfaceInfo)\r
-    {\r
-        if (ifa->ifa_addr != nullptr)\r
-        {\r
-            if (ifa->ifa_addr->sa_family == AF_INET)\r
-            {\r
-                auto interfaceAddressInfo = (sockaddr_in*) ifa->ifa_addr;\r
-                auto broadcastAddressInfo = (sockaddr_in*) ifa->ifa_dstaddr;\r
-\r
-                if (interfaceAddressInfo->sin_addr.s_addr != INADDR_NONE)\r
-                {\r
-                    interfaceInfo.interfaceAddress = makeAddress (interfaceAddressInfo);\r
-                    interfaceInfo.broadcastAddress = makeAddress (broadcastAddressInfo);\r
-                    return true;\r
-                }\r
-            }\r
-            else if (ifa->ifa_addr->sa_family == AF_INET6)\r
-            {\r
-                interfaceInfo.interfaceAddress = makeAddress ((sockaddr_in6*) ifa->ifa_addr);\r
-                interfaceInfo.broadcastAddress = makeAddress ((sockaddr_in6*) ifa->ifa_dstaddr);\r
-                return true;\r
-            }\r
-        }\r
-\r
-        return false;\r
-    }\r
-\r
-    Array<InterfaceInfo> getAllInterfaceInfo()\r
-    {\r
-        Array<InterfaceInfo> interfaces;\r
-        struct ifaddrs* ifaddr = nullptr;\r
-\r
-        if (getifaddrs (&ifaddr) != -1)\r
-        {\r
-            for (auto* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)\r
-            {\r
-                InterfaceInfo i;\r
-\r
-                if (populateInterfaceInfo (ifa, i))\r
-                    interfaces.addIfNotAlreadyThere (i);\r
-            }\r
-\r
-            freeifaddrs (ifaddr);\r
-        }\r
-\r
-        return interfaces;\r
-    }\r
-}\r
-\r
-void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6)\r
-{\r
-    for (auto& i : getAllInterfaceInfo())\r
-        if (includeIPv6 || ! i.interfaceAddress.isIPv6)\r
-            result.addIfNotAlreadyThere (i.interfaceAddress);\r
-}\r
-\r
-IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress& interfaceAddress)\r
-{\r
-    for (auto& i : getAllInterfaceInfo())\r
-        if (i.interfaceAddress == interfaceAddress)\r
-            return i.broadcastAddress;\r
-\r
-    return {};\r
-}\r
-\r
-} // namespace juce\r
index af8b39646aa9792da74fb7faffc0f4470e4ad61c..e063c0737b6e12d68db8ed535006491063b1dbc0 100644 (file)
@@ -47,14 +47,18 @@ public:
         }\r
     }\r
 \r
-    bool connect (int timeOutMilliseconds)\r
-    {\r
-        return openPipe (true, getTimeoutEnd (timeOutMilliseconds));\r
-    }\r
-\r
     int read (char* destBuffer, int maxBytesToRead, int timeOutMilliseconds)\r
     {\r
         auto timeoutEnd = getTimeoutEnd (timeOutMilliseconds);\r
+\r
+        if (pipeIn == -1)\r
+        {\r
+            pipeIn = openPipe (createdPipe ? pipeInName : pipeOutName, O_RDWR | O_NONBLOCK, timeoutEnd);\r
+\r
+            if (pipeIn == -1)\r
+                return -1;\r
+        }\r
+\r
         int bytesRead = 0;\r
 \r
         while (bytesRead < maxBytesToRead)\r
@@ -85,8 +89,13 @@ public:
     {\r
         auto timeoutEnd = getTimeoutEnd (timeOutMilliseconds);\r
 \r
-        if (! openPipe (false, timeoutEnd))\r
-            return -1;\r
+        if (pipeOut == -1)\r
+        {\r
+            pipeOut = openPipe (createdPipe ? pipeOutName : pipeInName, O_WRONLY, timeoutEnd);\r
+\r
+            if (pipeOut == -1)\r
+                return -1;\r
+        }\r
 \r
         int bytesWritten = 0;\r
 \r
@@ -151,25 +160,6 @@ private:
         }\r
     }\r
 \r
-    bool openPipe (bool isInput, uint32 timeoutEnd)\r
-    {\r
-        auto& pipe = isInput ? pipeIn : pipeOut;\r
-        int flags = isInput ? O_RDWR | O_NONBLOCK : O_WRONLY;\r
-\r
-        const String& pipeName = isInput ? (createdPipe ? pipeInName : pipeOutName)\r
-                                         : (createdPipe ? pipeOutName : pipeInName);\r
-\r
-        if (pipe == -1)\r
-        {\r
-            pipe = openPipe (pipeName, flags, timeoutEnd);\r
-\r
-            if (pipe == -1)\r
-                return false;\r
-        }\r
-\r
-        return true;\r
-    }\r
-\r
     static void waitForInput (int handle, int timeoutMsecs) noexcept\r
     {\r
         struct timeval timeout;\r
@@ -180,7 +170,7 @@ private:
         FD_ZERO (&rset);\r
         FD_SET (handle, &rset);\r
 \r
-        select (handle + 1, &rset, nullptr, nullptr, &timeout);\r
+        select (handle + 1, &rset, nullptr, 0, &timeout);\r
     }\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)\r
@@ -221,12 +211,6 @@ bool NamedPipe::openInternal (const String& pipeName, bool createPipe, bool must
         return false;\r
     }\r
 \r
-    if (! pimpl->connect (200))\r
-    {\r
-        pimpl.reset();\r
-        return false;\r
-    }\r
-\r
     return true;\r
 }\r
 \r
index 3786b2caaa30047a975d043e033fec7414e7d0f0..b10a127938fa4e788e543658de56ecaeaa379490 100644 (file)
@@ -44,7 +44,7 @@ void CriticalSection::exit() const noexcept         { pthread_mutex_unlock (&loc
 WaitableEvent::WaitableEvent (bool useManualReset) noexcept\r
     : triggered (false), manualReset (useManualReset)\r
 {\r
-    pthread_cond_init (&condition, {});\r
+    pthread_cond_init (&condition, 0);\r
 \r
     pthread_mutexattr_t atts;\r
     pthread_mutexattr_init (&atts);\r
@@ -78,7 +78,7 @@ bool WaitableEvent::wait (int timeOutMillisecs) const noexcept
         else\r
         {\r
             struct timeval now;\r
-            gettimeofday (&now, nullptr);\r
+            gettimeofday (&now, 0);\r
 \r
             struct timespec time;\r
             time.tv_sec  = now.tv_sec  + (timeOutMillisecs / 1000);\r
@@ -188,8 +188,10 @@ static MaxNumFileHandlesInitialiser maxNumFileHandlesInitialiser;
 #endif\r
 \r
 //==============================================================================\r
-JUCE_DECLARE_DEPRECATED_STATIC (const juce_wchar File::separator = '/';)\r
-JUCE_DECLARE_DEPRECATED_STATIC (const StringRef File::separatorString ("/");)\r
+#ifndef JUCE_GCC\r
+ const juce_wchar File::separator = '/';\r
+ const StringRef File::separatorString ("/");\r
+#endif\r
 \r
 juce_wchar File::getSeparatorChar()    { return '/'; }\r
 StringRef File::getSeparatorString()   { return "/"; }\r
@@ -428,14 +430,11 @@ bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64
 \r
 bool File::deleteFile() const\r
 {\r
-    if (! isSymbolicLink())\r
-    {\r
-        if (! exists())\r
-            return true;\r
+    if (! exists() && ! isSymbolicLink())\r
+        return true;\r
 \r
-        if (isDirectory())\r
-            return rmdir (fullPath.toUTF8()) == 0;\r
-    }\r
+    if (isDirectory())\r
+        return rmdir (fullPath.toUTF8()) == 0;\r
 \r
     return remove (fullPath.toUTF8()) == 0;\r
 }\r
@@ -469,7 +468,7 @@ Result File::createDirectoryInternal (const String& fileName) const
 //==============================================================================\r
 int64 juce_fileSetPosition (void* handle, int64 pos)\r
 {\r
-    if (handle != nullptr && lseek (getFD (handle), (off_t) pos, SEEK_SET) == pos)\r
+    if (handle != 0 && lseek (getFD (handle), (off_t) pos, SEEK_SET) == pos)\r
         return pos;\r
 \r
     return -1;\r
@@ -487,7 +486,7 @@ void FileInputStream::openHandle()
 \r
 FileInputStream::~FileInputStream()\r
 {\r
-    if (fileHandle != nullptr)\r
+    if (fileHandle != 0)\r
         close (getFD (fileHandle));\r
 }\r
 \r
@@ -495,7 +494,7 @@ size_t FileInputStream::readInternal (void* buffer, size_t numBytes)
 {\r
     ssize_t result = 0;\r
 \r
-    if (fileHandle != nullptr)\r
+    if (fileHandle != 0)\r
     {\r
         result = ::read (getFD (fileHandle), buffer, numBytes);\r
 \r
@@ -548,16 +547,16 @@ void FileOutputStream::openHandle()
 \r
 void FileOutputStream::closeHandle()\r
 {\r
-    if (fileHandle != nullptr)\r
+    if (fileHandle != 0)\r
     {\r
         close (getFD (fileHandle));\r
-        fileHandle = nullptr;\r
+        fileHandle = 0;\r
     }\r
 }\r
 \r
 ssize_t FileOutputStream::writeInternal (const void* data, size_t numBytes)\r
 {\r
-    if (fileHandle == nullptr)\r
+    if (fileHandle == 0)\r
         return 0;\r
 \r
     auto result = ::write (getFD (fileHandle), data, numBytes);\r
@@ -571,14 +570,14 @@ ssize_t FileOutputStream::writeInternal (const void* data, size_t numBytes)
 #ifndef JUCE_ANDROID\r
 void FileOutputStream::flushInternal()\r
 {\r
-    if (fileHandle != nullptr && fsync (getFD (fileHandle)) == -1)\r
+    if (fileHandle != 0 && fsync (getFD (fileHandle)) == -1)\r
         status = getResultForErrno();\r
 }\r
 #endif\r
 \r
 Result FileOutputStream::truncate()\r
 {\r
-    if (fileHandle == nullptr)\r
+    if (fileHandle == 0)\r
         return status;\r
 \r
     flush();\r
@@ -610,10 +609,10 @@ void MemoryMappedFile::openInternal (const File& file, AccessMode mode, bool exc
 \r
     if (fileHandle != -1)\r
     {\r
-        auto m = mmap (nullptr, (size_t) range.getLength(),\r
-                       mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ,\r
-                       exclusive ? MAP_PRIVATE : MAP_SHARED, fileHandle,\r
-                       (off_t) range.getStart());\r
+        void* m = mmap (0, (size_t) range.getLength(),\r
+                        mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ,\r
+                        exclusive ? MAP_PRIVATE : MAP_SHARED, fileHandle,\r
+                        (off_t) range.getStart());\r
 \r
         if (m != MAP_FAILED)\r
         {\r
@@ -718,7 +717,23 @@ String File::getVolumeLabel() const
 \r
 int File::getVolumeSerialNumber() const\r
 {\r
-    return 0;\r
+    int result = 0;\r
+/*    int fd = open (getFullPathName().toUTF8(), O_RDONLY | O_NONBLOCK);\r
+\r
+    char info[512];\r
+\r
+    #ifndef HDIO_GET_IDENTITY\r
+     #define HDIO_GET_IDENTITY 0x030d\r
+    #endif\r
+\r
+    if (ioctl (fd, HDIO_GET_IDENTITY, info) == 0)\r
+    {\r
+        DBG (String (info + 20, 20));\r
+        result = String (info + 20, 20).trim().getIntValue();\r
+    }\r
+\r
+    close (fd);*/\r
+    return result;\r
 }\r
 \r
 //==============================================================================\r
@@ -891,22 +906,17 @@ void JUCE_API juce_threadEntryPoint (void*);
 extern JavaVM* androidJNIJavaVM;\r
 #endif\r
 \r
-static void* threadEntryProc (void* userData)\r
+extern "C" void* threadEntryProc (void*);\r
+extern "C" void* threadEntryProc (void* userData)\r
 {\r
    #if JUCE_ANDROID\r
+    // JNI_OnLoad was not called - make sure you load the JUCE shared library\r
+    // using System.load inside of Java\r
+    jassert (androidJNIJavaVM != nullptr);\r
 \r
-    if (androidJNIJavaVM != nullptr)\r
-    {\r
-        JNIEnv* env;\r
-        androidJNIJavaVM->AttachCurrentThread (&env, nullptr);\r
-        setEnv (env);\r
-    }\r
-    else\r
-    {\r
-        // JNI_OnLoad was not called - make sure you load the JUCE shared library\r
-        // using System.load inside of Java\r
-        jassertfalse;\r
-    }\r
+    JNIEnv* env;\r
+    androidJNIJavaVM->AttachCurrentThread (&env, nullptr);\r
+    setEnv (env);\r
    #endif\r
 \r
     JUCE_AUTORELEASEPOOL\r
@@ -944,8 +954,8 @@ void Thread::launchThread()
     }\r
    #endif\r
 \r
-    threadHandle = {};\r
-    pthread_t handle = {};\r
+    threadHandle = 0;\r
+    pthread_t handle = 0;\r
     pthread_attr_t attr;\r
     pthread_attr_t* attrPtr = nullptr;\r
 \r
@@ -968,13 +978,13 @@ void Thread::launchThread()
 \r
 void Thread::closeThreadHandle()\r
 {\r
-    threadId = {};\r
-    threadHandle = {};\r
+    threadId = 0;\r
+    threadHandle = 0;\r
 }\r
 \r
 void Thread::killThread()\r
 {\r
-    if (threadHandle.get() != nullptr)\r
+    if (threadHandle.get() != 0)\r
     {\r
        #if JUCE_ANDROID\r
         jassertfalse; // pthread_cancel not available!\r
@@ -1304,7 +1314,7 @@ struct HighResolutionTimer::Pimpl
     {\r
         isRunning = false;\r
 \r
-        if (thread == pthread_t())\r
+        if (thread == 0)\r
             return;\r
 \r
         if (thread == pthread_self())\r
@@ -1321,7 +1331,7 @@ struct HighResolutionTimer::Pimpl
         pthread_mutex_unlock (&timerMutex);\r
 \r
         pthread_join (thread, nullptr);\r
-        thread = {};\r
+        thread = 0;\r
     }\r
 \r
     HighResolutionTimer& owner;\r
index 481b3dee94f962d8dc482dd1cd0e30397df0db3e..85e7f27a95ee2cc564cbc102d9201559e5032c1b 100644 (file)
@@ -129,7 +129,7 @@ namespace WindowsFileHelpers
 \r
     File getSpecialFolderPath (int type)\r
     {\r
-        WCHAR path[MAX_PATH + 256];\r
+        WCHAR path [MAX_PATH + 256];\r
 \r
         if (SHGetSpecialFolderPath (0, path, type, FALSE))\r
             return File (String (path));\r
@@ -139,7 +139,7 @@ namespace WindowsFileHelpers
 \r
     File getModuleFileName (HINSTANCE moduleHandle)\r
     {\r
-        WCHAR dest[MAX_PATH + 256];\r
+        WCHAR dest [MAX_PATH + 256];\r
         dest[0] = 0;\r
         GetModuleFileName (moduleHandle, dest, (DWORD) numElementsInArray (dest));\r
         return File (String (dest));\r
@@ -147,7 +147,7 @@ namespace WindowsFileHelpers
 \r
     Result getResultForLastError()\r
     {\r
-        TCHAR messageBuffer[256] = { 0 };\r
+        TCHAR messageBuffer [256] = { 0 };\r
 \r
         FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\r
                        nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
@@ -158,8 +158,10 @@ namespace WindowsFileHelpers
 }\r
 \r
 //==============================================================================\r
-JUCE_DECLARE_DEPRECATED_STATIC (const juce_wchar File::separator = '\\';)\r
-JUCE_DECLARE_DEPRECATED_STATIC (const StringRef File::separatorString ("\\");)\r
+#ifndef JUCE_GCC\r
+ const juce_wchar File::separator = '\\';\r
+ const StringRef File::separatorString ("\\");\r
+#endif\r
 \r
 juce_wchar File::getSeparatorChar()    { return '\\'; }\r
 StringRef File::getSeparatorString()   { return "\\"; }\r
@@ -181,7 +183,7 @@ bool File::existsAsFile() const
 \r
 bool File::isDirectory() const\r
 {\r
-    auto attr = WindowsFileHelpers::getAtts (fullPath);\r
+    const DWORD attr = WindowsFileHelpers::getAtts (fullPath);\r
     return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 && attr != INVALID_FILE_ATTRIBUTES;\r
 }\r
 \r
@@ -250,22 +252,22 @@ bool File::moveToTrash() const
 \r
 bool File::copyInternal (const File& dest) const\r
 {\r
-    return CopyFile (fullPath.toWideCharPointer(),\r
-                     dest.getFullPathName().toWideCharPointer(), false) != 0;\r
+    return CopyFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer(), false) != 0;\r
 }\r
 \r
 bool File::moveInternal (const File& dest) const\r
 {\r
-    return MoveFile (fullPath.toWideCharPointer(),\r
-                     dest.getFullPathName().toWideCharPointer()) != 0;\r
+    return MoveFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer()) != 0;\r
 }\r
 \r
 bool File::replaceInternal (const File& dest) const\r
 {\r
-    return ReplaceFile (dest.getFullPathName().toWideCharPointer(),\r
-                        fullPath.toWideCharPointer(),\r
-                        0, REPLACEFILE_IGNORE_MERGE_ERRORS | 4 /*REPLACEFILE_IGNORE_ACL_ERRORS*/,\r
-                        nullptr, nullptr) != 0;\r
+    void* lpExclude = 0;\r
+    void* lpReserved = 0;\r
+\r
+    return ReplaceFile (dest.getFullPathName().toWideCharPointer(), fullPath.toWideCharPointer(),\r
+                        0, REPLACEFILE_IGNORE_MERGE_ERRORS | REPLACEFILE_IGNORE_ACL_ERRORS,\r
+                        lpExclude, lpReserved) != 0;\r
 }\r
 \r
 Result File::createDirectoryInternal (const String& fileName) const\r
@@ -279,16 +281,14 @@ int64 juce_fileSetPosition (void* handle, int64 pos)
 {\r
     LARGE_INTEGER li;\r
     li.QuadPart = pos;\r
-    li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart,\r
-                                 &li.HighPart, FILE_BEGIN);  // (returns -1 if it fails)\r
+    li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart, &li.HighPart, FILE_BEGIN);  // (returns -1 if it fails)\r
     return li.QuadPart;\r
 }\r
 \r
 void FileInputStream::openHandle()\r
 {\r
-    auto h = CreateFile (file.getFullPathName().toWideCharPointer(),\r
-                         GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,\r
-                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
+    HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,\r
+                           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
 \r
     if (h != INVALID_HANDLE_VALUE)\r
         fileHandle = (void*) h;\r
@@ -306,7 +306,6 @@ size_t FileInputStream::readInternal (void* buffer, size_t numBytes)
     if (fileHandle != 0)\r
     {\r
         DWORD actualNum = 0;\r
-\r
         if (! ReadFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0))\r
             status = WindowsFileHelpers::getResultForLastError();\r
 \r
@@ -319,9 +318,8 @@ size_t FileInputStream::readInternal (void* buffer, size_t numBytes)
 //==============================================================================\r
 void FileOutputStream::openHandle()\r
 {\r
-    auto h = CreateFile (file.getFullPathName().toWideCharPointer(),\r
-                         GENERIC_WRITE, FILE_SHARE_READ, 0,\r
-                         OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
+    HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0,\r
+                           OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
 \r
     if (h != INVALID_HANDLE_VALUE)\r
     {\r
@@ -347,13 +345,16 @@ void FileOutputStream::closeHandle()
 \r
 ssize_t FileOutputStream::writeInternal (const void* bufferToWrite, size_t numBytes)\r
 {\r
-    DWORD actualNum = 0;\r
-\r
     if (fileHandle != nullptr)\r
+    {\r
+        DWORD actualNum = 0;\r
         if (! WriteFile ((HANDLE) fileHandle, bufferToWrite, (DWORD) numBytes, &actualNum, 0))\r
             status = WindowsFileHelpers::getResultForLastError();\r
 \r
-    return (ssize_t) actualNum;\r
+        return (ssize_t) actualNum;\r
+    }\r
+\r
+    return 0;\r
 }\r
 \r
 void FileOutputStream::flushInternal()\r
@@ -397,17 +398,15 @@ void MemoryMappedFile::openInternal (const File& file, AccessMode mode, bool exc
         access = FILE_MAP_ALL_ACCESS;\r
     }\r
 \r
-    auto h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode,\r
-                         exclusive ? 0 : (FILE_SHARE_READ | (mode == readWrite ? FILE_SHARE_WRITE : 0)), 0,\r
-                         createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
+    HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode,\r
+                           exclusive ? 0 : (FILE_SHARE_READ | (mode == readWrite ? FILE_SHARE_WRITE : 0)), 0,\r
+                           createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
 \r
     if (h != INVALID_HANDLE_VALUE)\r
     {\r
         fileHandle = (void*) h;\r
 \r
-        auto mappingHandle = CreateFileMapping (h, 0, protect,\r
-                                                (DWORD) (range.getEnd() >> 32),\r
-                                                (DWORD) range.getEnd(), 0);\r
+        HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (range.getEnd() >> 32), (DWORD) range.getEnd(), 0);\r
 \r
         if (mappingHandle != 0)\r
         {\r
@@ -464,9 +463,8 @@ bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64
     using namespace WindowsFileHelpers;\r
 \r
     bool ok = false;\r
-    auto h = CreateFile (fullPath.toWideCharPointer(),\r
-                         GENERIC_WRITE, FILE_SHARE_READ, 0,\r
-                         OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
+    HANDLE h = CreateFile (fullPath.toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0,\r
+                           OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
 \r
     if (h != INVALID_HANDLE_VALUE)\r
     {\r
@@ -486,7 +484,7 @@ bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64
 //==============================================================================\r
 void File::findFileSystemRoots (Array<File>& destArray)\r
 {\r
-    TCHAR buffer[2048] = { 0 };\r
+    TCHAR buffer [2048] = { 0 };\r
     GetLogicalDriveStrings (2048, buffer);\r
 \r
     const TCHAR* n = buffer;\r
@@ -503,14 +501,13 @@ void File::findFileSystemRoots (Array<File>& destArray)
     roots.sort (true);\r
 \r
     for (int i = 0; i < roots.size(); ++i)\r
-        destArray.add (roots[i]);\r
+        destArray.add (roots [i]);\r
 }\r
 \r
 //==============================================================================\r
 String File::getVolumeLabel() const\r
 {\r
     TCHAR dest[64];\r
-\r
     if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest,\r
                                 (DWORD) numElementsInArray (dest), 0, 0, 0, 0, 0))\r
         dest[0] = 0;\r
@@ -544,9 +541,9 @@ uint64 File::getFileIdentifier() const
 {\r
     uint64 result = 0;\r
 \r
-    auto h = CreateFile (getFullPathName().toWideCharPointer(),\r
-                         GENERIC_READ, FILE_SHARE_READ, nullptr,\r
-                         OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);\r
+    HANDLE h = CreateFile (getFullPathName().toWideCharPointer(),\r
+                           GENERIC_READ, FILE_SHARE_READ, nullptr,\r
+                           OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);\r
 \r
     if (h != INVALID_HANDLE_VALUE)\r
     {\r
@@ -573,7 +570,7 @@ bool File::isOnHardDisk() const
     if (fullPath.isEmpty())\r
         return false;\r
 \r
-    auto n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
+    const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
 \r
     if (fullPath.toLowerCase()[0] <= 'b' && fullPath[1] == ':')\r
         return n != DRIVE_REMOVABLE;\r
@@ -588,7 +585,7 @@ bool File::isOnRemovableDrive() const
     if (fullPath.isEmpty())\r
         return false;\r
 \r
-    auto n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
+    const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
 \r
     return n == DRIVE_CDROM\r
         || n == DRIVE_REMOTE\r
@@ -617,7 +614,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
 \r
         case tempDirectory:\r
         {\r
-            WCHAR dest[2048];\r
+            WCHAR dest [2048];\r
             dest[0] = 0;\r
             GetTempPath ((DWORD) numElementsInArray (dest), dest);\r
             return File (String (dest));\r
@@ -625,7 +622,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
 \r
         case windowsSystemDirectory:\r
         {\r
-            WCHAR dest[2048];\r
+            WCHAR dest [2048];\r
             dest[0] = 0;\r
             GetSystemDirectoryW (dest, (UINT) numElementsInArray (dest));\r
             return File (String (dest));\r
@@ -650,7 +647,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
 //==============================================================================\r
 File File::getCurrentWorkingDirectory()\r
 {\r
-    WCHAR dest[MAX_PATH + 256];\r
+    WCHAR dest [MAX_PATH + 256];\r
     dest[0] = 0;\r
     GetCurrentDirectory ((DWORD) numElementsInArray (dest), dest);\r
     return File (String (dest));\r
@@ -715,7 +712,7 @@ static String readWindowsLnkFile (File lnkFile, bool wantsAbsolutePath)
              && (! wantsAbsolutePath || SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI))))\r
         {\r
             WIN32_FIND_DATA winFindData;\r
-            WCHAR resolvedPath[MAX_PATH];\r
+            WCHAR resolvedPath [MAX_PATH];\r
 \r
             DWORD flags = SLGP_UNCPRIORITY;\r
 \r
@@ -1180,15 +1177,7 @@ bool NamedPipe::openInternal (const String& pipeName, const bool createPipe, boo
 {\r
     pimpl.reset (new Pimpl (pipeName, createPipe, mustNotExist));\r
 \r
-    if (createPipe)\r
-    {\r
-        if (pimpl->pipeH == INVALID_HANDLE_VALUE)\r
-        {\r
-            pimpl.reset();\r
-            return false;\r
-        }\r
-    }\r
-    else if (! pimpl->connect (200))\r
+    if (createPipe && pimpl->pipeH == INVALID_HANDLE_VALUE)\r
     {\r
         pimpl.reset();\r
         return false;\r
index a62c407c9595d4028a6f4ec2beee8adb02baf14c..8c4716b298c3c61a0003bde4efe7c3463faee061 100644 (file)
@@ -514,37 +514,6 @@ namespace MACAddressHelpers
         split[1] = sa_in6->sin6_addr.u.Byte[off];\r
        #endif\r
     }\r
-\r
-    static IPAddress createAddress (const sockaddr_in6* sa_in6)\r
-    {\r
-        IPAddressByteUnion temp;\r
-        uint16 arr[8];\r
-\r
-        for (int i = 0; i < 8; ++i)\r
-        {\r
-            split (sa_in6, i * 2, temp.split);\r
-            arr[i] = temp.combined;\r
-        }\r
-\r
-        return IPAddress (arr);\r
-    }\r
-\r
-    static IPAddress createAddress (const sockaddr_in* sa_in)\r
-    {\r
-        return IPAddress ((uint8*) &sa_in->sin_addr.s_addr, false);\r
-    }\r
-\r
-    template <typename Type>\r
-    static void findAddresses (Array<IPAddress>& result, bool includeIPv6, Type start)\r
-    {\r
-        for (auto addr = start; addr != nullptr; addr = addr->Next)\r
-        {\r
-            if (addr->Address.lpSockaddr->sa_family == AF_INET)\r
-                result.addIfNotAlreadyThere (createAddress ((sockaddr_in*) addr->Address.lpSockaddr));\r
-            else if (addr->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
-                result.addIfNotAlreadyThere (createAddress ((sockaddr_in6*) addr->Address.lpSockaddr));\r
-        }\r
-    }\r
 }\r
 \r
 void MACAddress::findAllAddresses (Array<MACAddress>& result)\r
@@ -561,25 +530,94 @@ void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6)
         result.addIfNotAlreadyThere (IPAddress::local (true));\r
 \r
     GetAdaptersAddressesHelper addressesHelper;\r
-\r
     if (addressesHelper.callGetAdaptersAddresses())\r
     {\r
         for (PIP_ADAPTER_ADDRESSES adapter = addressesHelper.adaptersAddresses; adapter != nullptr; adapter = adapter->Next)\r
         {\r
-            MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstUnicastAddress);\r
-            MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstAnycastAddress);\r
-            MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstMulticastAddress);\r
+            PIP_ADAPTER_UNICAST_ADDRESS pUnicast = nullptr;\r
+            for (pUnicast = adapter->FirstUnicastAddress; pUnicast != nullptr; pUnicast = pUnicast->Next)\r
+            {\r
+                if (pUnicast->Address.lpSockaddr->sa_family == AF_INET)\r
+                {\r
+                    const sockaddr_in* sa_in = (sockaddr_in*)pUnicast->Address.lpSockaddr;\r
+                    IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false);\r
+                    result.addIfNotAlreadyThere (ip);\r
+                }\r
+                else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
+                {\r
+                    const sockaddr_in6* sa_in6 = (sockaddr_in6*)pUnicast->Address.lpSockaddr;\r
+\r
+                    ByteUnion temp;\r
+                    uint16 arr[8];\r
+\r
+                    for (int i = 0; i < 8; ++i)\r
+                    {\r
+                        MACAddressHelpers::split (sa_in6, i * 2, temp.split);\r
+                        arr[i] = temp.combined;\r
+                    }\r
+\r
+                    IPAddress ip (arr);\r
+                    result.addIfNotAlreadyThere (ip);\r
+                }\r
+            }\r
+\r
+            PIP_ADAPTER_ANYCAST_ADDRESS   pAnycast = nullptr;\r
+            for (pAnycast = adapter->FirstAnycastAddress; pAnycast != nullptr; pAnycast = pAnycast->Next)\r
+            {\r
+                if (pAnycast->Address.lpSockaddr->sa_family == AF_INET)\r
+                {\r
+                    const sockaddr_in* sa_in = (sockaddr_in*)pAnycast->Address.lpSockaddr;\r
+                    IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false);\r
+                    result.addIfNotAlreadyThere (ip);\r
+                }\r
+                else if (pAnycast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
+                {\r
+                    const sockaddr_in6* sa_in6 = (sockaddr_in6*)pAnycast->Address.lpSockaddr;\r
+\r
+                    ByteUnion temp;\r
+                    uint16 arr[8];\r
+\r
+                    for (int i = 0; i < 8; ++i)\r
+                    {\r
+                        MACAddressHelpers::split (sa_in6, i * 2, temp.split);\r
+                        arr[i] = temp.combined;\r
+                    }\r
+\r
+                    IPAddress ip (arr);\r
+                    result.addIfNotAlreadyThere (ip);\r
+                }\r
+            }\r
+\r
+            PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = nullptr;\r
+            for (pMulticast = adapter->FirstMulticastAddress; pMulticast != nullptr; pMulticast = pMulticast->Next)\r
+            {\r
+                if (pMulticast->Address.lpSockaddr->sa_family == AF_INET)\r
+                {\r
+                    const sockaddr_in* sa_in = (sockaddr_in*)pMulticast->Address.lpSockaddr;\r
+                    IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false);\r
+                    result.addIfNotAlreadyThere (ip);\r
+                }\r
+                else if (pMulticast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
+                {\r
+                    const sockaddr_in6* sa_in6 = (sockaddr_in6*)pMulticast->Address.lpSockaddr;\r
+\r
+                    ByteUnion temp;\r
+                    uint16 arr[8];\r
+\r
+                    for (int i = 0; i < 8; ++i)\r
+                    {\r
+                        MACAddressHelpers::split (sa_in6, i * 2, temp.split);\r
+                        arr[i] = temp.combined;\r
+                    }\r
+\r
+                    IPAddress ip (arr);\r
+                    result.addIfNotAlreadyThere (ip);\r
+                }\r
+            }\r
         }\r
     }\r
 }\r
 \r
-IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress&)\r
-{\r
-    // TODO\r
-    return {};\r
-}\r
-\r
-\r
 //==============================================================================\r
 bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress,\r
                                                       const String& emailSubject,\r
index 28ad6cc30b29d608158e9873435ab4f157acd97c..d1c11423a96d95c88d5428561afa92d186b7d167 100644 (file)
@@ -151,17 +151,7 @@ void CPUInformation::initialise() noexcept
 \r
     callCPUID (info, 7);\r
 \r
-    hasAVX2            = (info[1] & (1 << 5))   != 0;\r
-    hasAVX512F         = (info[1] & (1u << 16)) != 0;\r
-    hasAVX512DQ        = (info[1] & (1u << 17)) != 0;\r
-    hasAVX512IFMA      = (info[1] & (1u << 21)) != 0;\r
-    hasAVX512PF        = (info[1] & (1u << 26)) != 0;\r
-    hasAVX512ER        = (info[1] & (1u << 27)) != 0;\r
-    hasAVX512CD        = (info[1] & (1u << 28)) != 0;\r
-    hasAVX512BW        = (info[1] & (1u << 30)) != 0;\r
-    hasAVX512VL        = (info[1] & (1u << 31)) != 0;\r
-    hasAVX512VBMI      = (info[2] & (1u <<  1)) != 0;\r
-    hasAVX512VPOPCNTDQ = (info[2] & (1u << 14)) != 0;\r
+    hasAVX2 = (info[1] & (1 << 5)) != 0;\r
 \r
     SYSTEM_INFO systemInfo;\r
     GetNativeSystemInfo (&systemInfo);\r
@@ -298,9 +288,8 @@ int SystemStats::getMemorySizeInMegabytes()
 //==============================================================================\r
 String SystemStats::getEnvironmentVariable (const String& name, const String& defaultValue)\r
 {\r
-    auto len = GetEnvironmentVariableW (name.toWideCharPointer(), nullptr, 0);\r
-\r
-    if (len == 0)\r
+    DWORD len = GetEnvironmentVariableW (name.toWideCharPointer(), nullptr, 0);\r
+    if (GetLastError() == ERROR_ENVVAR_NOT_FOUND)\r
         return String (defaultValue);\r
 \r
     HeapBlock<WCHAR> buffer (len);\r
@@ -336,7 +325,7 @@ public:
        #endif\r
 \r
        #if JUCE_WIN32_TIMER_PERIOD > 0\r
-        auto res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD);\r
+        const MMRESULT res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD);\r
         ignoreUnused (res);\r
         jassert (res == TIMERR_NOERROR);\r
        #endif\r
@@ -397,10 +386,10 @@ static int64 juce_getClockCycleCounter() noexcept
    #endif\r
 }\r
 \r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
 {\r
-    auto cycles = juce_getClockCycleCounter();\r
-    auto millis = Time::getMillisecondCounter();\r
+    const int64 cycles = juce_getClockCycleCounter();\r
+    const uint32 millis = Time::getMillisecondCounter();\r
     int lastResult = 0;\r
 \r
     for (;;)\r
@@ -408,12 +397,12 @@ int SystemStats::getCpuSpeedInMegahertz()
         int n = 1000000;\r
         while (--n > 0) {}\r
 \r
-        auto millisElapsed = Time::getMillisecondCounter() - millis;\r
-        auto cyclesNow = juce_getClockCycleCounter();\r
+        const uint32 millisElapsed = Time::getMillisecondCounter() - millis;\r
+        const int64 cyclesNow = juce_getClockCycleCounter();\r
 \r
         if (millisElapsed > 80)\r
         {\r
-            auto newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000);\r
+            const int newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000);\r
 \r
             if (millisElapsed > 500 || (lastResult == newResult && newResult > 100))\r
                 return newResult;\r
@@ -442,7 +431,7 @@ bool Time::setSystemTimeToThisTime() const
     // first one sets it up, the second one kicks it in.\r
     // NB: the local variable is here to avoid analysers warning about having\r
     // two identical sub-expressions in the return statement\r
-    auto firstCallToSetTimezone = SetLocalTime (&st) != 0;\r
+    bool firstCallToSetTimezone = SetLocalTime (&st) != 0;\r
     return firstCallToSetTimezone && SetLocalTime (&st) != 0;\r
 }\r
 \r
@@ -458,7 +447,7 @@ int SystemStats::getPageSize()
 String SystemStats::getLogonName()\r
 {\r
     TCHAR text [256] = { 0 };\r
-    auto len = (DWORD) numElementsInArray (text) - 1;\r
+    DWORD len = (DWORD) numElementsInArray (text) - 1;\r
     GetUserName (text, &len);\r
     return String (text, len);\r
 }\r
@@ -471,7 +460,7 @@ String SystemStats::getFullUserName()
 String SystemStats::getComputerName()\r
 {\r
     TCHAR text[128] = { 0 };\r
-    auto len = (DWORD) numElementsInArray (text) - 1;\r
+    DWORD len = (DWORD) numElementsInArray (text) - 1;\r
     GetComputerName (text, &len);\r
     return String (text, len);\r
 }\r
@@ -496,10 +485,10 @@ String SystemStats::getDisplayLanguage()
     if (getUserDefaultUILanguage == nullptr)\r
         return "en";\r
 \r
-    auto langID = MAKELCID (getUserDefaultUILanguage(), SORT_DEFAULT);\r
+    const DWORD langID = MAKELCID (getUserDefaultUILanguage(), SORT_DEFAULT);\r
 \r
-    auto mainLang = getLocaleValue (langID, LOCALE_SISO639LANGNAME, "en");\r
-    auto region   = getLocaleValue (langID, LOCALE_SISO3166CTRYNAME, nullptr);\r
+    String mainLang (getLocaleValue (langID, LOCALE_SISO639LANGNAME, "en"));\r
+    String region   (getLocaleValue (langID, LOCALE_SISO3166CTRYNAME, nullptr));\r
 \r
     if (region.isNotEmpty())\r
         mainLang << '-' << region;\r
index 78e8c081b9605cb5789ec41b005566945834b072..333208066f2a8e766295e46aaf3d904ecad31f2e 100644 (file)
 namespace juce\r
 {\r
 \r
-/** Union used to split a 16-bit unsigned integer into 2 8-bit unsigned integers or vice-versa */\r
-union IPAddressByteUnion\r
-{\r
-    uint16 combined;\r
-    uint8 split[2];\r
-};\r
-\r
-static void zeroUnusedBytes (uint8* address) noexcept\r
-{\r
-    for (int i = 4; i < 16; ++i)\r
-        address[i] = 0;\r
-}\r
-\r
-IPAddress::IPAddress() noexcept\r
+IPAddress::IPAddress (bool IPv6) noexcept : isIPv6 (IPv6)\r
 {\r
     for (int i = 0; i < 16; ++i)\r
         address[i] = 0;\r
@@ -48,12 +35,12 @@ IPAddress::IPAddress (const uint8 bytes[], bool IPv6) noexcept : isIPv6 (IPv6)
         address[i] = bytes[i];\r
 \r
     if (! isIPv6)\r
-        zeroUnusedBytes (address);\r
+        zeroUnusedBytes();\r
 }\r
 \r
 IPAddress::IPAddress (const uint16 bytes[8]) noexcept : isIPv6 (true)\r
 {\r
-    IPAddressByteUnion temp;\r
+    ByteUnion temp;\r
 \r
     for (int i = 0; i < 8; ++i)\r
     {\r
@@ -69,7 +56,7 @@ IPAddress::IPAddress (uint8 a0, uint8 a1, uint8 a2, uint8 a3) noexcept : isIPv6
     address[0] = a0;  address[1] = a1;\r
     address[2] = a2;  address[3] = a3;\r
 \r
-    zeroUnusedBytes (address);\r
+    zeroUnusedBytes();\r
 }\r
 \r
 IPAddress::IPAddress (uint16 a1, uint16 a2, uint16 a3, uint16 a4,\r
@@ -78,7 +65,7 @@ IPAddress::IPAddress (uint16 a1, uint16 a2, uint16 a3, uint16 a4,
 {\r
     uint16 array[8] = { a1, a2, a3, a4, a5, a6, a7, a8 };\r
 \r
-    IPAddressByteUnion temp;\r
+    ByteUnion temp;\r
 \r
     for (int i = 0; i < 8; ++i)\r
     {\r
@@ -95,57 +82,30 @@ IPAddress::IPAddress (uint32 n) noexcept : isIPv6 (false)
     address[2] = (n >> 8) & 255;\r
     address[3] = (n & 255);\r
 \r
-    zeroUnusedBytes (address);\r
-}\r
-\r
-bool IPAddress::isNull() const\r
-{\r
-    for (int i = 0; i < 16; ++i)\r
-        if (address[i] != 0)\r
-            return false;\r
-\r
-    return true;\r
-}\r
-\r
-static String removePort (const String& adr)\r
-{\r
-    if (adr.containsAnyOf ("[]"))\r
-        return adr.fromFirstOccurrenceOf ("[", false, true).upToLastOccurrenceOf ("]", false, true);\r
-\r
-    if (adr.indexOf (":") == adr.lastIndexOf (":"))\r
-        return adr.upToLastOccurrenceOf (":", false, true);\r
-\r
-    return adr;\r
+    zeroUnusedBytes();\r
 }\r
 \r
 IPAddress::IPAddress (const String& adr)\r
 {\r
-    auto ipAddress = removePort (adr);\r
-\r
-    isIPv6 = ipAddress.contains (":");\r
+    isIPv6 = adr.contains (":");\r
 \r
     if (! isIPv6)\r
     {\r
-        auto tokens = StringArray::fromTokens (ipAddress, ".", {});\r
+        StringArray tokens;\r
+        tokens.addTokens (adr, ".", String());\r
 \r
         for (int i = 0; i < 4; ++i)\r
             address[i] = (uint8) tokens[i].getIntValue();\r
-\r
-        zeroUnusedBytes (address);\r
     }\r
     else\r
     {\r
-        auto tokens = StringArray::fromTokens (ipAddress, ":", {});\r
+        StringArray tokens;\r
+        tokens.addTokens (adr.removeCharacters ("[]"), ":", String());\r
 \r
-        if (tokens.contains ({})) // if :: shorthand has been used\r
+        if (tokens.contains (StringRef())) // if :: shorthand has been used\r
         {\r
-            auto idx = tokens.indexOf ({});\r
+            int idx = tokens.indexOf (StringRef());\r
             tokens.set (idx, "0");\r
-            tokens.removeEmptyStrings();\r
-\r
-            // mapped IPv4 address will be treated as a single token, so pad the end of the StringArray\r
-            if (tokens[tokens.size() - 1].containsChar ('.'))\r
-                tokens.add ({});\r
 \r
             while (tokens.size() < 8)\r
                 tokens.insert (idx, "0");\r
@@ -153,19 +113,7 @@ IPAddress::IPAddress (const String& adr)
 \r
         for (int i = 0; i < 8; ++i)\r
         {\r
-            if (i == 6 && isIPv4MappedAddress (IPAddress (address, true)))\r
-            {\r
-                IPAddress v4Address (tokens[i]);\r
-\r
-                address[12] = v4Address.address[0];\r
-                address[13] = v4Address.address[1];\r
-                address[14] = v4Address.address[2];\r
-                address[15] = v4Address.address[3];\r
-\r
-                break;\r
-            }\r
-\r
-            IPAddressByteUnion temp;\r
+            ByteUnion temp;\r
             temp.combined = (uint16) CharacterFunctions::HexParser<int>::parse (tokens[i].getCharPointer());\r
 \r
             address[i * 2]     = temp.split[0];\r
@@ -186,62 +134,29 @@ String IPAddress::toString() const
         return s;\r
     }\r
 \r
-    IPAddressByteUnion temp;\r
+    String addressString;\r
+    ByteUnion temp;\r
 \r
     temp.split[0] = address[0];\r
     temp.split[1] = address[1];\r
 \r
-    auto addressString = String::toHexString (temp.combined);\r
+    addressString = String (String::toHexString (temp.combined));\r
 \r
     for (int i = 1; i < 8; ++i)\r
     {\r
         temp.split[0] = address[i * 2];\r
         temp.split[1] = address[i * 2 + 1];\r
 \r
-        addressString << ':' << String::toHexString (temp.combined);\r
+        addressString << ':' << String (String::toHexString (temp.combined));\r
     }\r
 \r
     return getFormattedAddress (addressString);\r
 }\r
 \r
-bool IPAddress::operator== (const IPAddress& other) const noexcept    { return compare (other) == 0; }\r
-bool IPAddress::operator!= (const IPAddress& other) const noexcept    { return compare (other) != 0; }\r
-bool IPAddress::operator<  (const IPAddress& other) const noexcept    { return compare (other) <  0; }\r
-bool IPAddress::operator<= (const IPAddress& other) const noexcept    { return compare (other) <= 0; }\r
-bool IPAddress::operator>  (const IPAddress& other) const noexcept    { return compare (other) >  0; }\r
-bool IPAddress::operator>= (const IPAddress& other) const noexcept    { return compare (other) >= 0; }\r
-\r
-int IPAddress::compare (const IPAddress& other) const noexcept\r
-{\r
-    if (isIPv6 != other.isIPv6)\r
-    {\r
-        if (isIPv6)\r
-        {\r
-            if (isIPv4MappedAddress (*this))\r
-                return convertIPv4MappedAddressToIPv4 (*this).compare (other);\r
-\r
-            return 1;\r
-        }\r
-\r
-        if (isIPv4MappedAddress (other))\r
-            return compare (convertIPv4MappedAddressToIPv4 (other));\r
-\r
-        return -1;\r
-    }\r
-\r
-    for (int i = 0; i < (isIPv6 ? 16 : 4); ++i)\r
-    {\r
-        if (address[i] > other.address[i])  return 1;\r
-        if (address[i] < other.address[i])  return -1;\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-IPAddress IPAddress::any() noexcept               { return IPAddress(); }\r
-IPAddress IPAddress::broadcast() noexcept         { return IPAddress (255, 255, 255, 255); }\r
-IPAddress IPAddress::local (bool IPv6) noexcept   { return IPv6 ? IPAddress (0, 0, 0, 0, 0, 0, 0, 1)\r
-                                                                : IPAddress (127, 0, 0, 1); }\r
+IPAddress IPAddress::any (bool IPv6) noexcept           { return IPAddress (IPv6); }\r
+IPAddress IPAddress::broadcast() noexcept               { return IPAddress (255, 255, 255, 255); }\r
+IPAddress IPAddress::local (bool IPv6) noexcept         { return IPv6 ? IPAddress (0, 0, 0, 0, 0, 0, 0, 1)\r
+                                                                      : IPAddress (127, 0, 0, 1); }\r
 \r
 String IPAddress::getFormattedAddress (const String& unformattedAddress)\r
 {\r
@@ -259,7 +174,7 @@ String IPAddress::getFormattedAddress (const String& unformattedAddress)
 \r
     for (int i = 0; i < tokens.size(); ++i)\r
     {\r
-        auto& t = tokens.getReference (i);\r
+        const auto& t = tokens.getReference (i);\r
 \r
         if (t.getHexValue32() == 0x0000)\r
         {\r
@@ -317,149 +232,73 @@ String IPAddress::getFormattedAddress (const String& unformattedAddress)
     return addressString;\r
 }\r
 \r
-bool IPAddress::isIPv4MappedAddress (const IPAddress& mappedAddress)\r
+bool IPAddress::operator== (const IPAddress& other) const noexcept\r
 {\r
-    if (! mappedAddress.isIPv6)\r
-        return false;\r
-\r
-    for (int i = 0; i < 10; ++i)\r
-        if (mappedAddress.address[i] != 0)\r
+    for (int i = 0; i < (isIPv6 ? 16 : 4); ++i)\r
+        if (address[i] != other.address[i])\r
             return false;\r
 \r
-    if (mappedAddress.address[10] != 255 || mappedAddress.address[11] != 255)\r
-        return false;\r
-\r
     return true;\r
-}\r
 \r
-IPAddress IPAddress::convertIPv4MappedAddressToIPv4 (const IPAddress& mappedAddress)\r
-{\r
-    // The address that you're converting needs to be IPv6!\r
-    jassert (mappedAddress.isIPv6);\r
-\r
-    if (isIPv4MappedAddress (mappedAddress))\r
-        return { mappedAddress.address[12], mappedAddress.address[13],\r
-                 mappedAddress.address[14], mappedAddress.address[15] };\r
-\r
-    return {};\r
 }\r
 \r
-IPAddress IPAddress::convertIPv4AddressToIPv4Mapped (const IPAddress& addressToMap)\r
+bool IPAddress::operator!= (const IPAddress& other) const noexcept\r
 {\r
-    // The address that you're converting needs to be IPv4!\r
-    jassert (! addressToMap.isIPv6);\r
-\r
-    return { 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff,\r
-            static_cast<uint16> ((addressToMap.address[0] << 8) | addressToMap.address[1]),\r
-            static_cast<uint16> ((addressToMap.address[2] << 8) | addressToMap.address[3]) };\r
+    return ! operator== (other);\r
 }\r
 \r
-IPAddress IPAddress::getLocalAddress (bool includeIPv6)\r
+#if (! JUCE_WINDOWS) && (! JUCE_ANDROID)\r
+static void addAddress (const sockaddr_in* addr_in, Array<IPAddress>& result)\r
 {\r
-    auto addresses = getAllAddresses (includeIPv6);\r
-\r
-    for (auto& a : addresses)\r
-        if (a != local())\r
-            return a;\r
+    auto addr = addr_in->sin_addr.s_addr;\r
 \r
-    return local();\r
+    if (addr != INADDR_NONE)\r
+        result.addIfNotAlreadyThere (IPAddress (ntohl (addr)));\r
 }\r
 \r
-Array<IPAddress> IPAddress::getAllAddresses (bool includeIPv6)\r
+static void addAddress (const sockaddr_in6* addr_in, Array<IPAddress>& result)\r
 {\r
-    Array<IPAddress> addresses;\r
-    findAllAddresses (addresses, includeIPv6);\r
-    return addresses;\r
-}\r
-\r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
+    in6_addr addr = addr_in->sin6_addr;\r
 \r
-struct IPAddressTests : public UnitTest\r
-{\r
-    IPAddressTests()\r
-        : UnitTest ("IPAddress", "Networking")\r
+    typedef union\r
     {\r
-    }\r
+        uint16 combined;\r
+        uint8 split[2];\r
+    } ByteUnion;\r
 \r
-    void runTest() override\r
-    {\r
-        testConstructors();\r
-        testFindAllAddresses();\r
-        testFindBroadcastAddress();\r
-    }\r
+    ByteUnion temp;\r
+    uint16 arr[8];\r
 \r
-    void testConstructors()\r
+    for (int i = 0; i < 8; ++i) // Swap bytes from network to host order\r
     {\r
-        beginTest ("constructors");\r
-\r
-        // Default IPAdress should be null\r
-        IPAddress defaultConstructed;\r
-        expect (defaultConstructed.isNull());\r
-\r
-        auto local = IPAddress::local();\r
-        expect (! local.isNull());\r
+        temp.split[0] = addr.s6_addr[i * 2 + 1];\r
+        temp.split[1] = addr.s6_addr[i * 2];\r
 \r
-        IPAddress ipv4{1, 2, 3, 4};\r
-        expect (! ipv4.isNull());\r
-        expect (! ipv4.isIPv6);\r
-        expect (ipv4.toString() == "1.2.3.4");\r
+        arr[i] = temp.combined;\r
     }\r
 \r
-    void testFindAllAddresses()\r
-    {\r
-        beginTest ("find all addresses");\r
-\r
-        Array<IPAddress> ipv4Addresses;\r
-        Array<IPAddress> allAddresses;\r
-\r
-        IPAddress::findAllAddresses (ipv4Addresses, false);\r
-        IPAddress::findAllAddresses (allAddresses, true);\r
-\r
-        expect (allAddresses.size() >= ipv4Addresses.size());\r
+    IPAddress ip (arr);\r
+    result.addIfNotAlreadyThere (ip);\r
+}\r
 \r
-        for (auto& a : ipv4Addresses)\r
-        {\r
-            expect (! a.isNull());\r
-            expect (! a.isIPv6);\r
-        }\r
+void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6)\r
+{\r
+    struct ifaddrs *ifaddr, *ifa;\r
 \r
-        for (auto& a : allAddresses)\r
-        {\r
-            expect (! a.isNull());\r
-        }\r
-    }\r
+    if (getifaddrs (&ifaddr) == -1)\r
+        return;\r
 \r
-    void testFindBroadcastAddress()\r
+    for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)\r
     {\r
-        beginTest ("broadcast addresses");\r
-\r
-        Array<IPAddress> addresses;\r
+        if (ifa->ifa_addr == nullptr)\r
+            continue;\r
 \r
-        // Only IPv4 interfaces have broadcast\r
-        IPAddress::findAllAddresses (addresses, false);\r
-\r
-        for (auto& a : addresses)\r
-        {\r
-            expect (! a.isNull());\r
-\r
-            auto broadcastAddress = IPAddress::getInterfaceBroadcastAddress (a);\r
-\r
-            // If we retrieve an address, it should be an IPv4 address\r
-            if (! broadcastAddress.isNull())\r
-            {\r
-                expect (! a.isIPv6);\r
-            }\r
-        }\r
-\r
-        // Expect to fail to find a broadcast for this address\r
-        IPAddress address{1, 2, 3, 4};\r
-        expect (IPAddress::getInterfaceBroadcastAddress (address).isNull());\r
+        if      (ifa->ifa_addr->sa_family == AF_INET)                 addAddress ((const sockaddr_in*)  ifa->ifa_addr, result);\r
+        else if (ifa->ifa_addr->sa_family == AF_INET6 && includeIPv6) addAddress ((const sockaddr_in6*) ifa->ifa_addr, result);\r
     }\r
-};\r
-\r
-static IPAddressTests iPAddressTests;\r
 \r
+    freeifaddrs (ifaddr);\r
+}\r
 #endif\r
 \r
 } // namespace juce\r
index 47e929ba4203918b42dc03c6d53f4d09dc95ad9b..49ecfde45e45922778b15f6a0fd143e0e9a9973e 100644 (file)
@@ -32,45 +32,26 @@ namespace juce
 class JUCE_API  IPAddress  final\r
 {\r
 public:\r
-    //==============================================================================\r
-    /** Returns an IP address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6)  */\r
-    static IPAddress any() noexcept;\r
-\r
-    /** Returns an IPv4 address meaning "broadcast" (255.255.255.255) */\r
-    static IPAddress broadcast() noexcept;\r
-\r
-    /** Returns an IPv4 or IPv6 address meaning "localhost", equivalent to 127.0.0.1 (IPv4) or ::1 (IPv6) */\r
-    static IPAddress local (bool IPv6 = false) noexcept;\r
-\r
     //==============================================================================\r
     /** Populates a list of all the IP addresses that this machine is using. */\r
     static void findAllAddresses (Array<IPAddress>& results, bool includeIPv6 = false);\r
 \r
-    /** Populates a list of all the IP addresses that this machine is using. */\r
-    static Array<IPAddress> getAllAddresses (bool includeIPv6 = false);\r
-\r
-    /** Returns the first 'real' address for the local machine.\r
-        Unlike local(), this will attempt to find the machine's actual assigned\r
-        address rather than "127.0.0.1". If there are multiple network cards, this\r
-        may return any of their addresses. If it doesn't find any, then it'll return\r
-        local() as a fallback.\r
-    */\r
-    static IPAddress getLocalAddress (bool includeIPv6 = false);\r
-\r
     //==============================================================================\r
-    /** Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6) */\r
-    IPAddress() noexcept;\r
+    /** Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6)\r
+        @param IPv6 if true indicates that this is an IPv6 address\r
+    */\r
+    IPAddress (bool IPv6 = false) noexcept;\r
 \r
     /** Creates an IPv4 or IPv6 address by reading 4 or 16 bytes from an array.\r
         @param bytes The array containing the bytes to read.\r
         @param IPv6 if true indicates that 16 bytes should be read instead of 4.\r
     */\r
-    explicit IPAddress (const uint8* bytes, bool IPv6 = false) noexcept;\r
+    explicit IPAddress (const uint8 bytes[], bool IPv6 = false) noexcept;\r
 \r
     /** Creates an IPv6 address from an array of 8 16-bit integers\r
         @param bytes The array containing the bytes to read.\r
     */\r
-    explicit IPAddress (const uint16* bytes) noexcept;\r
+    explicit IPAddress (const uint16 bytes[8]) noexcept;\r
 \r
     /** Creates an IPv4 address from 4 bytes. */\r
     IPAddress (uint8 address1, uint8 address2, uint8 address3, uint8 address4) noexcept;\r
@@ -87,56 +68,47 @@ public:
     /** Parses a string IP address of the form "1.2.3.4" (IPv4) or "1:2:3:4:5:6:7:8" (IPv6). */\r
     explicit IPAddress (const String& address);\r
 \r
-    /** Returns whether the address contains the null address (e.g. 0.0.0.0). */\r
-    bool isNull() const;\r
-\r
-    //==============================================================================\r
     /** Returns a dot- or colon-separated string in the form "1.2.3.4" (IPv4) or "1:2:3:4:5:6:7:8" (IPv6). */\r
     String toString() const;\r
 \r
-    /** Compares this IPAddress with another.\r
+    /** Returns an IPv4 or IPv6 address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6)  */\r
+    static IPAddress any (bool IPv6 = false) noexcept;\r
 \r
-        @returns 0 if the two addresses are identical, negative if this address is smaller than\r
-                 the other one, or positive if is greater.\r
-    */\r
-    int compare (const IPAddress&) const noexcept;\r
-\r
-    bool operator== (const IPAddress&) const noexcept;\r
-    bool operator!= (const IPAddress&) const noexcept;\r
-    bool operator<  (const IPAddress&) const noexcept;\r
-    bool operator>  (const IPAddress&) const noexcept;\r
-    bool operator<= (const IPAddress&) const noexcept;\r
-    bool operator>= (const IPAddress&) const noexcept;\r
-\r
-    //==============================================================================\r
-    /** The elements of the IP address. */\r
-    uint8 address[16];\r
+    /** Returns an IPv4 address meaning "broadcast" (255.255.255.255) */\r
+    static IPAddress broadcast() noexcept;\r
 \r
-    bool isIPv6 = false;\r
+    /** Returns an IPv4 or IPv6 address meaning "localhost", equivalent to 127.0.0.1 (IPv4) or ::1 (IPv6) */\r
+    static IPAddress local (bool IPv6 = false) noexcept;\r
 \r
-    //==============================================================================\r
     /** Returns a formatted version of the provided IPv6 address conforming to RFC 5952 with leading zeros suppressed,\r
         lower case characters, and double-colon notation used to represent contiguous 16-bit fields of zeros.\r
 \r
-        @param unformattedAddress    the IPv6 address to be formatted\r
+        @param unformattedAddress the IPv6 address to be formatted\r
     */\r
     static String getFormattedAddress (const String& unformattedAddress);\r
 \r
-    /** Returns true if the given IP address is an IPv4-mapped IPv6 address. */\r
-    static bool isIPv4MappedAddress (const IPAddress& mappedAddress);\r
-\r
-    /** Converts an IPv4-mapped IPv6 address to an IPv4 address.\r
-        If the address is not IPv4-mapped, this will return a null address.\r
-    */\r
-    static IPAddress convertIPv4MappedAddressToIPv4 (const IPAddress& mappedAddress);\r
+    bool operator== (const IPAddress& other) const noexcept;\r
+    bool operator!= (const IPAddress& other) const noexcept;\r
 \r
-    /** Converts an IPv4 address to an IPv4-mapped IPv6 address. */\r
-    static IPAddress convertIPv4AddressToIPv4Mapped (const IPAddress& addressToMap);\r
+    /** The elements of the IP address. */\r
+    uint8 address[16];\r
 \r
-    /** If the IPAdress is the address of an interface on the machine, returns the associated broadcast address.\r
-        If the address is not an interface, it will return a null address.\r
-    */\r
-    static IPAddress getInterfaceBroadcastAddress (const IPAddress& interfaceAddress);\r
+    bool isIPv6;\r
+\r
+private:\r
+    /** Union used to split a 16-bit unsigned integer into 2 8-bit unsigned integers or vice-versa */\r
+    typedef union\r
+    {\r
+        uint16 combined;\r
+        uint8 split[2];\r
+    } ByteUnion;\r
+\r
+    /** Method used to zero the remaining bytes of the address array when creating IPv4 addresses */\r
+    void zeroUnusedBytes()\r
+    {\r
+        for (int i = 4; i < 16; ++i)\r
+            address[i] = 0;\r
+    }\r
 };\r
 \r
 } // namespace juce\r
index cf7033529b21a83b8b053944a726beff28cc457c..a2c7e1fb558b3e78182215f7fe039f4e3d9b8cd8 100644 (file)
@@ -85,13 +85,6 @@ int64 MACAddress::toInt64() const noexcept
     return n;\r
 }\r
 \r
-Array<MACAddress> MACAddress::getAllAddresses()\r
-{\r
-    Array<MACAddress> addresses;\r
-    findAllAddresses (addresses);\r
-    return addresses;\r
-}\r
-\r
 bool MACAddress::isNull() const noexcept                                { return toInt64() == 0; }\r
 \r
 bool MACAddress::operator== (const MACAddress& other) const noexcept    { return memcmp (address, other.address, sizeof (address)) == 0; }\r
index d174ba169ac277ab194ff904b6cb1912b9f2873c..ae0661ebc3b6bba1190149f1d3b32fa0a6514952 100644 (file)
@@ -33,9 +33,6 @@ class JUCE_API  MACAddress  final
 {\r
 public:\r
     //==============================================================================\r
-    /** Returns a list of the MAC addresses of all the available network cards. */\r
-    static Array<MACAddress> getAllAddresses();\r
-\r
     /** Populates a list of the MAC addresses of all the available network cards. */\r
     static void findAllAddresses (Array<MACAddress>& results);\r
 \r
index 73649e3a0ac0da4296481988678a592c70c3de4c..8d493488f0cc33d93e6def57c1d0bccf4c16ebe4 100644 (file)
@@ -60,198 +60,4 @@ String NamedPipe::getName() const
 \r
 // other methods for this class are implemented in the platform-specific files\r
 \r
-//==============================================================================\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-class NamedPipeTests  : public UnitTest\r
-{\r
-public:\r
-    //==============================================================================\r
-    NamedPipeTests()\r
-        : UnitTest ("NamedPipe", "Networking")\r
-    {}\r
-\r
-    void runTest() override\r
-    {\r
-        const String pipeName ("TestPipe");\r
-\r
-        beginTest ("Pre test cleanup");\r
-        {\r
-            NamedPipe pipe;\r
-            expect (pipe.createNewPipe (pipeName, false));\r
-        }\r
-\r
-        beginTest ("Create pipe");\r
-        {\r
-            NamedPipe pipe;\r
-            expect (! pipe.isOpen());\r
-\r
-            expect (pipe.createNewPipe (pipeName, true));\r
-            expect (pipe.isOpen());\r
-\r
-            expect (pipe.createNewPipe (pipeName, false));\r
-            expect (pipe.isOpen());\r
-\r
-            NamedPipe otherPipe;\r
-            expect (! otherPipe.createNewPipe (pipeName, true));\r
-            expect (! otherPipe.isOpen());\r
-        }\r
-\r
-        beginTest ("Existing pipe");\r
-        {\r
-            NamedPipe pipe;\r
-\r
-            expect (! pipe.openExisting (pipeName));\r
-            expect (! pipe.isOpen());\r
-\r
-            expect (pipe.createNewPipe (pipeName, true));\r
-\r
-            NamedPipe otherPipe;\r
-            expect (otherPipe.openExisting (pipeName));\r
-            expect (otherPipe.isOpen());\r
-        }\r
-\r
-        int sendData = 4684682;\r
-\r
-        beginTest ("Receive message created pipe");\r
-        {\r
-            NamedPipe pipe;\r
-            expect (pipe.createNewPipe (pipeName, true));\r
-\r
-            WaitableEvent senderFinished;\r
-            SenderThread sender (pipeName, false, senderFinished, sendData);\r
-\r
-            sender.startThread();\r
-\r
-            int recvData = -1;\r
-            auto bytesRead = pipe.read (&recvData, sizeof (recvData), 2000);\r
-\r
-            expect (senderFinished.wait (4000));\r
-\r
-            expectEquals (bytesRead, (int) sizeof (recvData));\r
-            expectEquals (sender.result, (int) sizeof (sendData));\r
-            expectEquals (recvData, sendData);\r
-        }\r
-\r
-        beginTest ("Receive message existing pipe");\r
-        {\r
-            WaitableEvent senderFinished;\r
-            SenderThread sender (pipeName, true, senderFinished, sendData);\r
-\r
-            NamedPipe pipe;\r
-            expect (pipe.openExisting (pipeName));\r
-\r
-            sender.startThread();\r
-\r
-            int recvData = -1;\r
-            auto bytesRead = pipe.read (&recvData, sizeof (recvData), 2000);\r
-\r
-            expect (senderFinished.wait (4000));\r
-\r
-            expectEquals (bytesRead, (int) sizeof (recvData));\r
-            expectEquals (sender.result, (int) sizeof (sendData));\r
-            expectEquals (recvData, sendData);\r
-        }\r
-\r
-        beginTest ("Send message created pipe");\r
-        {\r
-            NamedPipe pipe;\r
-            expect (pipe.createNewPipe (pipeName, true));\r
-\r
-            WaitableEvent receiverFinished;\r
-            ReceiverThread receiver (pipeName, false, receiverFinished);\r
-\r
-            receiver.startThread();\r
-\r
-            auto bytesWritten = pipe.write (&sendData, sizeof (sendData), 2000);\r
-\r
-            expect (receiverFinished.wait (4000));\r
-\r
-            expectEquals (bytesWritten, (int) sizeof (sendData));\r
-            expectEquals (receiver.result, (int) sizeof (receiver.recvData));\r
-            expectEquals (receiver.recvData, sendData);\r
-        }\r
-\r
-        beginTest ("Send message existing pipe");\r
-        {\r
-            WaitableEvent receiverFinished;\r
-            ReceiverThread receiver (pipeName, true, receiverFinished);\r
-\r
-            NamedPipe pipe;\r
-            expect (pipe.openExisting (pipeName));\r
-\r
-            receiver.startThread();\r
-\r
-            auto bytesWritten = pipe.write (&sendData, sizeof (sendData), 2000);\r
-\r
-            expect (receiverFinished.wait (4000));\r
-\r
-            expectEquals (bytesWritten, (int) sizeof (sendData));\r
-            expectEquals (receiver.result, (int) sizeof (receiver.recvData));\r
-            expectEquals (receiver.recvData, sendData);\r
-        }\r
-    }\r
-\r
-private:\r
-    //==============================================================================\r
-    struct NamedPipeThread   : public Thread\r
-    {\r
-        NamedPipeThread (const String& threadName, const String& pName,\r
-                         bool shouldCreatePipe, WaitableEvent& completed)\r
-            : Thread (threadName), pipeName (pName), workCompleted (completed)\r
-        {\r
-            if (shouldCreatePipe)\r
-                pipe.createNewPipe (pipeName);\r
-            else\r
-                pipe.openExisting (pipeName);\r
-        }\r
-\r
-        NamedPipe pipe;\r
-        const String& pipeName;\r
-        WaitableEvent& workCompleted;\r
-\r
-        int result = -2;\r
-    };\r
-\r
-    //==============================================================================\r
-    struct SenderThread   : public NamedPipeThread\r
-    {\r
-        SenderThread (const String& pName, bool shouldCreatePipe,\r
-                      WaitableEvent& completed, int sData)\r
-            : NamedPipeThread ("NamePipeSender", pName, shouldCreatePipe, completed),\r
-              sendData (sData)\r
-        {}\r
-\r
-        void run() override\r
-        {\r
-            result = pipe.write (&sendData, sizeof (sendData), 2000);\r
-            workCompleted.signal();\r
-        }\r
-\r
-        const int sendData;\r
-    };\r
-\r
-    //==============================================================================\r
-    struct ReceiverThread   : public NamedPipeThread\r
-    {\r
-        ReceiverThread (const String& pName, bool shouldCreatePipe,\r
-                        WaitableEvent& completed)\r
-            : NamedPipeThread ("NamePipeSender", pName, shouldCreatePipe, completed)\r
-        {}\r
-\r
-        void run() override\r
-        {\r
-            result = pipe.read (&recvData, sizeof (recvData), 2000);\r
-            workCompleted.signal();\r
-        }\r
-\r
-        int recvData = -2;\r
-    };\r
-};\r
-\r
-static NamedPipeTests namedPipeTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index 8196391e3677bde0fc85e95c537e4ee6903972e9..b800fe8e2b02a0a45430eb8641fc1f08a3919c8f 100644 (file)
@@ -264,7 +264,7 @@ namespace SocketHelpers
         }\r
         else\r
         {\r
-            timeoutp = nullptr;\r
+            timeoutp = 0;\r
         }\r
 \r
         fd_set rset, wset;\r
@@ -282,8 +282,7 @@ namespace SocketHelpers
        #else\r
         {\r
             int result;\r
-\r
-            while ((result = select (h + 1, prset, pwset, nullptr, timeoutp)) < 0\r
+            while ((result = select (h + 1, prset, pwset, 0, timeoutp)) < 0\r
                     && errno == EINTR)\r
             {\r
             }\r
@@ -591,9 +590,11 @@ bool StreamingSocket::isLocal() const noexcept
     if (! isConnected())\r
         return false;\r
 \r
+    Array<IPAddress> localAddresses;\r
+    IPAddress::findAllAddresses (localAddresses);\r
     IPAddress currentIP (SocketHelpers::getConnectedAddress (handle));\r
 \r
-    for (auto& a : IPAddress::getAllAddresses())\r
+    for (auto& a : localAddresses)\r
         if (a == currentIP)\r
             return true;\r
 \r
index 524554ee5541628b53cbd4b71d5721052c6690d9..a1420d0ace53c8baac14b12a5fd0b8c9d0a24755 100644 (file)
@@ -68,7 +68,7 @@ public:
         network address otherwise this function will fail.\r
         @returns    true on success; false may indicate that another socket is already bound\r
                     on the same port\r
-        @see bindToPort(int localPortNumber), IPAddress::getAllAddresses\r
+        @see bindToPort(int localPortNumber), IPAddress::findAllAddresses\r
     */\r
     bool bindToPort (int localPortNumber, const String& localAddress);\r
 \r
@@ -236,7 +236,7 @@ public:
         network address otherwise this function will fail.\r
         @returns    true on success; false may indicate that another socket is already bound\r
                     on the same port\r
-        @see bindToPort(int localPortNumber), IPAddress::getAllAddresses\r
+        @see bindToPort(int localPortNumber), IPAddress::findAllAddresses\r
     */\r
     bool bindToPort (int localPortNumber, const String& localAddress);\r
 \r
index dcb232a301024b28fde050669f3bf6e809f8cb81..75f95b747640f4f626cbb783fca6b88eda6bca59 100644 (file)
@@ -61,10 +61,10 @@ struct FallbackDownloadTask  : public URL::DownloadTask,
             if (listener != nullptr)\r
                 listener->progress (this, downloaded, contentLength);\r
 \r
-            auto max = jmin ((int) bufferSize, contentLength < 0 ? std::numeric_limits<int>::max()\r
-                                                                 : static_cast<int> (contentLength - downloaded));\r
+            const int max = jmin ((int) bufferSize, contentLength < 0 ? std::numeric_limits<int>::max()\r
+                                                                      : static_cast<int> (contentLength - downloaded));\r
 \r
-            auto actual = stream->read (buffer.get(), max);\r
+            const int actual = stream->read (buffer.get(), max);\r
 \r
             if (actual < 0 || threadShouldExit() || stream->isError())\r
                 break;\r
@@ -118,7 +118,9 @@ URL::DownloadTask* URL::DownloadTask::createFallbackDownloader (const URL& urlTo
     const size_t bufferSize = 0x8000;\r
     targetFileToUse.deleteFile();\r
 \r
-    if (auto outputStream = std::unique_ptr<FileOutputStream> (targetFileToUse.createOutputStream (bufferSize)))\r
+    std::unique_ptr<FileOutputStream> outputStream (targetFileToUse.createOutputStream (bufferSize));\r
+\r
+    if (outputStream != nullptr)\r
     {\r
         std::unique_ptr<WebInputStream> stream (new WebInputStream (urlToUse, usePostRequest));\r
         stream->withExtraHeaders (extraHeadersToUse);\r
@@ -184,8 +186,8 @@ void URL::init()
     {\r
         do\r
         {\r
-            auto nextAmp   = url.indexOfChar (i + 1, '&');\r
-            auto equalsPos = url.indexOfChar (i + 1, '=');\r
+            const int nextAmp   = url.indexOfChar (i + 1, '&');\r
+            const int equalsPos = url.indexOfChar (i + 1, '=');\r
 \r
             if (nextAmp < 0)\r
             {\r
@@ -322,7 +324,7 @@ void URL::addParameter (const String& name, const String& value)
     parameterValues.add (value);\r
 }\r
 \r
-String URL::toString (bool includeGetParameters) const\r
+String URL::toString (const bool includeGetParameters) const\r
 {\r
     if (includeGetParameters && parameterNames.size() > 0)\r
         return url + "?" + URLHelpers::getMangledParameters (*this);\r
@@ -574,11 +576,11 @@ public:
             BOOL isBookmarkStale = false;\r
             NSError* error = nil;\r
 \r
-            auto nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
-                                                   options: 0\r
-                                             relativeToURL: nil\r
-                                       bookmarkDataIsStale: &isBookmarkStale\r
-                                                     error: &error];\r
+            auto* nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
+                                                    options: 0\r
+                                              relativeToURL: nil\r
+                                        bookmarkDataIsStale: &isBookmarkStale\r
+                                                      error: &error];\r
 \r
             if (error == nil)\r
             {\r
@@ -589,7 +591,7 @@ public:
             }\r
             else\r
             {\r
-                auto desc = [error localizedDescription];\r
+                auto* desc = [error localizedDescription];\r
                 ignoreUnused (desc);\r
                 jassertfalse;\r
             }\r
@@ -607,10 +609,10 @@ private:
             BOOL isBookmarkStale = false;\r
             NSError* error = nil;\r
 \r
-            auto nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
-                                                   options: 0\r
-                                             relativeToURL: nil\r
-                                       bookmarkDataIsStale: &isBookmarkStale\r
+            auto* nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
+                                                    options: 0\r
+                                              relativeToURL: nil\r
+                                        bookmarkDataIsStale: &isBookmarkStale\r
                                                       error: &error];\r
 \r
             if (error == nil)\r
@@ -624,7 +626,7 @@ private:
             }\r
             else\r
             {\r
-                auto desc = [error localizedDescription];\r
+                auto* desc = [error localizedDescription];\r
                 ignoreUnused (desc);\r
                 jassertfalse;\r
             }\r
@@ -651,14 +653,14 @@ private:
 #endif\r
 \r
 //==============================================================================\r
-InputStream* URL::createInputStream (bool usePostCommand,\r
-                                     OpenStreamProgressCallback* progressCallback,\r
-                                     void* progressCallbackContext,\r
+InputStream* URL::createInputStream (const bool usePostCommand,\r
+                                     OpenStreamProgressCallback* const progressCallback,\r
+                                     void* const progressCallbackContext,\r
                                      String headers,\r
-                                     int timeOutMs,\r
-                                     StringPairArray* responseHeaders,\r
+                                     const int timeOutMs,\r
+                                     StringPairArray* const responseHeaders,\r
                                      int* statusCode,\r
-                                     int numRedirectsToFollow,\r
+                                     const int numRedirectsToFollow,\r
                                      String httpRequestCmd) const\r
 {\r
     if (isLocalFile())\r
@@ -682,10 +684,10 @@ InputStream* URL::createInputStream (bool usePostCommand,
 \r
         bool postDataSendProgress (WebInputStream&, int bytesSent, int totalBytes) override\r
         {\r
-            return callback (data, bytesSent, totalBytes);\r
+            return callback(data, bytesSent, totalBytes);\r
         }\r
 \r
-        OpenStreamProgressCallback* callback;\r
+        OpenStreamProgressCallback* const callback;\r
         void* const data;\r
 \r
         // workaround a MSVC 2013 compiler warning\r
@@ -856,8 +858,8 @@ String URL::removeEscapeChars (const String& s)
     {\r
         if (utf8.getUnchecked(i) == '%')\r
         {\r
-            auto hexDigit1 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 1]);\r
-            auto hexDigit2 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 2]);\r
+            const int hexDigit1 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 1]);\r
+            const int hexDigit2 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 2]);\r
 \r
             if (hexDigit1 >= 0 && hexDigit2 >= 0)\r
             {\r
index b2ad89304870bee937545c44c4faa0365d852e4f..81997f037e8096b3216748b5c7912325c7de5709 100644 (file)
@@ -284,7 +284,7 @@ public:
         It allows your app to receive progress updates during a lengthy POST operation. If you\r
         want to continue the operation, this should return true, or false to abort.\r
     */\r
-    using OpenStreamProgressCallback = bool (void* context, int bytesSent, int totalBytes);\r
+    typedef bool (OpenStreamProgressCallback) (void* context, int bytesSent, int totalBytes);\r
 \r
     /** Attempts to open a stream that can read from this URL.\r
 \r
@@ -347,7 +347,7 @@ public:
 \r
     //==============================================================================\r
     /** Represents a download task.\r
-        Returned by downloadToFile to allow querying and controlling the download task.\r
+        Returned by downloadToFile to allow querying and controling the download task.\r
     */\r
     class DownloadTask\r
     {\r
@@ -464,7 +464,7 @@ public:
         If it fails, or if the text that it reads can't be parsed as XML, this will\r
         return nullptr.\r
 \r
-        When it returns a valid XmlElement object, the caller is responsible for deleting\r
+        When it returns a valid XmlElement object, the caller is responsibile for deleting\r
         this object when no longer needed.\r
 \r
         Note that on some platforms (Android, for example) it's not permitted to do any network\r
@@ -537,6 +537,7 @@ private:
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Upload)\r
     };\r
 \r
+    friend struct ContainerDeletePolicy<Upload>;\r
     ReferenceCountedArray<Upload> filesToUpload;\r
 \r
   #if JUCE_IOS\r
index 2d4f0e8a3dcebd2e6afef4392043d197bbedef4c..c9baaf5cd96f696a74f83961f7f2801c87b21367 100644 (file)
@@ -101,7 +101,7 @@ class JUCE_API WebInputStream : public InputStream
 \r
         If getResponseHeaders is called without an established connection, then\r
         getResponseHeaders will call connect internally and block until connect\r
-        returns - either due to a successful connection or a connection\r
+        returns - either due to a succesful connection or a connection\r
         error.\r
 \r
         @see connect\r
@@ -112,7 +112,7 @@ class JUCE_API WebInputStream : public InputStream
 \r
         If getStatusCode is called without an established connection, then\r
         getStatusCode will call connect internally and block until connect\r
-        returns - either due to a successful connection or a connection\r
+        returns - either due to a succesful connection or a connection\r
         error.\r
 \r
         @see connect\r
@@ -153,7 +153,7 @@ class JUCE_API WebInputStream : public InputStream
 \r
         If getTotalLength is called without an established connection, then\r
         getTotalLength will call connect internally and block until connect\r
-        returns - either due to a successful connection or a connection\r
+        returns - either due to a succesful connection or a connection\r
         error.\r
 \r
         If the size of the stream isn't actually known, this will return -1.\r
index 546b27574553155974360a4f7a87041e9c08b44b..b94ed0e06814a974894a01adadcec8345002e4ab 100644 (file)
@@ -196,81 +196,4 @@ String BufferedInputStream::readString()
     return InputStream::readString();\r
 }\r
 \r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct BufferedInputStreamTests   : public UnitTest\r
-{\r
-    BufferedInputStreamTests()\r
-        : UnitTest ("BufferedInputStream", "Streams")\r
-    {}\r
-\r
-    void runTest() override\r
-    {\r
-        const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
-        MemoryInputStream mi (data, true);\r
-\r
-        BufferedInputStream stream (mi, (int) data.getSize());\r
-\r
-        beginTest ("Read");\r
-\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        size_t numBytesRead = 0;\r
-        MemoryBlock readBuffer (data.getSize());\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            expectEquals (stream.peekByte(), *(char*) (data.begin() + numBytesRead));\r
-\r
-            numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-\r
-        expect (readBuffer == data);\r
-\r
-        beginTest ("Skip");\r
-\r
-        stream.setPosition (0);\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        numBytesRead = 0;\r
-        const int numBytesToSkip = 5;\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            expectEquals (stream.peekByte(), *(char*) (data.begin() + numBytesRead));\r
-\r
-            stream.skipNextBytes (numBytesToSkip);\r
-            numBytesRead += numBytesToSkip;\r
-            numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-    }\r
-};\r
-\r
-static BufferedInputStreamTests bufferedInputStreamTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index de4d22756f670d3b1cedb96b25e53425024a2c83..84b918512e5e45cb29d220ea190d7a70a3cc4705 100644 (file)
@@ -45,9 +45,9 @@ public:
     /** Destructor. */\r
     ~FileInputSource();\r
 \r
-    InputStream* createInputStream() override;\r
-    InputStream* createInputStreamFor (const String& relatedItemPath) override;\r
-    int64 hashCode() const override;\r
+    InputStream* createInputStream();\r
+    InputStream* createInputStreamFor (const String& relatedItemPath);\r
+    int64 hashCode() const;\r
 \r
 private:\r
     //==============================================================================\r
index d2c8b200d41144393710b6a0d77ace2f9ede012e..972047c6efe834ae6cee698968becf0b8a9c68e9 100644 (file)
@@ -243,10 +243,9 @@ public:
 \r
     /** Reads and discards a number of bytes from the stream.\r
 \r
-        Some input streams might implement this more efficiently, but the base\r
+        Some input streams might implement this efficiently, but the base\r
         class will just keep reading data until the requisite number of bytes\r
-        have been done. For large skips it may be quicker to call setPosition()\r
-        with the required position.\r
+        have been done.\r
     */\r
     virtual void skipNextBytes (int64 numBytesToSkip);\r
 \r
index 12a42ff004758dd44e5b1897241d25976736d179..3739af3374d03851266ff78f0516cb7e4db2f397 100644 (file)
@@ -89,11 +89,6 @@ int64 MemoryInputStream::getPosition()
     return (int64) position;\r
 }\r
 \r
-void MemoryInputStream::skipNextBytes (int64 numBytesToSkip)\r
-{\r
-    if (numBytesToSkip > 0)\r
-        setPosition (getPosition() + numBytesToSkip);\r
-}\r
 \r
 //==============================================================================\r
 #if JUCE_UNIT_TESTS\r
@@ -101,9 +96,7 @@ void MemoryInputStream::skipNextBytes (int64 numBytesToSkip)
 class MemoryStreamTests  : public UnitTest\r
 {\r
 public:\r
-    MemoryStreamTests()\r
-        : UnitTest ("MemoryInputStream & MemoryOutputStream", "Streams")\r
-    {}\r
+    MemoryStreamTests() : UnitTest ("MemoryInputStream & MemoryOutputStream", "Memory Streams") {}\r
 \r
     void runTest() override\r
     {\r
@@ -134,60 +127,6 @@ public:
         expect (mi.readInt64BigEndian() == randomInt64);\r
         expect (mi.readDouble() == randomDouble);\r
         expect (mi.readDoubleBigEndian() == randomDouble);\r
-\r
-        const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
-        MemoryInputStream stream (data, true);\r
-\r
-        beginTest ("Read");\r
-\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        size_t numBytesRead = 0;\r
-        MemoryBlock readBuffer (data.getSize());\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-\r
-        expect (readBuffer == data);\r
-\r
-        beginTest ("Skip");\r
-\r
-        stream.setPosition (0);\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        numBytesRead = 0;\r
-        const int numBytesToSkip = 5;\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            stream.skipNextBytes (numBytesToSkip);\r
-            numBytesRead += numBytesToSkip;\r
-            numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
     }\r
 \r
     static String createRandomWideCharString (Random& r)\r
index c565d3c3a23b3c32d32052de6c69b768c73f3979..64ba2e3c7d890dc18afb86409bdbe8e3eb4459b6 100644 (file)
@@ -77,7 +77,6 @@ public:
     int64 getTotalLength() override;\r
     bool isExhausted() override;\r
     int read (void* destBuffer, int maxBytesToRead) override;\r
-    void skipNextBytes (int64 numBytesToSkip) override;\r
 \r
 private:\r
     //==============================================================================\r
index 1f3200490d61efc8b30fb5f36d424861342c7bb5..d84cf6b31ea6685c9caff2f57d2c906a97b87824 100644 (file)
@@ -101,11 +101,11 @@ char* MemoryOutputStream::prepareToWrite (size_t numBytes)
 \r
 bool MemoryOutputStream::write (const void* const buffer, size_t howMany)\r
 {\r
+    jassert (buffer != nullptr);\r
+\r
     if (howMany == 0)\r
         return true;\r
 \r
-    jassert (buffer != nullptr);\r
-\r
     if (auto* dest = prepareToWrite (howMany))\r
     {\r
         memcpy (dest, buffer, howMany);\r
index f7b0a2982e404c663d03b255d6bee4e21bf961fc..047964f5bd10114ec8f2df8207ea20994ad86629 100644 (file)
@@ -37,7 +37,7 @@ class JUCE_API  MemoryOutputStream  : public OutputStream
 public:\r
     //==============================================================================\r
     /** Creates an empty memory stream, ready to be written into.\r
-        @param initialSize  the initial amount of capacity to allocate for writing into\r
+        @param initialSize  the intial amount of capacity to allocate for writing into\r
     */\r
     MemoryOutputStream (size_t initialSize = 256);\r
 \r
index a7ff868ca18a50bf4eb3179c12702d93b871aaad..96856a76e00958996f12841658d1b68a7af03011 100644 (file)
@@ -78,81 +78,4 @@ bool SubregionStream::isExhausted()
     return source->isExhausted();\r
 }\r
 \r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct SubregionInputStreamTests   : public UnitTest\r
-{\r
-    SubregionInputStreamTests()\r
-        : UnitTest ("SubregionInputStream", "Streams")\r
-    {}\r
-\r
-    void runTest() override\r
-    {\r
-        const MemoryBlock data ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", 52);\r
-        MemoryInputStream mi (data, true);\r
-\r
-        const int offset = getRandom().nextInt ((int) data.getSize());\r
-        const size_t subregionSize = data.getSize() - (size_t) offset;\r
-\r
-        SubregionStream stream (&mi, offset, (int) subregionSize, false);\r
-\r
-        beginTest ("Read");\r
-\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) subregionSize);\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        size_t numBytesRead = 0;\r
-        MemoryBlock readBuffer (subregionSize);\r
-\r
-        while (numBytesRead < subregionSize)\r
-        {\r
-            numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (subregionSize - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == subregionSize));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) subregionSize);\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-\r
-        const MemoryBlock memoryBlockToCheck (data.begin() + (size_t) offset, data.getSize() - (size_t) offset);\r
-        expect (readBuffer == memoryBlockToCheck);\r
-\r
-        beginTest ("Skip");\r
-\r
-        stream.setPosition (0);\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) subregionSize);\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        numBytesRead = 0;\r
-        const int64 numBytesToSkip = 5;\r
-\r
-        while (numBytesRead < subregionSize)\r
-        {\r
-            stream.skipNextBytes (numBytesToSkip);\r
-            numBytesRead += numBytesToSkip;\r
-            numBytesRead = std::min (numBytesRead, subregionSize);\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (subregionSize - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == subregionSize));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) subregionSize);\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-    }\r
-};\r
-\r
-static SubregionInputStreamTests subregionInputStreamTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index 89f334800af631d0b6a6e46df5a6a171c5d473fa..d7bfe739aee7073742b163244ccfae5f618a3503 100644 (file)
@@ -47,9 +47,9 @@ public:
     /** Destructor. */\r
     ~URLInputSource();\r
 \r
-    InputStream* createInputStream() override;\r
-    InputStream* createInputStreamFor (const String& relatedItemPath) override;\r
-    int64 hashCode() const override;\r
+    InputStream* createInputStream();\r
+    InputStream* createInputStreamFor (const String& relatedItemPath);\r
+    int64 hashCode() const;\r
 \r
 private:\r
     //==============================================================================\r
index b1c9752335f87a60c85389714888c2d9f5f838a4..09f6f663d98902783ae47d1267f62eaabff9490a 100644 (file)
  #define JUCE_CONSTEXPR\r
 #endif\r
 \r
-#if (! JUCE_MSVC) && (! JUCE_CXX14_IS_AVAILABLE)\r
-namespace std\r
-{\r
-    template<typename T, typename... Args>\r
-    unique_ptr<T> make_unique (Args&&... args)\r
-    {\r
-        return unique_ptr<T> (new T (forward<Args> (args)...));\r
-    }\r
-}\r
-#endif\r
-\r
 #if ! DOXYGEN\r
  // These are old flags that are now supported on all compatible build targets\r
  #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1\r
index 995c2e8113e3d95d6e6b1dee98c6f2a041d16b42..0666bccf3eed3705978ffe218a5126b5ba257534 100644 (file)
@@ -275,7 +275,7 @@ namespace juce
 \r
 #if JUCE_ALLOW_STATIC_NULL_VARIABLES\r
  #if ! (defined (DOXYGEN) || defined (JUCE_GCC) || (JUCE_MSVC && _MSC_VER <= 1900))\r
-  #define JUCE_DEPRECATED_STATIC(valueDef)       JUCE_DEPRECATED_ATTRIBUTE valueDef\r
+  #define JUCE_DEPRECATED_STATIC(valueDef)       JUCE_DEPRECATED (valueDef)\r
 \r
   #if JUCE_MSVC\r
    #define JUCE_DECLARE_DEPRECATED_STATIC(valueDef) \\r
index f77b1a27252dd0dd4b5b23494e22d3ba794ea04e..dc18424577bf27149e07e7fe2024f3700831344a 100644 (file)
@@ -28,8 +28,8 @@
     See also SystemStats::getJUCEVersion() for a string version.\r
 */\r
 #define JUCE_MAJOR_VERSION      5\r
-#define JUCE_MINOR_VERSION      4\r
-#define JUCE_BUILDNUMBER        1\r
+#define JUCE_MINOR_VERSION      3\r
+#define JUCE_BUILDNUMBER        2\r
 \r
 /** Current JUCE version number.\r
 \r
@@ -51,8 +51,6 @@
 #include <algorithm>\r
 #include <limits>\r
 #include <atomic>\r
-#include <sstream>\r
-#include <iomanip>\r
 \r
 //==============================================================================\r
 #include "juce_CompilerSupport.h"\r
index 7d1347413ed76a3d1682f9e70a011488be523796..c073331b97470454b27d2478eb13358c6790ab45 100644 (file)
@@ -73,11 +73,13 @@ StringArray SystemStats::getDeviceIdentifiers()
     }\r
     else\r
     {\r
-        for (auto& address : MACAddress::getAllAddresses())\r
+        Array<MACAddress> addresses;\r
+        MACAddress::findAllAddresses (addresses);\r
+        for (auto& address : addresses)\r
             ids.add (address.toString());\r
     }\r
 \r
-    jassert (! ids.isEmpty()); // Failed to create any IDs!\r
+    jassert (ids.size() > 0); // Failed to create any IDs!\r
     return ids;\r
 }\r
 \r
@@ -90,14 +92,9 @@ struct CPUInformation
 \r
     int numLogicalCPUs = 0, numPhysicalCPUs = 0;\r
 \r
-    bool hasMMX      = false, hasSSE        = false, hasSSE2       = false, hasSSE3 = false,\r
-         has3DNow    = false, hasSSSE3      = false, hasSSE41      = false,\r
-         hasSSE42    = false, hasAVX        = false, hasAVX2       = false,\r
-         hasAVX512F  = false, hasAVX512BW   = false, hasAVX512CD   = false,\r
-         hasAVX512DQ = false, hasAVX512ER   = false, hasAVX512IFMA = false,\r
-         hasAVX512PF = false, hasAVX512VBMI = false, hasAVX512VL   = false,\r
-         hasAVX512VPOPCNTDQ = false,\r
-         hasNeon = false;\r
+    bool hasMMX = false, hasSSE = false, hasSSE2 = false, hasSSE3 = false,\r
+         has3DNow = false, hasSSSE3 = false, hasSSE41 = false,\r
+         hasSSE42 = false, hasAVX = false, hasAVX2 = false, hasNeon = false;\r
 };\r
 \r
 static const CPUInformation& getCPUInformation() noexcept\r
@@ -118,16 +115,6 @@ bool SystemStats::hasSSE41() noexcept           { return getCPUInformation().has
 bool SystemStats::hasSSE42() noexcept           { return getCPUInformation().hasSSE42; }\r
 bool SystemStats::hasAVX() noexcept             { return getCPUInformation().hasAVX; }\r
 bool SystemStats::hasAVX2() noexcept            { return getCPUInformation().hasAVX2; }\r
-bool SystemStats::hasAVX512F() noexcept         { return getCPUInformation().hasAVX512F; }\r
-bool SystemStats::hasAVX512BW() noexcept        { return getCPUInformation().hasAVX512BW; }\r
-bool SystemStats::hasAVX512CD() noexcept        { return getCPUInformation().hasAVX512CD; }\r
-bool SystemStats::hasAVX512DQ() noexcept        { return getCPUInformation().hasAVX512DQ; }\r
-bool SystemStats::hasAVX512ER() noexcept        { return getCPUInformation().hasAVX512ER; }\r
-bool SystemStats::hasAVX512IFMA() noexcept      { return getCPUInformation().hasAVX512IFMA; }\r
-bool SystemStats::hasAVX512PF() noexcept        { return getCPUInformation().hasAVX512PF; }\r
-bool SystemStats::hasAVX512VBMI() noexcept      { return getCPUInformation().hasAVX512VBMI; }\r
-bool SystemStats::hasAVX512VL() noexcept        { return getCPUInformation().hasAVX512VL; }\r
-bool SystemStats::hasAVX512VPOPCNTDQ() noexcept { return getCPUInformation().hasAVX512VPOPCNTDQ; }\r
 bool SystemStats::hasNeon() noexcept            { return getCPUInformation().hasNeon; }\r
 \r
 \r
index 8e441a9d6169b072dcb32341248bc076b744aaa9..f804a62c01964e8be75ac992df2927f7d17f7566 100644 (file)
@@ -156,7 +156,7 @@ public:
         @returns    the speed in megahertz, e.g. 1500, 2500, 32000 (depending on\r
                     what year you're reading this...)\r
     */\r
-    static int getCpuSpeedInMegahertz();\r
+    static int getCpuSpeedInMegaherz();\r
 \r
     /** Returns a string to indicate the CPU vendor.\r
         Might not be known on some systems.\r
@@ -168,27 +168,17 @@ public:
     */\r
     static String getCpuModel();\r
 \r
-    static bool hasMMX() noexcept;             /**< Returns true if Intel MMX instructions are available. */\r
-    static bool has3DNow() noexcept;           /**< Returns true if AMD 3DNOW instructions are available. */\r
-    static bool hasSSE() noexcept;             /**< Returns true if Intel SSE instructions are available. */\r
-    static bool hasSSE2() noexcept;            /**< Returns true if Intel SSE2 instructions are available. */\r
-    static bool hasSSE3() noexcept;            /**< Returns true if Intel SSE3 instructions are available. */\r
-    static bool hasSSSE3() noexcept;           /**< Returns true if Intel SSSE3 instructions are available. */\r
-    static bool hasSSE41() noexcept;           /**< Returns true if Intel SSE4.1 instructions are available. */\r
-    static bool hasSSE42() noexcept;           /**< Returns true if Intel SSE4.2 instructions are available. */\r
-    static bool hasAVX() noexcept;             /**< Returns true if Intel AVX instructions are available. */\r
-    static bool hasAVX2() noexcept;            /**< Returns true if Intel AVX2 instructions are available. */\r
-    static bool hasAVX512F() noexcept;         /**< Returns true if Intel AVX-512 Foundation instructions are available. */\r
-    static bool hasAVX512BW() noexcept;        /**< Returns true if Intel AVX-512 Byte and Word instructions are available. */\r
-    static bool hasAVX512CD() noexcept;        /**< Returns true if Intel AVX-512 Conflict Detection instructions are available. */\r
-    static bool hasAVX512DQ() noexcept;        /**< Returns true if Intel AVX-512 Doubleword and Quadword instructions are available. */\r
-    static bool hasAVX512ER() noexcept;        /**< Returns true if Intel AVX-512 Exponential and Reciprocal instructions are available. */\r
-    static bool hasAVX512IFMA() noexcept;      /**< Returns true if Intel AVX-512 Integer Fused Multiply-Add instructions are available. */\r
-    static bool hasAVX512PF() noexcept;        /**< Returns true if Intel AVX-512 Prefetch instructions are available. */\r
-    static bool hasAVX512VBMI() noexcept;      /**< Returns true if Intel AVX-512 Vector Bit Manipulation instructions are available. */\r
-    static bool hasAVX512VL() noexcept;        /**< Returns true if Intel AVX-512 Vector Length instructions are available. */\r
-    static bool hasAVX512VPOPCNTDQ() noexcept; /**< Returns true if Intel AVX-512 Vector Population Count Double and Quad-word instructions are available. */\r
-    static bool hasNeon() noexcept;            /**< Returns true if ARM NEON instructions are available. */\r
+    static bool hasMMX() noexcept;    /**< Returns true if Intel MMX instructions are available. */\r
+    static bool has3DNow() noexcept;  /**< Returns true if AMD 3DNOW instructions are available. */\r
+    static bool hasSSE() noexcept;    /**< Returns true if Intel SSE instructions are available. */\r
+    static bool hasSSE2() noexcept;   /**< Returns true if Intel SSE2 instructions are available. */\r
+    static bool hasSSE3() noexcept;   /**< Returns true if Intel SSE3 instructions are available. */\r
+    static bool hasSSSE3() noexcept;  /**< Returns true if Intel SSSE3 instructions are available. */\r
+    static bool hasSSE41() noexcept;  /**< Returns true if Intel SSE4.1 instructions are available. */\r
+    static bool hasSSE42() noexcept;  /**< Returns true if Intel SSE4.2 instructions are available. */\r
+    static bool hasAVX() noexcept;    /**< Returns true if Intel AVX instructions are available. */\r
+    static bool hasAVX2() noexcept;   /**< Returns true if Intel AVX2 instructions are available. */\r
+    static bool hasNeon() noexcept;   /**< Returns true if ARM NEON instructions are available. */\r
 \r
     //==============================================================================\r
     /** Finds out how much RAM is in the machine.\r
@@ -209,10 +199,10 @@ public:
     */\r
     static String getStackBacktrace();\r
 \r
-    /** A function type for use in setApplicationCrashHandler().\r
-        When called, its void* argument will contain platform-specific data about the crash.\r
+    /** A function type for use in setApplicationCrashHandler(). The parameter will contain\r
+        platform-specific data about the crash.\r
     */\r
-    using CrashHandlerFunction = void(*)(void*);\r
+    typedef void (*CrashHandlerFunction) (void*);\r
 \r
     /** Sets up a global callback function that will be called if the application\r
         executes some kind of illegal instruction.\r
@@ -223,17 +213,15 @@ public:
     static void setApplicationCrashHandler (CrashHandlerFunction);\r
 \r
     /** Returns true if this code is running inside an app extension sandbox.\r
+\r
         This function will always return false on windows, linux and android.\r
     */\r
     static bool isRunningInAppExtensionSandbox() noexcept;\r
 \r
-\r
+private:\r
     //==============================================================================\r
-    // This method was spelt wrong! Please change your code to use getCpuSpeedInMegahertz() instead\r
-    JUCE_DEPRECATED_WITH_BODY (static int getCpuSpeedInMegaherz(), { return getCpuSpeedInMegahertz(); })\r
+    SystemStats();\r
 \r
-private:\r
-    SystemStats() = delete; // uses only static methods\r
     JUCE_DECLARE_NON_COPYABLE (SystemStats)\r
 };\r
 \r
index 1ff0e47447e5f6022246c715bce8a485948ccd1b..70793f645c24a7ff287471dcf1cb987e01ec8825 100644 (file)
@@ -191,6 +191,7 @@ private:
     StringArray countryCodes;\r
     StringPairArray translations;\r
     std::unique_ptr<LocalisedStrings> fallback;\r
+    friend struct ContainerDeletePolicy<LocalisedStrings>;\r
 \r
     void loadFromText (const String&, bool ignoreCase);\r
 \r
index 2e2f0cc309672a73ee9b8e4057610243c858f6c3..88d530aec526c2e97e8c030689a707f3eb532f3d 100644 (file)
@@ -235,7 +235,7 @@ private:
     }\r
 };\r
 \r
-JUCE_DECLARE_DEPRECATED_STATIC (const String String::empty;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const String String::empty);\r
 \r
 //==============================================================================\r
 String::String() noexcept  : text (&(emptyString.text))\r
@@ -351,19 +351,19 @@ String::String (const CharPointer_UTF16 t)   : text (StringHolder::createFromCha
 String::String (const CharPointer_UTF32 t)   : text (StringHolder::createFromCharPointer (t)) {}\r
 String::String (const CharPointer_ASCII t)   : text (StringHolder::createFromCharPointer (t)) {}\r
 \r
-String::String (CharPointer_UTF8  t, size_t maxChars)   : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
-String::String (CharPointer_UTF16 t, size_t maxChars)   : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
-String::String (CharPointer_UTF32 t, size_t maxChars)   : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
-String::String (const wchar_t* t, size_t maxChars)      : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {}\r
+String::String (const CharPointer_UTF8  t, const size_t maxChars)   : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
+String::String (const CharPointer_UTF16 t, const size_t maxChars)   : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
+String::String (const CharPointer_UTF32 t, const size_t maxChars)   : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
+String::String (const wchar_t* const t, size_t maxChars)            : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {}\r
 \r
-String::String (CharPointer_UTF8  start, CharPointer_UTF8  end)  : text (StringHolder::createFromCharPointer (start, end)) {}\r
-String::String (CharPointer_UTF16 start, CharPointer_UTF16 end)  : text (StringHolder::createFromCharPointer (start, end)) {}\r
-String::String (CharPointer_UTF32 start, CharPointer_UTF32 end)  : text (StringHolder::createFromCharPointer (start, end)) {}\r
+String::String (const CharPointer_UTF8  start, const CharPointer_UTF8  end)  : text (StringHolder::createFromCharPointer (start, end)) {}\r
+String::String (const CharPointer_UTF16 start, const CharPointer_UTF16 end)  : text (StringHolder::createFromCharPointer (start, end)) {}\r
+String::String (const CharPointer_UTF32 start, const CharPointer_UTF32 end)  : text (StringHolder::createFromCharPointer (start, end)) {}\r
 \r
 String::String (const std::string& s) : text (StringHolder::createFromFixedLength (s.data(), s.size())) {}\r
 String::String (StringRef s)          : text (StringHolder::createFromCharPointer (s.text)) {}\r
 \r
-String String::charToString (juce_wchar character)\r
+String String::charToString (const juce_wchar character)\r
 {\r
     String result (PreallocationBytes (CharPointerType::getBytesRequiredFor (character)));\r
     CharPointerType t (result.text);\r
@@ -397,7 +397,7 @@ namespace NumberToStringConverters
     }\r
 \r
     // pass in a pointer to the END of a buffer..\r
-    static char* numberToString (char* t, int64 n) noexcept\r
+    static char* numberToString (char* t, const int64 n) noexcept\r
     {\r
         if (n >= 0)\r
             return printDigits (t, static_cast<uint64> (n));\r
@@ -414,7 +414,7 @@ namespace NumberToStringConverters
         return printDigits (t, v);\r
     }\r
 \r
-    static char* numberToString (char* t, int n) noexcept\r
+    static char* numberToString (char* t, const int n) noexcept\r
     {\r
         if (n >= 0)\r
             return printDigits (t, static_cast<unsigned int> (n));\r
@@ -426,12 +426,12 @@ namespace NumberToStringConverters
         return t;\r
     }\r
 \r
-    static char* numberToString (char* t, unsigned int v) noexcept\r
+    static char* numberToString (char* t, const unsigned int v) noexcept\r
     {\r
         return printDigits (t, v);\r
     }\r
 \r
-    static char* numberToString (char* t, long n) noexcept\r
+    static char* numberToString (char* t, const long n) noexcept\r
     {\r
         if (n >= 0)\r
             return printDigits (t, static_cast<unsigned long> (n));\r
@@ -441,7 +441,7 @@ namespace NumberToStringConverters
         return t;\r
     }\r
 \r
-    static char* numberToString (char* t, unsigned long v) noexcept\r
+    static char* numberToString (char* t, const unsigned long v) noexcept\r
     {\r
         return printDigits (t, v);\r
     }\r
@@ -469,34 +469,11 @@ namespace NumberToStringConverters
                 o << n;\r
             }\r
 \r
-            return findLengthWithoutTrailingZeros (pbase(), pptr());\r
-        }\r
-\r
-        static size_t findLengthWithoutTrailingZeros (const char* const start,\r
-                                                      const char* const end)\r
-        {\r
-            for (auto e = end; e > start + 1; --e)\r
-            {\r
-                auto lastChar = *(e - 1);\r
-\r
-                if (lastChar != '0')\r
-                {\r
-                    if (lastChar == '.')\r
-                        return (size_t) (e + 1 - start);\r
-\r
-                    for (auto s = start; s < e; ++s)\r
-                        if (*s == '.')\r
-                            return (size_t) (e - start);\r
-\r
-                    break;\r
-                }\r
-            }\r
-\r
-            return (size_t) (end - start);\r
+            return (size_t) (pptr() - pbase());\r
         }\r
     };\r
 \r
-    static char* doubleToString (char* buffer, int numChars, double n, int numDecPlaces, size_t& len) noexcept\r
+    static char* doubleToString (char* buffer, const int numChars, double n, int numDecPlaces, size_t& len) noexcept\r
     {\r
         if (numDecPlaces > 0 && numDecPlaces < 7 && n > -1.0e20 && n < 1.0e20)\r
         {\r
@@ -505,14 +482,7 @@ namespace NumberToStringConverters
             auto v = (int64) (std::pow (10.0, numDecPlaces) * std::abs (n) + 0.5);\r
             *--t = (char) 0;\r
 \r
-            // skip trailing zeros\r
-            while (numDecPlaces > 1 && (v % 10) == 0)\r
-            {\r
-                v /= 10;\r
-                --numDecPlaces;\r
-            }\r
-\r
-            while (v > 0 || numDecPlaces >= 0)\r
+            while (numDecPlaces >= 0 || v > 0)\r
             {\r
                 if (numDecPlaces == 0)\r
                     *--t = '.';\r
@@ -537,7 +507,7 @@ namespace NumberToStringConverters
     }\r
 \r
     template <typename IntegerType>\r
-    static String::CharPointerType createFromInteger (IntegerType number)\r
+    static String::CharPointerType createFromInteger (const IntegerType number)\r
     {\r
         char buffer [charsNeededForInt];\r
         auto* end = buffer + numElementsInArray (buffer);\r
@@ -545,7 +515,7 @@ namespace NumberToStringConverters
         return StringHolder::createFromFixedLength (start, (size_t) (end - start - 1));\r
     }\r
 \r
-    static String::CharPointerType createFromDouble (double number, int numberOfDecimalPlaces)\r
+    static String::CharPointerType createFromDouble (const double number, const int numberOfDecimalPlaces)\r
     {\r
         char buffer [charsNeededForDouble];\r
         size_t len;\r
@@ -2077,7 +2047,7 @@ struct StringEncodingConverter
     {\r
         auto& source = const_cast<String&> (s);\r
 \r
-        using DestChar = typename CharPointerType_Dest::CharType;\r
+        typedef typename CharPointerType_Dest::CharType DestChar;\r
 \r
         if (source.isEmpty())\r
             return CharPointerType_Dest (reinterpret_cast<const DestChar*> (&emptyChar));\r
@@ -2244,10 +2214,8 @@ StringRef::StringRef (const std::string& string)       : StringRef (string.c_str
 //==============================================================================\r
 //==============================================================================\r
 #if JUCE_UNIT_TESTS\r
-\r
-#define STRINGIFY2(X) #X\r
-#define STRINGIFY(X) STRINGIFY2(X)\r
-\r
+ #define STRINGIFY2(X) #X\r
+ #define STRINGIFY(X) STRINGIFY2(X)\r
 class StringTests  : public UnitTest\r
 {\r
 public:\r
@@ -2523,14 +2491,7 @@ public:
             expect (String::toHexString (data, 8, 1).equalsIgnoreCase ("01 02 03 04 0a 0b 0c 0d"));\r
             expect (String::toHexString (data, 8, 2).equalsIgnoreCase ("0102 0304 0a0b 0c0d"));\r
 \r
-            expectEquals (String (2589410.5894, 7), String ("2589410.5894"));\r
-            expectEquals (String (2589410.5894, 4), String ("2589410.5894"));\r
-            expectEquals (String (100000.0, 1), String ("100000.0"));\r
-            expectEquals (String (100000.0, 10), String ("100000.0"));\r
-            expectEquals (String (100000.001, 8), String ("100000.001"));\r
-            expectEquals (String (100000.001, 4), String ("100000.001"));\r
-            expectEquals (String (100000.001, 3), String ("100000.001"));\r
-            expectEquals (String (100000.001, 2), String ("100000.0"));\r
+            expectEquals (String (2589410.5894, 7), String ("2589410.5894000"));\r
 \r
             beginTest ("Subsections");\r
             String s3;\r
@@ -2720,49 +2681,6 @@ public:
             expect (! v2.equals (v4));\r
             expect (! v4.equals (v2));\r
         }\r
-\r
-        {\r
-            beginTest ("Significant figures");\r
-\r
-            // Integers\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (13, 1), String ("10"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (13, 2), String ("13"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (13, 3), String ("13.0"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (13, 4), String ("13.00"));\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (19368, 1), String ("20000"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (19348, 3), String ("19300"));\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (-5, 1), String ("-5"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (-5, 3), String ("-5.00"));\r
-\r
-            // Zero\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (0, 1), String ("0"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (0, 2), String ("0.0"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (0, 3), String ("0.00"));\r
-\r
-            // Floating point\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 1), String ("20"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 2), String ("19"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 3), String ("19.0"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 4), String ("19.00"));\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (-5.45, 1), String ("-5"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (-5.45, 3), String ("-5.45"));\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (12345.6789, 9), String ("12345.6789"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (12345.6789, 8), String ("12345.679"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (12345.6789, 5), String ("12346"));\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (0.00028647, 6), String ("0.000286470"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (0.0028647,  6), String ("0.00286470"));\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (2.8647,     6), String ("2.86470"));\r
-\r
-            expectEquals (String::toDecimalStringWithSignificantFigures (-0.0000000000019, 1), String ("-0.000000000002"));\r
-        }\r
     }\r
 };\r
 \r
index 946c25aad92ec28fb5ae672dada87851c37c2272..a778be1ce5130a0f0ea49aa335b63bf975a47e58 100644 (file)
@@ -153,11 +153,11 @@ public:
         toUTF32() methods let you access the string's content in any of the other formats.\r
     */\r
    #if (JUCE_STRING_UTF_TYPE == 32)\r
-    using CharPointerType = CharPointer_UTF32;\r
+    typedef CharPointer_UTF32 CharPointerType;\r
    #elif (JUCE_STRING_UTF_TYPE == 16)\r
-    using CharPointerType = CharPointer_UTF16;\r
+    typedef CharPointer_UTF16 CharPointerType;\r
    #elif (DOXYGEN || JUCE_STRING_UTF_TYPE == 8)\r
-    using CharPointerType = CharPointer_UTF8;\r
+    typedef CharPointer_UTF8  CharPointerType;\r
    #else\r
     #error "You must set the value of JUCE_STRING_UTF_TYPE to be either 8, 16, or 32!"\r
    #endif\r
@@ -962,23 +962,21 @@ public:
 \r
     /** Creates a string representing this floating-point number.\r
         @param floatValue               the value to convert to a string\r
-        @param maxNumberOfDecimalPlaces if this is > 0, it will format the number using no more\r
-                                        decimal places than this amount, and will not use exponent\r
-                                        notation. If 0 or less, it will use a default format, and\r
-                                        exponent notation if necessary.\r
+        @param numberOfDecimalPlaces    if this is > 0, it will format the number using that many\r
+                                        decimal places, and will not use exponent notation. If 0 or\r
+                                        less, it will use exponent notation if necessary.\r
         @see getDoubleValue, getIntValue\r
     */\r
-    String (float floatValue, int maxNumberOfDecimalPlaces);\r
+    String (float floatValue, int numberOfDecimalPlaces);\r
 \r
     /** Creates a string representing this floating-point number.\r
         @param doubleValue              the value to convert to a string\r
-        @param maxNumberOfDecimalPlaces if this is > 0, it will format the number using no more\r
-                                        decimal places than this amount, and will not use exponent\r
-                                        notation. If 0 or less, it will use a default format, and\r
-                                        exponent notation if necessary.\r
+        @param numberOfDecimalPlaces    if this is > 0, it will format the number using that many\r
+                                        decimal places, and will not use exponent notation. If 0 or\r
+                                        less, it will use exponent notation if necessary.\r
         @see getFloatValue, getIntValue\r
     */\r
-    String (double doubleValue, int maxNumberOfDecimalPlaces);\r
+    String (double doubleValue, int numberOfDecimalPlaces);\r
 \r
     // Automatically creating a String from a bool opens up lots of nasty type conversion edge cases.\r
     // If you want a String representation of a bool you can cast the bool to an int first.\r
@@ -1058,131 +1056,6 @@ public:
     */\r
     static String toHexString (const void* data, int size, int groupSize = 1);\r
 \r
-    /** Returns a string containing a decimal with a set number of significant figures.\r
-\r
-        @param number                         the intput number\r
-        @param numberOfSignificantFigures     the number of significant figures to use\r
-    */\r
-    template <typename DecimalType>\r
-    static String toDecimalStringWithSignificantFigures (DecimalType number, int numberOfSignificantFigures)\r
-    {\r
-        jassert (numberOfSignificantFigures > 0);\r
-\r
-        if (number == 0)\r
-        {\r
-            if (numberOfSignificantFigures > 1)\r
-            {\r
-                String result ("0.0");\r
-\r
-                for (int i = 2; i < numberOfSignificantFigures; ++i)\r
-                    result += "0";\r
-\r
-                return result;\r
-            }\r
-\r
-            return "0";\r
-        }\r
-\r
-        auto numDigitsBeforePoint = (int) std::ceil (std::log10 (number < 0 ? -number : number));\r
-\r
-       #if JUCE_PROJUCER_LIVE_BUILD\r
-        auto doubleNumber = (double) number;\r
-        constexpr int bufferSize = 311;\r
-        char buffer[bufferSize];\r
-        auto* ptr = &(buffer[0]);\r
-        auto* const safeEnd = ptr + (bufferSize - 1);\r
-        auto numSigFigsParsed = 0;\r
-\r
-        auto writeToBuffer = [safeEnd] (char* destination, char data)\r
-        {\r
-            *destination++ = data;\r
-\r
-            if (destination == safeEnd)\r
-            {\r
-                *destination = '\0';\r
-                return true;\r
-            }\r
-\r
-            return false;\r
-        };\r
-\r
-        auto truncateOrRound = [numberOfSignificantFigures] (double fractional, int sigFigsParsed)\r
-        {\r
-            return (sigFigsParsed == numberOfSignificantFigures - 1) ? (int) std::round (fractional)\r
-                                                                     : (int) fractional;\r
-        };\r
-\r
-        if (doubleNumber < 0)\r
-        {\r
-            doubleNumber *= -1;\r
-            *ptr++ = '-';\r
-        }\r
-\r
-        if (numDigitsBeforePoint > 0)\r
-        {\r
-            doubleNumber /= std::pow (10.0, numDigitsBeforePoint);\r
-\r
-            while (numDigitsBeforePoint-- > 0)\r
-            {\r
-                if (numSigFigsParsed == numberOfSignificantFigures)\r
-                {\r
-                    if (writeToBuffer (ptr++, '0'))\r
-                        return buffer;\r
-\r
-                    continue;\r
-                }\r
-\r
-                doubleNumber *= 10;\r
-                auto digit = truncateOrRound (doubleNumber, numSigFigsParsed);\r
-\r
-                if (writeToBuffer (ptr++, (char) ('0' + digit)))\r
-                    return buffer;\r
-\r
-                ++numSigFigsParsed;\r
-                doubleNumber -= digit;\r
-            }\r
-\r
-            if (numSigFigsParsed == numberOfSignificantFigures)\r
-            {\r
-                *ptr++ = '\0';\r
-                return buffer;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            *ptr++ = '0';\r
-        }\r
-\r
-        if (writeToBuffer (ptr++, '.'))\r
-            return buffer;\r
-\r
-        while (numSigFigsParsed < numberOfSignificantFigures)\r
-        {\r
-            doubleNumber *= 10;\r
-            auto digit = truncateOrRound (doubleNumber, numSigFigsParsed);\r
-\r
-            if (writeToBuffer (ptr++, (char) ('0' + digit)))\r
-                return buffer;\r
-\r
-            if (numSigFigsParsed != 0 || digit != 0)\r
-                ++numSigFigsParsed;\r
-\r
-            doubleNumber -= digit;\r
-        }\r
-\r
-        *ptr++ = '\0';\r
-        return buffer;\r
-       #else\r
-        auto shift = numberOfSignificantFigures - numDigitsBeforePoint;\r
-        auto factor = std::pow (10.0, shift);\r
-        auto rounded = std::round (number * factor) / factor;\r
-\r
-        std::stringstream ss;\r
-        ss << std::fixed << std::setprecision (std::max (shift, 0)) << rounded;\r
-        return ss.str();\r
-       #endif\r
-    }\r
-\r
     //==============================================================================\r
     /** Returns the character pointer currently being used to store this string.\r
 \r
@@ -1374,7 +1247,7 @@ public:
         empty string from a function by reference, but if you need to do that, it's easy enough to use\r
         a function-local static String object and return that, avoiding any order-of-initialisation issues.\r
     */\r
-    JUCE_DEPRECATED_STATIC (static const String empty;)\r
+    JUCE_DEPRECATED_STATIC (static const String empty);\r
 \r
 private:\r
     //==============================================================================\r
@@ -1405,7 +1278,7 @@ private:
     static String createHex (uint64);\r
 \r
     template <typename Type>\r
-    static String createHex (Type n)  { return createHex (static_cast<typename TypeHelpers::UnsignedTypeWithSize<(int) sizeof (n)>::type> (n)); }\r
+    static String createHex (Type n)  { return createHex (static_cast<typename TypeHelpers::UnsignedTypeWithSize<sizeof (n)>::type> (n)); }\r
 };\r
 \r
 //==============================================================================\r
index 2ccc1591346cd93824d3754461dc8707419deaee..4029231dec1ba9ec52c72915ebc07bc1de2647db 100644 (file)
@@ -37,11 +37,6 @@ StringArray::StringArray (StringArray&& other) noexcept
 {\r
 }\r
 \r
-StringArray::StringArray (Array<String>&& other) noexcept\r
-    : strings (static_cast<Array<String>&&> (other))\r
-{\r
-}\r
-\r
 StringArray::StringArray (const String& firstValue)\r
 {\r
     strings.add (firstValue);\r
@@ -132,18 +127,19 @@ String& StringArray::getReference (int index) noexcept
     return strings.getReference (index);\r
 }\r
 \r
-void StringArray::add (String newString)\r
+void StringArray::add (const String& newString)\r
+{\r
+    strings.add (newString);\r
+}\r
+\r
+void StringArray::add (String&& stringToAdd)\r
 {\r
-    // NB: the local temp copy is to avoid a dangling pointer if the\r
-    // argument being passed-in is a reference into this array.\r
-    strings.add (std::move (newString));\r
+    strings.add (static_cast<String&&> (stringToAdd));\r
 }\r
 \r
-void StringArray::insert (int index, String newString)\r
+void StringArray::insert (int index, const String& newString)\r
 {\r
-    // NB: the local temp copy is to avoid a dangling pointer if the\r
-    // argument being passed-in is a reference into this array.\r
-    strings.insert (index, std::move (newString));\r
+    strings.insert (index, newString);\r
 }\r
 \r
 bool StringArray::addIfNotAlreadyThere (const String& newString, bool ignoreCase)\r
@@ -157,8 +153,6 @@ bool StringArray::addIfNotAlreadyThere (const String& newString, bool ignoreCase
 \r
 void StringArray::addArray (const StringArray& otherArray, int startIndex, int numElementsToAdd)\r
 {\r
-    jassert (this != &otherArray); // can't add from our own elements!\r
-\r
     if (startIndex < 0)\r
     {\r
         jassertfalse;\r
@@ -174,15 +168,13 @@ void StringArray::addArray (const StringArray& otherArray, int startIndex, int n
 \r
 void StringArray::mergeArray (const StringArray& otherArray, bool ignoreCase)\r
 {\r
-    jassert (this != &otherArray); // can't add from our own elements!\r
-\r
     for (auto& s : otherArray)\r
         addIfNotAlreadyThere (s, ignoreCase);\r
 }\r
 \r
-void StringArray::set (int index, String newString)\r
+void StringArray::set (int index, const String& newString)\r
 {\r
-    strings.set (index, std::move (newString));\r
+    strings.set (index, newString);\r
 }\r
 \r
 bool StringArray::contains (StringRef stringToLookFor, bool ignoreCase) const\r
index f00e3a79f2b71e4049e00405ea8476f1876dc04b..51fdd2478bc25955c52209e08a413a653f573b43 100644 (file)
@@ -54,16 +54,6 @@ public:
     /** Creates an array containing a list of strings. */\r
     StringArray (const std::initializer_list<const char*>& strings);\r
 \r
-    /** Creates a StringArray by moving from an Array<String> */\r
-    StringArray (Array<String>&&) noexcept;\r
-\r
-    /** Creates a StringArray from an array of objects which can be implicitly converted to Strings. */\r
-    template <typename Type>\r
-    StringArray (const Array<Type>& stringArray)\r
-    {\r
-        addArray (stringArray.begin(), stringArray.end());\r
-    }\r
-\r
     /** Creates an array from a raw array of strings.\r
         @param strings          an array of strings to add\r
         @param numberOfStrings  how many items there are in the array\r
@@ -106,14 +96,6 @@ public:
     /** Move assignment operator */\r
     StringArray& operator= (StringArray&&) noexcept;\r
 \r
-    /** Copies a StringArray from an array of objects which can be implicitly converted to Strings. */\r
-    template <typename Type>\r
-    StringArray& operator= (const Array<Type>& stringArray)\r
-    {\r
-        addArray (stringArray.begin(), stringArray.end());\r
-        return *this;\r
-    }\r
-\r
     /** Swaps the contents of this and another StringArray. */\r
     void swapWith (StringArray&) noexcept;\r
 \r
@@ -187,7 +169,10 @@ public:
 \r
     //==============================================================================\r
     /** Appends a string at the end of the array. */\r
-    void add (String stringToAdd);\r
+    void add (const String& stringToAdd);\r
+\r
+    /** Appends a string at the end of the array. */\r
+    void add (String&& stringToAdd);\r
 \r
     /** Inserts a string into the array.\r
 \r
@@ -196,7 +181,7 @@ public:
         If the index is less than zero or greater than the size of the array,\r
         the new string will be added to the end of the array.\r
     */\r
-    void insert (int index, String stringToAdd);\r
+    void insert (int index, const String& stringToAdd);\r
 \r
     /** Adds a string to the array as long as it's not already in there.\r
         The search can optionally be case-insensitive.\r
@@ -210,7 +195,7 @@ public:
         If the index is higher than the array's size, the new string will be\r
         added to the end of the array; if it's less than zero nothing happens.\r
     */\r
-    void set (int index, String newString);\r
+    void set (int index, const String& newString);\r
 \r
     /** Appends some strings from another array to the end of this one.\r
 \r
@@ -223,18 +208,6 @@ public:
                    int startIndex = 0,\r
                    int numElementsToAdd = -1);\r
 \r
-    /** Adds items from a range of start/end iterators of some kind of objects which\r
-        can be implicitly converted to Strings.\r
-    */\r
-    template <typename Iterator>\r
-    void addArray (Iterator&& start, Iterator&& end)\r
-    {\r
-        ensureStorageAllocated (size() + (int) static_cast<size_t> (end - start));\r
-\r
-        while (start != end)\r
-            strings.add (*start++);\r
-    }\r
-\r
     /** Merges the strings from another array into this one.\r
         This will not add a string that already exists.\r
 \r
@@ -420,7 +393,7 @@ public:
 \r
     //==============================================================================\r
     /** Sorts the array into alphabetical order.\r
-        @param ignoreCase       if true, the comparisons used will not be case-sensitive.\r
+        @param ignoreCase       if true, the comparisons used will be case-sensitive.\r
     */\r
     void sort (bool ignoreCase);\r
 \r
index dc5feb20dddd810db895b4f960c7c877ea3642ab..3efbc6ffd10bd377c72426dba747ff7abd8a688a 100644 (file)
@@ -104,6 +104,7 @@ public:
 private:\r
     //==============================================================================\r
     class ActiveProcess;\r
+    friend struct ContainerDeletePolicy<ActiveProcess>;\r
     std::unique_ptr<ActiveProcess> activeProcess;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcess)\r
index e1d2463b927c57c400850602f92d9557dd498e0a..70b75304ebb173a660820fd9312e4ad789878a39 100644 (file)
@@ -90,13 +90,13 @@ public:
 \r
     //==============================================================================\r
     /** Provides the type of scoped lock to use with a CriticalSection. */\r
-    using ScopedLockType = GenericScopedLock<CriticalSection>;\r
+    typedef GenericScopedLock <CriticalSection>       ScopedLockType;\r
 \r
     /** Provides the type of scoped unlocker to use with a CriticalSection. */\r
-    using ScopedUnlockType = GenericScopedUnlock<CriticalSection>;\r
+    typedef GenericScopedUnlock <CriticalSection>     ScopedUnlockType;\r
 \r
     /** Provides the type of scoped try-locker to use with a CriticalSection. */\r
-    using ScopedTryLockType = GenericScopedTryLock<CriticalSection>;\r
+    typedef GenericScopedTryLock <CriticalSection>    ScopedTryLockType;\r
 \r
 \r
 private:\r
@@ -148,7 +148,7 @@ public:
     };\r
 \r
     /** A dummy scoped-unlocker type to use with a dummy critical section. */\r
-    using ScopedUnlockType = ScopedLockType;\r
+    typedef ScopedLockType ScopedUnlockType;\r
 \r
 private:\r
     JUCE_DECLARE_NON_COPYABLE (DummyCriticalSection)\r
@@ -183,7 +183,7 @@ private:
 \r
     @see CriticalSection, ScopedUnlock\r
 */\r
-using ScopedLock = CriticalSection::ScopedLockType;\r
+typedef CriticalSection::ScopedLockType  ScopedLock;\r
 \r
 //==============================================================================\r
 /**\r
@@ -223,7 +223,7 @@ using ScopedLock = CriticalSection::ScopedLockType;
 \r
     @see CriticalSection, ScopedLock\r
 */\r
-using ScopedUnlock = CriticalSection::ScopedUnlockType;\r
+typedef CriticalSection::ScopedUnlockType  ScopedUnlock;\r
 \r
 //==============================================================================\r
 /**\r
@@ -257,6 +257,6 @@ using ScopedUnlock = CriticalSection::ScopedUnlockType;
 \r
     @see CriticalSection::tryEnter, ScopedLock, ScopedUnlock, ScopedReadLock\r
 */\r
-using ScopedTryLock = CriticalSection::ScopedTryLockType;\r
+typedef CriticalSection::ScopedTryLockType  ScopedTryLock;\r
 \r
 } // namespace juce\r
index 2ac0db3f26e4d51eb51ff1cef6a0619109fffdd9..b017ea36932bc976dfb546e918d62441a287d399 100644 (file)
@@ -94,6 +94,8 @@ public:
 \r
 private:\r
     struct Pimpl;\r
+    friend struct Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HighResolutionTimer)\r
index 58f2e6d4cd419f30ebfbf2ec281324b428bbf162..6e38766cd7740177dacaa0704e14c0e76d65d463 100644 (file)
@@ -110,6 +110,7 @@ public:
 private:\r
     //==============================================================================\r
     class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     CriticalSection lock;\r
index af607b7fa0f77ed569c363603edd820315a620f2..27347d5f40be32a71b321f8f009c5d80f395864a 100644 (file)
@@ -24,6 +24,9 @@ namespace juce
 {\r
 \r
 ReadWriteLock::ReadWriteLock() noexcept\r
+    : numWaitingWriters (0),\r
+      numWriters (0),\r
+      writerThreadId (0)\r
 {\r
     readerThreads.ensureStorageAllocated (16);\r
 }\r
@@ -138,7 +141,7 @@ void ReadWriteLock::exitWrite() const noexcept
 \r
     if (--numWriters == 0)\r
     {\r
-        writerThreadId = {};\r
+        writerThreadId = 0;\r
         waitEvent.signal();\r
     }\r
 }\r
index c954a87496c969230b267347a4db228734865286..7bb2eeea0c04cc5158628861df23a7188e0b1a1c 100644 (file)
@@ -127,8 +127,8 @@ private:
     //==============================================================================\r
     SpinLock accessLock;\r
     WaitableEvent waitEvent;\r
-    mutable int numWaitingWriters = 0, numWriters = 0;\r
-    mutable Thread::ThreadID writerThreadId = {};\r
+    mutable int numWaitingWriters, numWriters;\r
+    mutable Thread::ThreadID writerThreadId;\r
 \r
     struct ThreadRecursionCount\r
     {\r
index 78fd713b5ac03ac6994c197733fbf6f8f7bdd6c7..88e008bbbc2dd122cfdacdc261a215825179692d 100644 (file)
@@ -70,10 +70,10 @@ public:
 \r
     //==============================================================================\r
     /** Provides the type of scoped lock to use for locking a SpinLock. */\r
-    using ScopedLockType = GenericScopedLock<SpinLock>;\r
+    typedef GenericScopedLock <SpinLock>       ScopedLockType;\r
 \r
     /** Provides the type of scoped unlocker to use with a SpinLock. */\r
-    using ScopedUnlockType = GenericScopedUnlock<SpinLock>;\r
+    typedef GenericScopedUnlock <SpinLock>     ScopedUnlockType;\r
 \r
 private:\r
     //==============================================================================\r
index b37208d8a0c2751042d432cfab1184a1defe85dd..2e7cce85c95d1ae3d8f201e2b5db321ac2cb3af8 100644 (file)
@@ -195,7 +195,7 @@ bool Thread::currentThreadShouldExit()
 bool Thread::waitForThreadToExit (const int timeOutMilliseconds) const\r
 {\r
     // Doh! So how exactly do you expect this thread to wait for itself to stop??\r
-    jassert (getThreadId() != getCurrentThreadId() || getCurrentThreadId() == ThreadID());\r
+    jassert (getThreadId() != getCurrentThreadId() || getCurrentThreadId() == 0);\r
 \r
     auto timeoutEnd = Time::getMillisecondCounter() + (uint32) timeOutMilliseconds;\r
 \r
@@ -236,7 +236,7 @@ bool Thread::stopThread (const int timeOutMilliseconds)
             killThread();\r
 \r
             threadHandle = nullptr;\r
-            threadId = {};\r
+            threadId = 0;\r
             return false;\r
         }\r
     }\r
@@ -288,7 +288,7 @@ bool Thread::setPriority (int newPriority)
 \r
 bool Thread::setCurrentThreadPriority (const int newPriority)\r
 {\r
-    return setThreadPriority ({}, newPriority);\r
+    return setThreadPriority (0, newPriority);\r
 }\r
 \r
 void Thread::setAffinityMask (const uint32 newAffinityMask)\r
index 158860c07e9b927400b9fddf0d69e9bb86319d73..373dc1b06a2faa2be51be46da7921b7cb78aff7b 100644 (file)
@@ -288,7 +288,7 @@ public:
     /** A value type used for thread IDs.\r
         @see getCurrentThreadId(), getThreadId()\r
     */\r
-    using ThreadID = void*;\r
+    typedef void* ThreadID;\r
 \r
     /** Returns an id that identifies the caller thread.\r
 \r
index ea8ac60d827cbb17679df49f43f6ac28d4b6a1a2..298e98ed86b99ffac4891dcff4409aa593ce5ed3 100644 (file)
@@ -90,7 +90,7 @@ ThreadPoolJob* ThreadPoolJob::getCurrentThreadPoolJob()
 }\r
 \r
 //==============================================================================\r
-ThreadPool::ThreadPool (int numThreads, size_t threadStackSize)\r
+ThreadPool::ThreadPool (const int numThreads, size_t threadStackSize)\r
 {\r
     jassert (numThreads > 0); // not much point having a pool without any threads!\r
 \r
@@ -126,7 +126,7 @@ void ThreadPool::stopThreads()
         t->stopThread (500);\r
 }\r
 \r
-void ThreadPool::addJob (ThreadPoolJob* job, bool deleteJobWhenFinished)\r
+void ThreadPool::addJob (ThreadPoolJob* const job, const bool deleteJobWhenFinished)\r
 {\r
     jassert (job != nullptr);\r
     jassert (job->pool == nullptr);\r
@@ -190,13 +190,13 @@ ThreadPoolJob* ThreadPool::getJob (int index) const noexcept
     return jobs [index];\r
 }\r
 \r
-bool ThreadPool::contains (const ThreadPoolJob* job) const noexcept\r
+bool ThreadPool::contains (const ThreadPoolJob* const job) const noexcept\r
 {\r
     const ScopedLock sl (lock);\r
     return jobs.contains (const_cast<ThreadPoolJob*> (job));\r
 }\r
 \r
-bool ThreadPool::isJobRunning (const ThreadPoolJob* job) const noexcept\r
+bool ThreadPool::isJobRunning (const ThreadPoolJob* const job) const noexcept\r
 {\r
     const ScopedLock sl (lock);\r
     return jobs.contains (const_cast<ThreadPoolJob*> (job)) && job->isActive;\r
@@ -212,7 +212,7 @@ void ThreadPool::moveJobToFront (const ThreadPoolJob* job) noexcept
         jobs.move (index, 0);\r
 }\r
 \r
-bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* job, int timeOutMs) const\r
+bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* const job, const int timeOutMs) const\r
 {\r
     if (job != nullptr)\r
     {\r
@@ -230,7 +230,9 @@ bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* job, int timeOutMs) co
     return true;\r
 }\r
 \r
-bool ThreadPool::removeJob (ThreadPoolJob* job, bool interruptIfRunning, int timeOutMs)\r
+bool ThreadPool::removeJob (ThreadPoolJob* const job,\r
+                            const bool interruptIfRunning,\r
+                            const int timeOutMs)\r
 {\r
     bool dontWait = true;\r
     OwnedArray<ThreadPoolJob> deletionList;\r
@@ -259,8 +261,8 @@ bool ThreadPool::removeJob (ThreadPoolJob* job, bool interruptIfRunning, int tim
     return dontWait || waitForJobToFinish (job, timeOutMs);\r
 }\r
 \r
-bool ThreadPool::removeAllJobs (bool interruptRunningJobs, int timeOutMs,\r
-                                ThreadPool::JobSelector* selectedJobsToRemove)\r
+bool ThreadPool::removeAllJobs (const bool interruptRunningJobs, const int timeOutMs,\r
+                                ThreadPool::JobSelector* const selectedJobsToRemove)\r
 {\r
     Array<ThreadPoolJob*> jobsToWaitFor;\r
 \r
@@ -317,7 +319,7 @@ bool ThreadPool::removeAllJobs (bool interruptRunningJobs, int timeOutMs,
     return true;\r
 }\r
 \r
-StringArray ThreadPool::getNamesOfAllJobs (bool onlyReturnActiveJobs) const\r
+StringArray ThreadPool::getNamesOfAllJobs (const bool onlyReturnActiveJobs) const\r
 {\r
     StringArray s;\r
     const ScopedLock sl (lock);\r
@@ -329,7 +331,7 @@ StringArray ThreadPool::getNamesOfAllJobs (bool onlyReturnActiveJobs) const
     return s;\r
 }\r
 \r
-bool ThreadPool::setThreadPriorities (int newPriority)\r
+bool ThreadPool::setThreadPriorities (const int newPriority)\r
 {\r
     bool ok = true;\r
 \r
@@ -419,7 +421,7 @@ bool ThreadPool::runNextJob (ThreadPoolThread& thread)
     return false;\r
 }\r
 \r
-void ThreadPool::addToDeleteList (OwnedArray<ThreadPoolJob>& deletionList, ThreadPoolJob* job) const\r
+void ThreadPool::addToDeleteList (OwnedArray<ThreadPoolJob>& deletionList, ThreadPoolJob* const job) const\r
 {\r
     job->shouldStop = true;\r
     job->pool = nullptr;\r
index a8152930740ae829f25f9e5c1ebb1499e5a6d859..68ab02648004419127050ad5adf27b6920d28b57 100644 (file)
@@ -134,7 +134,7 @@ private:
     friend class ThreadPool;\r
     String jobName;\r
     ThreadPool* pool = nullptr;\r
-    std::atomic<bool> shouldStop { false }, isActive { false }, shouldBeDeleted { false };\r
+    bool shouldStop = false, isActive = false, shouldBeDeleted = false;\r
     ListenerList<Thread::Listener, Array<Thread::Listener*, CriticalSection>> listeners;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolJob)\r
@@ -322,6 +322,8 @@ private:
 \r
     struct ThreadPoolThread;\r
     friend class ThreadPoolJob;\r
+    friend struct ThreadPoolThread;\r
+    friend struct ContainerDeletePolicy<ThreadPoolThread>;\r
     OwnedArray<ThreadPoolThread> threads;\r
 \r
     CriticalSection lock;\r
index 012b83ac69494d98a9d3ff7e41c980686137c75d..1701eab625c015f2d5daeb5289eacb187c53b3da 100644 (file)
@@ -27,8 +27,9 @@ namespace juce
 /**\r
     Allows threads to wait for events triggered by other threads.\r
 \r
-    A thread can call WaitableEvent::wait() to suspend the calling thread until\r
-    another thread wakes it up by calling the WaitableEvent::signal() method.\r
+    A thread can call wait() on a WaitableObject, and this will suspend the\r
+    calling thread until another thread wakes it up by calling the signal()\r
+    method.\r
 \r
     @tags{Core}\r
 */\r
index 074da4bc42913cc352cd633a018eb5f142bc285f..ce49f302d0a3f99bb209dccd8e89dbf62df2cc59 100644 (file)
@@ -94,11 +94,11 @@ namespace TimeHelpers
     static inline String formatString (const String& format, const std::tm* const tm)\r
     {\r
        #if JUCE_ANDROID\r
-        using StringType = CharPointer_UTF8;\r
+        typedef CharPointer_UTF8  StringType;\r
        #elif JUCE_WINDOWS\r
-        using StringType = CharPointer_UTF16;\r
+        typedef CharPointer_UTF16 StringType;\r
        #else\r
-        using StringType = CharPointer_UTF32;\r
+        typedef CharPointer_UTF32 StringType;\r
        #endif\r
 \r
        #ifdef JUCE_MSVC\r
@@ -159,7 +159,7 @@ namespace TimeHelpers
         }\r
         else if (month < 0)\r
         {\r
-            auto numYears = (11 - month) / 12;\r
+            const int numYears = (11 - month) / 12;\r
             year -= numYears;\r
             month += 12 * numYears;\r
         }\r
@@ -181,9 +181,16 @@ namespace TimeHelpers
 }\r
 \r
 //==============================================================================\r
+Time::Time() noexcept  : millisSinceEpoch (0)\r
+{\r
+}\r
+\r
+Time::Time (const Time& other) noexcept  : millisSinceEpoch (other.millisSinceEpoch)\r
+{\r
+}\r
+\r
 Time::Time (int64 ms) noexcept  : millisSinceEpoch (ms)\r
 {\r
-    static_assert (std::is_trivially_copyable<Time>::value, "Time is not trivially copyable");\r
 }\r
 \r
 Time::Time (int year, int month, int day,\r
@@ -204,6 +211,16 @@ Time::Time (int year, int month, int day,
                          + milliseconds;\r
 }\r
 \r
+Time::~Time() noexcept\r
+{\r
+}\r
+\r
+Time& Time::operator= (const Time& other) noexcept\r
+{\r
+    millisSinceEpoch = other.millisSinceEpoch;\r
+    return *this;\r
+}\r
+\r
 //==============================================================================\r
 int64 Time::currentTimeMillis() noexcept\r
 {\r
@@ -289,10 +306,10 @@ int64 Time::secondsToHighResolutionTicks (const double seconds) noexcept
 }\r
 \r
 //==============================================================================\r
-String Time::toString (bool includeDate,\r
-                       bool includeTime,\r
-                       bool includeSeconds,\r
-                       bool use24HourClock) const\r
+String Time::toString (const bool includeDate,\r
+                       const bool includeTime,\r
+                       const bool includeSeconds,\r
+                       const bool use24HourClock) const noexcept\r
 {\r
     String result;\r
 \r
@@ -363,7 +380,7 @@ bool Time::isDaylightSavingTime() const noexcept
     return TimeHelpers::millisToLocal (millisSinceEpoch).tm_isdst != 0;\r
 }\r
 \r
-String Time::getTimeZone() const\r
+String Time::getTimeZone() const noexcept\r
 {\r
     String zone[2];\r
 \r
@@ -375,7 +392,7 @@ String Time::getTimeZone() const
     {\r
         char name[128] = { 0 };\r
         size_t length;\r
-        _get_tzname (&length, name, sizeof (name) - 1, i);\r
+        _get_tzname (&length, name, 127, i);\r
         zone[i] = name;\r
     }\r
    #else\r
@@ -409,9 +426,9 @@ int Time::getUTCOffsetSeconds() const noexcept
 \r
 String Time::getUTCOffsetString (bool includeSemiColon) const\r
 {\r
-    if (auto seconds = getUTCOffsetSeconds())\r
+    if (int seconds = getUTCOffsetSeconds())\r
     {\r
-        auto minutes = seconds / 60;\r
+        const int minutes = seconds / 60;\r
 \r
         return String::formatted (includeSemiColon ? "%+03d:%02d"\r
                                                    : "%+03d%02d",\r
@@ -441,7 +458,7 @@ static int parseFixedSizeIntAndSkip (String::CharPointerType& t, int numChars, c
 \r
     for (int i = numChars; --i >= 0;)\r
     {\r
-        auto digit = (int) (*t - '0');\r
+        const int digit = (int) (*t - '0');\r
 \r
         if (! isPositiveAndBelow (digit, 10))\r
             return -1;\r
@@ -456,7 +473,7 @@ static int parseFixedSizeIntAndSkip (String::CharPointerType& t, int numChars, c
     return n;\r
 }\r
 \r
-Time Time::fromISO8601 (StringRef iso)\r
+Time Time::fromISO8601 (StringRef iso) noexcept\r
 {\r
     auto t = iso.text;\r
     auto year = parseFixedSizeIntAndSkip (t, 4, '-');\r
@@ -579,7 +596,7 @@ bool operator>  (Time time1, Time time2) noexcept      { return time1.toMillisec
 bool operator<= (Time time1, Time time2) noexcept      { return time1.toMilliseconds() <= time2.toMilliseconds(); }\r
 bool operator>= (Time time1, Time time2) noexcept      { return time1.toMilliseconds() >= time2.toMilliseconds(); }\r
 \r
-static int getMonthNumberForCompileDate (const String& m)\r
+static int getMonthNumberForCompileDate (const String& m) noexcept\r
 {\r
     for (int i = 0; i < 12; ++i)\r
         if (m.equalsIgnoreCase (shortMonthNames[i]))\r
index 72d9c2fd9b416463e6e7a51c84ecb3bd3052631a..e80ddc04e1880480001e96f05e8c2dec125f4f6e 100644 (file)
@@ -38,14 +38,18 @@ class JUCE_API  Time
 public:\r
     //==============================================================================\r
     /** Creates a Time object.\r
+\r
         This default constructor creates a time of midnight Jan 1st 1970 UTC, (which is\r
         represented internally as 0ms).\r
+\r
         To create a time object representing the current time, use getCurrentTime().\r
+\r
         @see getCurrentTime\r
     */\r
-    Time() = default;\r
+    Time() noexcept;\r
 \r
     /** Creates a time based on a number of milliseconds.\r
+\r
         To create a time object set to the current time, use getCurrentTime().\r
 \r
         @param millisecondsSinceEpoch   the number of milliseconds since the unix\r
@@ -75,10 +79,14 @@ public:
           int milliseconds = 0,\r
           bool useLocalTime = true) noexcept;\r
 \r
-    Time (const Time&) = default;\r
-    ~Time() = default;\r
+    /** Creates a copy of another Time object. */\r
+    Time (const Time& other) noexcept;\r
+\r
+    /** Destructor. */\r
+    ~Time() noexcept;\r
 \r
-    Time& operator= (const Time&) = default;\r
+    /** Copies this time from another one. */\r
+    Time& operator= (const Time& other) noexcept;\r
 \r
     //==============================================================================\r
     /** Returns a Time object that is set to the current system time.\r
@@ -175,7 +183,7 @@ public:
 \r
     //==============================================================================\r
     /** Returns a 3-character string to indicate the local timezone. */\r
-    String getTimeZone() const;\r
+    String getTimeZone() const noexcept;\r
 \r
     /** Returns the local timezone offset from UTC in seconds. */\r
     int getUTCOffsetSeconds() const noexcept;\r
@@ -202,7 +210,7 @@ public:
     String toString (bool includeDate,\r
                      bool includeTime,\r
                      bool includeSeconds = true,\r
-                     bool use24HourClock = false) const;\r
+                     bool use24HourClock = false) const noexcept;\r
 \r
     /** Converts this date/time to a string with a user-defined format.\r
 \r
@@ -247,7 +255,7 @@ public:
     String toISO8601 (bool includeDividerCharacters) const;\r
 \r
     /** Parses an ISO-8601 string and returns it as a Time. */\r
-    static Time fromISO8601 (StringRef iso8601);\r
+    static Time fromISO8601 (StringRef iso8601) noexcept;\r
 \r
     //==============================================================================\r
     /** Adds a RelativeTime to this time. */\r
@@ -371,7 +379,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    int64 millisSinceEpoch = 0;\r
+    int64 millisSinceEpoch;\r
 };\r
 \r
 //==============================================================================\r
index 31328415874c4132143ef92d13222e8c0eedce92..6dcd518fc620856c18f169239026d15095ead4aa 100644 (file)
@@ -40,16 +40,6 @@ XmlElement* XmlDocument::parse (const String& xmlData)
     return doc.getDocumentElement();\r
 }\r
 \r
-std::unique_ptr<XmlElement> parseXML (const String& textToParse)\r
-{\r
-    return std::unique_ptr<XmlElement> (XmlDocument::parse (textToParse));\r
-}\r
-\r
-std::unique_ptr<XmlElement> parseXML (const File& fileToParse)\r
-{\r
-    return std::unique_ptr<XmlElement> (XmlDocument::parse (fileToParse));\r
-}\r
-\r
 void XmlDocument::setInputSource (InputSource* newSource) noexcept\r
 {\r
     inputSource.reset (newSource);\r
index 267d565c3f92d003a1a26abeb52608a2fe962924..997e16fa39ca4d81fbe602126103613325ff93c1 100644 (file)
@@ -47,15 +47,14 @@ namespace juce
 \r
     @endcode\r
 \r
-    Or you can use the helper functions for much less verbose parsing..\r
+    Or you can use the static helper methods for quick parsing..\r
 \r
     @code\r
-    if (auto xml = parseXML (myXmlFile))\r
+    std::unique_ptr<XmlElement> xml (XmlDocument::parse (myXmlFile));\r
+\r
+    if (xml != nullptr && xml->hasTagName ("foobar"))\r
     {\r
-        if (xml->hasTagName ("foobar"))\r
-        {\r
-            ...etc\r
-        }\r
+        ...etc\r
     }\r
     @endcode\r
 \r
@@ -133,14 +132,12 @@ public:
     //==============================================================================\r
     /** A handy static method that parses a file.\r
         This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it.\r
-        An even better shortcut is the juce::parseXML() function, which returns a std::unique_ptr<XmlElement>!\r
         @returns    a new XmlElement which the caller will need to delete, or null if there was an error.\r
     */\r
     static XmlElement* parse (const File& file);\r
 \r
     /** A handy static method that parses some XML data.\r
         This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it.\r
-        An even better shortcut is the juce::parseXML() function, which returns a std::unique_ptr<XmlElement>!\r
         @returns    a new XmlElement which the caller will need to delete, or null if there was an error.\r
     */\r
     static XmlElement* parse (const String& xmlData);\r
@@ -175,21 +172,4 @@ private:
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument)\r
 };\r
 \r
-//==============================================================================\r
-/** Attempts to parse some XML text, returning a new XmlElement if it was valid.\r
-    If the parse fails, this will return a nullptr - if you need more information about\r
-    errors or more parsing options, see the XmlDocument instead.\r
-    @see XmlDocument\r
-*/\r
-std::unique_ptr<XmlElement> parseXML (const String& textToParse);\r
-\r
-/** Attempts to parse some XML text, returning a new XmlElement if it was valid.\r
-    If the parse fails, this will return a nullptr - if you need more information about\r
-    errors or more parsing options, see the XmlDocument instead.\r
-    @see XmlDocument\r
-*/\r
-std::unique_ptr<XmlElement> parseXML (const File& fileToParse);\r
-\r
-\r
-\r
 } // namespace juce\r
index 5c74492212d57539898a7897e3a752af0824788f..3e6a2fa9544e481ef8e8c6e206818ed18ea6f292 100644 (file)
@@ -241,7 +241,7 @@ namespace XmlOutputFunctions
                             outputStream << (char) character;\r
                             break;\r
                         }\r
-                        // Note: Deliberate fall-through here!\r
+                        // Note: deliberate fall-through here!\r
                     default:\r
                         outputStream << "&#" << ((int) character) << ';';\r
                         break;\r
index 151c56cdf5fd226ba2a8ff5899446e6eb92c9a08..4359973eb09e866c385aedefec914de3da14c22b 100644 (file)
@@ -100,6 +100,7 @@ private:
     OptionalScopedPointer<OutputStream> destStream;\r
 \r
     class GZIPCompressorHelper;\r
+    friend struct ContainerDeletePolicy<GZIPCompressorHelper>;\r
     std::unique_ptr<GZIPCompressorHelper> helper;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPCompressorOutputStream)\r
index 16290c00839cb7f0bb335febf468b95faff1d464..610b10e34156b278141c1ef70e5faf441edbee11 100644 (file)
@@ -36,9 +36,6 @@ namespace zlibNamespace
    #pragma clang diagnostic ignored "-Wconversion"\r
    #pragma clang diagnostic ignored "-Wshadow"\r
    #pragma clang diagnostic ignored "-Wdeprecated-register"\r
-   #if __has_warning("-Wzero-as-null-pointer-constant")\r
-    #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
-   #endif\r
    #if __has_warning("-Wcomma")\r
     #pragma clang diagnostic ignored "-Wcomma"\r
    #endif\r
@@ -273,7 +270,7 @@ int GZIPDecompressorInputStream::read (void* destBuffer, int howMany)
 \r
 bool GZIPDecompressorInputStream::isExhausted()\r
 {\r
-    return helper->error || helper->finished || isEof;\r
+    return helper->error || isEof;\r
 }\r
 \r
 int64 GZIPDecompressorInputStream::getPosition()\r
@@ -298,82 +295,4 @@ bool GZIPDecompressorInputStream::setPosition (int64 newPos)
     return true;\r
 }\r
 \r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct GZIPDecompressorInputStreamTests   : public UnitTest\r
-{\r
-    GZIPDecompressorInputStreamTests()\r
-        : UnitTest ("GZIPDecompressorInputStreamTests", "Streams")\r
-    {}\r
-\r
-    void runTest() override\r
-    {\r
-        const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
-\r
-        MemoryOutputStream mo;\r
-        GZIPCompressorOutputStream gzipOutputStream (mo);\r
-        gzipOutputStream.write (data.getData(), data.getSize());\r
-        gzipOutputStream.flush();\r
-\r
-        MemoryInputStream mi (mo.getData(), mo.getDataSize(), false);\r
-        GZIPDecompressorInputStream stream (&mi, false, GZIPDecompressorInputStream::zlibFormat, (int64) data.getSize());\r
-\r
-        beginTest ("Read");\r
-\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        size_t numBytesRead = 0;\r
-        MemoryBlock readBuffer (data.getSize());\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-\r
-        expect (readBuffer == data);\r
-\r
-        beginTest ("Skip");\r
-\r
-        stream.setPosition (0);\r
-        expectEquals (stream.getPosition(), (int64) 0);\r
-        expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
-        expect (! stream.isExhausted());\r
-\r
-        numBytesRead = 0;\r
-        const int numBytesToSkip = 5;\r
-\r
-        while (numBytesRead < data.getSize())\r
-        {\r
-            stream.skipNextBytes (numBytesToSkip);\r
-            numBytesRead += numBytesToSkip;\r
-            numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
-            expectEquals (stream.getPosition(), (int64) numBytesRead);\r
-            expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
-            expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
-        }\r
-\r
-        expectEquals (stream.getPosition(), (int64) data.getSize());\r
-        expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
-        expect (stream.isExhausted());\r
-    }\r
-};\r
-\r
-static GZIPDecompressorInputStreamTests gzipDecompressorInputStreamTests;\r
-\r
-#endif\r
-\r
 } // namespace juce\r
index 031fad89e825529f2b53cb262cf820ad88af3497..4d0b38a75712276ee9d2972facdff8309791f300 100644 (file)
@@ -90,6 +90,7 @@ private:
     HeapBlock<uint8> buffer;\r
 \r
     class GZIPDecompressHelper;\r
+    friend struct ContainerDeletePolicy<GZIPDecompressHelper>;\r
     std::unique_ptr<GZIPDecompressHelper> helper;\r
 \r
    #if JUCE_CATCH_DEPRECATED_CODE_MISUSE\r
index 88fab01cbaaa2b9889ae5a3f87aa57acf3dc0dc9..8aaae9d830d5a3cfa35073034cd405aa60a4b58d 100644 (file)
@@ -224,6 +224,7 @@ public:
         //==============================================================================\r
     private:\r
         struct Item;\r
+        friend struct ContainerDeletePolicy<Item>;\r
         OwnedArray<Item> items;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Builder)\r
index f6cd04bc8154d54e1af7f277bfdfdd5d119aada6..8133c85b71be048fcef02a4f56e3df6717585011 100644 (file)
@@ -73,7 +73,7 @@ public:
         @param buffer       The message that should be encrypted. See bufferSize on size\r
                             requirements!\r
         @param sizeOfMsg    The size of the message that should be encrypted in bytes\r
-        @param bufferSize   The size of the buffer in bytes. To accommodate the encypted\r
+        @param bufferSize   The size of the buffer in bytes. To accomadate the encypted\r
                             data, the buffer must be larger than the message: the size of\r
                             the buffer needs to be equal or greater than the size of the\r
                             message in bytes rounded to the next integer which is divisable\r
index a0bc3504b06fb129c05a8c447b8efcce67fca27f..7988a5fb24db38be016d1ec8a3d19a3e61c38c50 100644 (file)
@@ -52,7 +52,7 @@ public:
     */\r
     static BigInteger createProbablePrime (int bitLength,\r
                                            int certainty,\r
-                                        const int* randomSeeds = nullptr,\r
+                                           const int* randomSeeds = 0,\r
                                            int numRandomSeeds = 0);\r
 \r
     /** Tests a number to see if it's prime.\r
index 8e5eb77db2ee4b29691c7df0086468b8a7a93959..7e7735a7d146d341b4a96bbe466427cc5d37e473 100644 (file)
@@ -123,7 +123,7 @@ void RSAKey::createKeyPair (RSAKey& publicKey, RSAKey& privateKey,
     jassert (numRandomSeeds == 0 || numRandomSeeds >= 2); // you need to provide plenty of seeds here!\r
 \r
     BigInteger p (Primes::createProbablePrime (numBits / 2, 30, randomSeeds, numRandomSeeds / 2));\r
-    BigInteger q (Primes::createProbablePrime (numBits - numBits / 2, 30, randomSeeds == nullptr ? nullptr : (randomSeeds + numRandomSeeds / 2), numRandomSeeds - numRandomSeeds / 2));\r
+    BigInteger q (Primes::createProbablePrime (numBits - numBits / 2, 30, randomSeeds == nullptr ? 0 : (randomSeeds + numRandomSeeds / 2), numRandomSeeds - numRandomSeeds / 2));\r
 \r
     const BigInteger n (p * q);\r
     const BigInteger m (--p * --q);\r
index b98263dfa024aaa9dbe8a33ece3ec222430b0d9f..504d92483bc65d9c93fd070e424b052e8ae3e595 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_cryptography\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE cryptography classes\r
   description:      Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.\r
   website:          http://www.juce.com/juce\r
index c9a63f0da3cb3e04362dfbef94e0f875588ad3e1..c51d5916cd25907afcc78df313cf94b0f60c84c5 100644 (file)
@@ -58,13 +58,10 @@ File PropertiesFile::Options::getDefaultFile() const
     File dir (commonToAllUsers ?  "/Library/"\r
                                : "~/Library/");\r
 \r
-    if (osxLibrarySubFolder != "Preferences"\r
-        && ! osxLibrarySubFolder.startsWith ("Application Support")\r
-        && ! osxLibrarySubFolder.startsWith ("Containers"))\r
+    if (osxLibrarySubFolder != "Preferences" && ! osxLibrarySubFolder.startsWith ("Application Support"))\r
     {\r
         /* The PropertiesFile class always used to put its settings files in "Library/Preferences", but Apple\r
-           have changed their advice, and now stipulate that settings should go in "Library/Application Support",\r
-           or Library/Containers/[app_bundle_id] for a sandboxed app.\r
+           have changed their advice, and now stipulate that settings should go in "Library/Application Support".\r
 \r
            Because older apps would be broken by a silent change in this class's behaviour, you must now\r
            explicitly set the osxLibrarySubFolder value to indicate which path you want to use.\r
index 900e3c96f35f6ab2f97e85c67949f48124dd47c8..838d16d871ef2357ab06027056f9243fdaccf440 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_data_structures\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE data model helper classes\r
   description:      Classes for undo/redo management, and smart data structures.\r
   website:          http://www.juce.com/juce\r
index 64b546b2d7cb2afe2bb0c489e48fc1e087825989..c736f0c62b7e7873bb4549b64d2b7eb1babfa311 100644 (file)
@@ -29,7 +29,9 @@ namespace juce
 \r
 struct UndoManager::ActionSet\r
 {\r
-    ActionSet (const String& transactionName)  : name (transactionName)\r
+    ActionSet (const String& transactionName)\r
+        : name (transactionName),\r
+          time (Time::getCurrentTime())\r
     {}\r
 \r
     bool perform() const\r
@@ -62,7 +64,7 @@ struct UndoManager::ActionSet
 \r
     OwnedArray<UndoableAction> actions;\r
     String name;\r
-    Time time { Time::getCurrentTime() };\r
+    Time time;\r
 };\r
 \r
 //==============================================================================\r
@@ -115,9 +117,9 @@ bool UndoManager::perform (UndoableAction* newAction)
     {\r
         std::unique_ptr<UndoableAction> action (newAction);\r
 \r
-        if (isPerformingUndoRedo())\r
+        if (reentrancyCheck)\r
         {\r
-            jassertfalse;  // Don't call perform() recursively from the UndoableAction::perform()\r
+            jassertfalse;  // don't call perform() recursively from the UndoableAction::perform()\r
                            // or undo() methods, or else these actions will be discarded!\r
             return false;\r
         }\r
@@ -207,18 +209,18 @@ void UndoManager::dropOldTransactionsIfTooLarge()
     }\r
 }\r
 \r
-void UndoManager::beginNewTransaction()\r
+void UndoManager::beginNewTransaction() noexcept\r
 {\r
     beginNewTransaction ({});\r
 }\r
 \r
-void UndoManager::beginNewTransaction (const String& actionName)\r
+void UndoManager::beginNewTransaction (const String& actionName) noexcept\r
 {\r
     newTransaction = true;\r
     newTransactionName = actionName;\r
 }\r
 \r
-void UndoManager::setCurrentTransactionName (const String& newName)\r
+void UndoManager::setCurrentTransactionName (const String& newName) noexcept\r
 {\r
     if (newTransaction)\r
         newTransactionName = newName;\r
@@ -226,7 +228,7 @@ void UndoManager::setCurrentTransactionName (const String& newName)
         action->name = newName;\r
 }\r
 \r
-String UndoManager::getCurrentTransactionName() const\r
+String UndoManager::getCurrentTransactionName() const noexcept\r
 {\r
     if (auto* action = getCurrentSet())\r
         return action->name;\r
@@ -235,19 +237,17 @@ String UndoManager::getCurrentTransactionName() const
 }\r
 \r
 //==============================================================================\r
-UndoManager::ActionSet* UndoManager::getCurrentSet() const     { return transactions[nextIndex - 1]; }\r
-UndoManager::ActionSet* UndoManager::getNextSet() const        { return transactions[nextIndex]; }\r
+UndoManager::ActionSet* UndoManager::getCurrentSet() const noexcept     { return transactions[nextIndex - 1]; }\r
+UndoManager::ActionSet* UndoManager::getNextSet() const noexcept        { return transactions[nextIndex]; }\r
 \r
-bool UndoManager::isPerformingUndoRedo() const  { return isInsideUndoRedoCall; }\r
-\r
-bool UndoManager::canUndo() const      { return getCurrentSet() != nullptr; }\r
-bool UndoManager::canRedo() const      { return getNextSet()    != nullptr; }\r
+bool UndoManager::canUndo() const noexcept   { return getCurrentSet() != nullptr; }\r
+bool UndoManager::canRedo() const noexcept   { return getNextSet()    != nullptr; }\r
 \r
 bool UndoManager::undo()\r
 {\r
     if (auto* s = getCurrentSet())\r
     {\r
-        const ScopedValueSetter<bool> setter (isInsideUndoRedoCall, true);\r
+        const ScopedValueSetter<bool> setter (reentrancyCheck, true);\r
 \r
         if (s->undo())\r
             --nextIndex;\r
@@ -266,7 +266,7 @@ bool UndoManager::redo()
 {\r
     if (auto* s = getNextSet())\r
     {\r
-        const ScopedValueSetter<bool> setter (isInsideUndoRedoCall, true);\r
+        const ScopedValueSetter<bool> setter (reentrancyCheck, true);\r
 \r
         if (s->perform())\r
             ++nextIndex;\r
index efa055eca6791533b6449aeed81662495a0e63f3..3eac83abf680ad0c2d7e7a2c2101ae862cf5d9b7 100644 (file)
@@ -126,7 +126,7 @@ public:
         method are grouped together and undone/redone together by a single call to\r
         undo() or redo().\r
     */\r
-    void beginNewTransaction();\r
+    void beginNewTransaction() noexcept;\r
 \r
     /** Starts a new group of actions that together will be treated as a single transaction.\r
 \r
@@ -137,7 +137,7 @@ public:
         @param actionName   a description of the transaction that is about to be\r
                             performed\r
     */\r
-    void beginNewTransaction (const String& actionName);\r
+    void beginNewTransaction (const String& actionName) noexcept;\r
 \r
     /** Changes the name stored for the current transaction.\r
 \r
@@ -145,18 +145,18 @@ public:
         called, but this can be used to change that name without starting a new\r
         transaction.\r
     */\r
-    void setCurrentTransactionName (const String& newName);\r
+    void setCurrentTransactionName (const String& newName) noexcept;\r
 \r
     /** Returns the name of the current transaction.\r
         @see setCurrentTransactionName\r
     */\r
-    String getCurrentTransactionName() const;\r
+    String getCurrentTransactionName() const noexcept;\r
 \r
     //==============================================================================\r
     /** Returns true if there's at least one action in the list to undo.\r
         @see getUndoDescription, undo, canRedo\r
     */\r
-    bool canUndo() const;\r
+    bool canUndo() const noexcept;\r
 \r
     /** Tries to roll-back the last transaction.\r
         @returns    true if the transaction can be undone, and false if it fails, or\r
@@ -217,7 +217,7 @@ public:
     /** Returns true if there's at least one action in the list to redo.\r
         @see getRedoDescription, redo, canUndo\r
     */\r
-    bool canRedo() const;\r
+    bool canRedo() const noexcept;\r
 \r
     /** Tries to redo the last transaction that was undone.\r
         @returns   true if the transaction can be redone, and false if it fails, or\r
@@ -243,18 +243,16 @@ public:
     */\r
     Time getTimeOfRedoTransaction() const;\r
 \r
-    /** Returns true if the caller code is in the middle of an undo or redo action. */\r
-    bool isPerformingUndoRedo() const;\r
-\r
 private:\r
     //==============================================================================\r
     struct ActionSet;\r
+    friend struct ContainerDeletePolicy<ActionSet>;\r
     OwnedArray<ActionSet> transactions, stashedFutureTransactions;\r
     String newTransactionName;\r
     int totalUnitsStored = 0, maxNumUnitsToKeep = 0, minimumTransactionsToKeep = 0, nextIndex = 0;\r
-    bool newTransaction = true, isInsideUndoRedoCall = false;\r
-    ActionSet* getCurrentSet() const;\r
-    ActionSet* getNextSet() const;\r
+    bool newTransaction = true, reentrancyCheck = false;\r
+    ActionSet* getCurrentSet() const noexcept;\r
+    ActionSet* getNextSet() const noexcept;\r
     void moveFutureTransactionsToStash();\r
     void restoreStashedFutureTransactions();\r
     void dropOldTransactionsIfTooLarge();\r
index 10d16ebb43dc6a790db94f976fa97642c2b716c3..e40410d93f3675b5b5122b0ee534d9987e652cc2 100644 (file)
@@ -39,7 +39,7 @@ public:
     {\r
         for (auto* c : other.children)\r
         {\r
-            auto* child = new SharedObject (*c);\r
+            auto child = new SharedObject (*c);\r
             child->parent = this;\r
             children.add (child);\r
         }\r
@@ -51,18 +51,18 @@ public:
     {\r
         jassert (parent == nullptr); // this should never happen unless something isn't obeying the ref-counting!\r
 \r
-        for (auto i = children.size(); --i >= 0;)\r
+        for (int i = children.size(); --i >= 0;)\r
         {\r
-            const Ptr c (children.getObjectPointerUnchecked (i));\r
+            const Ptr c (children.getObjectPointerUnchecked(i));\r
             c->parent = nullptr;\r
             children.remove (i);\r
             c->sendParentChangeMessage();\r
         }\r
     }\r
 \r
-    SharedObject& getRoot() noexcept\r
+    SharedObject* getRoot() noexcept\r
     {\r
-        return parent == nullptr ? *this : parent->getRoot();\r
+        return parent == nullptr ? this : parent->getRoot();\r
     }\r
 \r
     template <typename Function>\r
@@ -72,7 +72,7 @@ public:
 \r
         if (numListeners == 1)\r
         {\r
-            valueTreesWithListeners.getUnchecked (0)->listeners.callExcluding (listenerToExclude, fn);\r
+            valueTreesWithListeners.getUnchecked(0)->listeners.callExcluding (listenerToExclude, fn);\r
         }\r
         else if (numListeners > 0)\r
         {\r
@@ -80,7 +80,7 @@ public:
 \r
             for (int i = 0; i < numListeners; ++i)\r
             {\r
-                auto* v = listenersCopy.getUnchecked (i);\r
+                auto* v = listenersCopy.getUnchecked(i);\r
 \r
                 if (i == 0 || valueTreesWithListeners.contains (v))\r
                     v->listeners.callExcluding (listenerToExclude, fn);\r
@@ -97,33 +97,33 @@ public:
 \r
     void sendPropertyChangeMessage (const Identifier& property, ValueTree::Listener* listenerToExclude = nullptr)\r
     {\r
-        ValueTree tree (*this);\r
+        ValueTree tree (this);\r
         callListenersForAllParents (listenerToExclude, [&] (Listener& l) { l.valueTreePropertyChanged (tree, property); });\r
     }\r
 \r
     void sendChildAddedMessage (ValueTree child)\r
     {\r
-        ValueTree tree (*this);\r
+        ValueTree tree (this);\r
         callListenersForAllParents (nullptr, [&] (Listener& l) { l.valueTreeChildAdded (tree, child); });\r
     }\r
 \r
     void sendChildRemovedMessage (ValueTree child, int index)\r
     {\r
-        ValueTree tree (*this);\r
+        ValueTree tree (this);\r
         callListenersForAllParents (nullptr, [=, &tree, &child] (Listener& l) { l.valueTreeChildRemoved (tree, child, index); });\r
     }\r
 \r
     void sendChildOrderChangedMessage (int oldIndex, int newIndex)\r
     {\r
-        ValueTree tree (*this);\r
+        ValueTree tree (this);\r
         callListenersForAllParents (nullptr, [=, &tree] (Listener& l) { l.valueTreeChildOrderChanged (tree, oldIndex, newIndex); });\r
     }\r
 \r
     void sendParentChangeMessage()\r
     {\r
-        ValueTree tree (*this);\r
+        ValueTree tree (this);\r
 \r
-        for (auto j = children.size(); --j >= 0;)\r
+        for (int j = children.size(); --j >= 0;)\r
             if (auto* child = children.getObjectPointer (j))\r
                 child->sendParentChangeMessage();\r
 \r
@@ -143,12 +143,12 @@ public:
             if (auto* existingValue = properties.getVarPointer (name))\r
             {\r
                 if (*existingValue != newValue)\r
-                    undoManager->perform (new SetPropertyAction (*this, name, newValue, *existingValue,\r
+                    undoManager->perform (new SetPropertyAction (this, name, newValue, *existingValue,\r
                                                                  false, false, listenerToExclude));\r
             }\r
             else\r
             {\r
-                undoManager->perform (new SetPropertyAction (*this, name, newValue, {},\r
+                undoManager->perform (new SetPropertyAction (this, name, newValue, {},\r
                                                              true, false, listenerToExclude));\r
             }\r
         }\r
@@ -169,7 +169,7 @@ public:
         else\r
         {\r
             if (properties.contains (name))\r
-                undoManager->perform (new SetPropertyAction (*this, name, {}, properties[name], false, true));\r
+                undoManager->perform (new SetPropertyAction (this, name, {}, properties [name], false, true));\r
         }\r
     }\r
 \r
@@ -186,27 +186,27 @@ public:
         }\r
         else\r
         {\r
-            for (auto i = properties.size(); --i >= 0;)\r
-                undoManager->perform (new SetPropertyAction (*this, properties.getName (i), {},\r
-                                                             properties.getValueAt (i), false, true));\r
+            for (int i = properties.size(); --i >= 0;)\r
+                undoManager->perform (new SetPropertyAction (this, properties.getName(i), {},\r
+                                                             properties.getValueAt(i), false, true));\r
         }\r
     }\r
 \r
     void copyPropertiesFrom (const SharedObject& source, UndoManager* undoManager)\r
     {\r
-        for (auto i = properties.size(); --i >= 0;)\r
+        for (int i = properties.size(); --i >= 0;)\r
             if (! source.properties.contains (properties.getName (i)))\r
                 removeProperty (properties.getName (i), undoManager);\r
 \r
         for (int i = 0; i < source.properties.size(); ++i)\r
-            setProperty (source.properties.getName (i), source.properties.getValueAt (i), undoManager);\r
+            setProperty (source.properties.getName(i), source.properties.getValueAt(i), undoManager);\r
     }\r
 \r
     ValueTree getChildWithName (const Identifier& typeToMatch) const\r
     {\r
         for (auto* s : children)\r
             if (s->type == typeToMatch)\r
-                return ValueTree (*s);\r
+                return ValueTree (s);\r
 \r
         return {};\r
     }\r
@@ -215,18 +215,18 @@ public:
     {\r
         for (auto* s : children)\r
             if (s->type == typeToMatch)\r
-                return ValueTree (*s);\r
+                return ValueTree (s);\r
 \r
         auto newObject = new SharedObject (typeToMatch);\r
         addChild (newObject, -1, undoManager);\r
-        return ValueTree (*newObject);\r
+        return ValueTree (newObject);\r
     }\r
 \r
     ValueTree getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const\r
     {\r
         for (auto* s : children)\r
             if (s->properties[propertyName] == propertyValue)\r
-                return ValueTree (*s);\r
+                return ValueTree (s);\r
 \r
         return {};\r
     }\r
@@ -266,7 +266,7 @@ public:
                 {\r
                     children.insert (index, child);\r
                     child->parent = this;\r
-                    sendChildAddedMessage (ValueTree (*child));\r
+                    sendChildAddedMessage (ValueTree (child));\r
                     child->sendParentChangeMessage();\r
                 }\r
                 else\r
@@ -274,7 +274,7 @@ public:
                     if (! isPositiveAndBelow (index, children.size()))\r
                         index = children.size();\r
 \r
-                    undoManager->perform (new AddOrRemoveChildAction (*this, index, child));\r
+                    undoManager->perform (new AddOrRemoveChildAction (this, index, child));\r
                 }\r
             }\r
             else\r
@@ -288,7 +288,7 @@ public:
 \r
     void removeChild (int childIndex, UndoManager* undoManager)\r
     {\r
-        if (auto child = Ptr (children.getObjectPointer (childIndex)))\r
+        if (Ptr child = children.getObjectPointer (childIndex))\r
         {\r
             if (undoManager == nullptr)\r
             {\r
@@ -299,7 +299,7 @@ public:
             }\r
             else\r
             {\r
-                undoManager->perform (new AddOrRemoveChildAction (*this, childIndex, {}));\r
+                undoManager->perform (new AddOrRemoveChildAction (this, childIndex, nullptr));\r
             }\r
         }\r
     }\r
@@ -328,7 +328,7 @@ public:
                 if (! isPositiveAndBelow (newIndex, children.size()))\r
                     newIndex = children.size() - 1;\r
 \r
-                undoManager->perform (new MoveChildAction (*this, currentIndex, newIndex));\r
+                undoManager->perform (new MoveChildAction (this, currentIndex, newIndex));\r
             }\r
         }\r
     }\r
@@ -339,7 +339,7 @@ public:
 \r
         for (int i = 0; i < children.size(); ++i)\r
         {\r
-            auto* child = newOrder.getUnchecked (i)->object.get();\r
+            auto* child = newOrder.getUnchecked(i)->object.get();\r
 \r
             if (children.getObjectPointerUnchecked (i) != child)\r
             {\r
@@ -359,7 +359,7 @@ public:
             return false;\r
 \r
         for (int i = 0; i < children.size(); ++i)\r
-            if (! children.getObjectPointerUnchecked (i)->isEquivalentTo (*other.children.getObjectPointerUnchecked (i)))\r
+            if (! children.getObjectPointerUnchecked(i)->isEquivalentTo (*other.children.getObjectPointerUnchecked(i)))\r
                 return false;\r
 \r
         return true;\r
@@ -367,12 +367,12 @@ public:
 \r
     XmlElement* createXml() const\r
     {\r
-        auto* xml = new XmlElement (type);\r
+        auto xml = new XmlElement (type);\r
         properties.copyToXmlAttributes (*xml);\r
 \r
         // (NB: it's faster to add nodes to XML elements in reverse order)\r
-        for (auto i = children.size(); --i >= 0;)\r
-            xml->prependChildElement (children.getObjectPointerUnchecked (i)->createXml());\r
+        for (int i = children.size(); --i >= 0;)\r
+            xml->prependChildElement (children.getObjectPointerUnchecked(i)->createXml());\r
 \r
         return xml;\r
     }\r
@@ -385,13 +385,13 @@ public:
         for (int j = 0; j < properties.size(); ++j)\r
         {\r
             output.writeString (properties.getName (j).toString());\r
-            properties.getValueAt (j).writeToStream (output);\r
+            properties.getValueAt(j).writeToStream (output);\r
         }\r
 \r
         output.writeCompressedInt (children.size());\r
 \r
-        for (auto* c : children)\r
-            writeObjectToStream (output, c);\r
+        for (int i = 0; i < children.size(); ++i)\r
+            writeObjectToStream (output, children.getObjectPointerUnchecked(i));\r
     }\r
 \r
     static void writeObjectToStream (OutputStream& output, const SharedObject* object)\r
@@ -411,11 +411,10 @@ public:
     //==============================================================================\r
     struct SetPropertyAction  : public UndoableAction\r
     {\r
-        SetPropertyAction (Ptr targetObject, const Identifier& propertyName,\r
+        SetPropertyAction (SharedObject* so, const Identifier& propertyName,\r
                            const var& newVal, const var& oldVal, bool isAdding, bool isDeleting,\r
                            ValueTree::Listener* listenerToExclude = nullptr)\r
-            : target (static_cast<Ptr&&> (targetObject)),\r
-              name (propertyName), newValue (newVal), oldValue (oldVal),\r
+            : target (so), name (propertyName), newValue (newVal), oldValue (oldVal),\r
               isAddingNewProperty (isAdding), isDeletingProperty (isDeleting),\r
               excludeListener (listenerToExclude)\r
         {\r
@@ -455,7 +454,7 @@ public:
                 if (auto* next = dynamic_cast<SetPropertyAction*> (nextAction))\r
                     if (next->target == target && next->name == name\r
                           && ! (next->isAddingNewProperty || next->isDeletingProperty))\r
-                        return new SetPropertyAction (*target, name, next->newValue, oldValue, false, false);\r
+                        return new SetPropertyAction (target, name, next->newValue, oldValue, false, false);\r
             }\r
 \r
             return nullptr;\r
@@ -475,9 +474,9 @@ public:
     //==============================================================================\r
     struct AddOrRemoveChildAction  : public UndoableAction\r
     {\r
-        AddOrRemoveChildAction (Ptr parentObject, int index, SharedObject* newChild)\r
-            : target (static_cast<Ptr&&> (parentObject)),\r
-              child (newChild != nullptr ? newChild : target->children.getObjectPointer (index)),\r
+        AddOrRemoveChildAction (SharedObject* parentObject, int index, SharedObject* newChild)\r
+            : target (parentObject),\r
+              child (newChild != nullptr ? newChild : parentObject->children.getObjectPointer (index)),\r
               childIndex (index),\r
               isDeleting (newChild == nullptr)\r
         {\r
@@ -489,7 +488,7 @@ public:
             if (isDeleting)\r
                 target->removeChild (childIndex, nullptr);\r
             else\r
-                target->addChild (child.get(), childIndex, nullptr);\r
+                target->addChild (child, childIndex, nullptr);\r
 \r
             return true;\r
         }\r
@@ -498,7 +497,7 @@ public:
         {\r
             if (isDeleting)\r
             {\r
-                target->addChild (child.get(), childIndex, nullptr);\r
+                target->addChild (child, childIndex, nullptr);\r
             }\r
             else\r
             {\r
@@ -527,8 +526,8 @@ public:
     //==============================================================================\r
     struct MoveChildAction  : public UndoableAction\r
     {\r
-        MoveChildAction (Ptr parentObject, int fromIndex, int toIndex) noexcept\r
-            : parent (static_cast<Ptr&&> (parentObject)), startIndex (fromIndex), endIndex (toIndex)\r
+        MoveChildAction (SharedObject* parentObject, int fromIndex, int toIndex) noexcept\r
+            : parent (parentObject), startIndex (fromIndex), endIndex (toIndex)\r
         {\r
         }\r
 \r
@@ -580,7 +579,7 @@ ValueTree::ValueTree() noexcept
 {\r
 }\r
 \r
-JUCE_DECLARE_DEPRECATED_STATIC (const ValueTree ValueTree::invalid;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const ValueTree ValueTree::invalid);\r
 \r
 ValueTree::ValueTree (const Identifier& type)  : object (new ValueTree::SharedObject (type))\r
 {\r
@@ -588,18 +587,20 @@ ValueTree::ValueTree (const Identifier& type)  : object (new ValueTree::SharedOb
 }\r
 \r
 ValueTree::ValueTree (const Identifier& type,\r
-                      std::initializer_list<NamedValueSet::NamedValue> properties,\r
+                      std::initializer_list<std::pair<Identifier, var>> properties,\r
                       std::initializer_list<ValueTree> subTrees)\r
     : ValueTree (type)\r
 {\r
-    object->properties = NamedValueSet (std::move (properties));\r
+    for (auto& prop : properties)\r
+        setProperty (prop.first, prop.second, nullptr);\r
 \r
     for (auto& tree : subTrees)\r
         addChild (tree, -1, nullptr);\r
 }\r
 \r
-ValueTree::ValueTree (SharedObject::Ptr so) noexcept  : object (static_cast<SharedObject::Ptr&&> (so)) {}\r
-ValueTree::ValueTree (SharedObject& so) noexcept      : object (so) {}\r
+ValueTree::ValueTree (SharedObject* so) noexcept  : object (so)\r
+{\r
+}\r
 \r
 ValueTree::ValueTree (const ValueTree& other) noexcept  : object (other.object)\r
 {\r
@@ -662,32 +663,7 @@ bool ValueTree::isEquivalentTo (const ValueTree& other) const
 \r
 ValueTree ValueTree::createCopy() const\r
 {\r
-    if (object != nullptr)\r
-        return ValueTree (*new SharedObject (*object));\r
-\r
-    return {};\r
-}\r
-\r
-void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager)\r
-{\r
-    jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail!\r
-\r
-    if (source.object == nullptr)\r
-        removeAllProperties (undoManager);\r
-    else if (object != nullptr)\r
-        object->copyPropertiesFrom (*(source.object), undoManager);\r
-}\r
-\r
-void ValueTree::copyPropertiesAndChildrenFrom (const ValueTree& source, UndoManager* undoManager)\r
-{\r
-    jassert (object != nullptr || source.object == nullptr); // Trying to copy to a null ValueTree will fail!\r
-\r
-    copyPropertiesFrom (source, undoManager);\r
-    removeAllChildren (undoManager);\r
-\r
-    if (object != nullptr && source.object != nullptr)\r
-        for (auto& child : source.object->children)\r
-            object->addChild (createCopyIfNotNull (child), -1, undoManager);\r
+    return ValueTree (createCopyIfNotNull (object.get()));\r
 }\r
 \r
 bool ValueTree::hasType (const Identifier& typeName) const noexcept\r
@@ -702,29 +678,23 @@ Identifier ValueTree::getType() const noexcept
 \r
 ValueTree ValueTree::getParent() const noexcept\r
 {\r
-    if (object != nullptr)\r
-        if (auto p = object->parent)\r
-            return ValueTree (*p);\r
-\r
-    return {};\r
+    return ValueTree (object != nullptr ? object->parent\r
+                                        : static_cast<SharedObject*> (nullptr));\r
 }\r
 \r
 ValueTree ValueTree::getRoot() const noexcept\r
 {\r
-    if (object != nullptr)\r
-        return ValueTree (object->getRoot());\r
-\r
-    return {};\r
+    return ValueTree (object != nullptr ? object->getRoot()\r
+                                        : static_cast<SharedObject*> (nullptr));\r
 }\r
 \r
 ValueTree ValueTree::getSibling (int delta) const noexcept\r
 {\r
-    if (object != nullptr)\r
-        if (auto* p = object->parent)\r
-            if (auto* c = p->children.getObjectPointer (p->indexOf (*this) + delta))\r
-                return ValueTree (*c);\r
+    if (object == nullptr || object->parent == nullptr)\r
+        return {};\r
 \r
-    return {};\r
+    auto index = object->parent->indexOf (*this) + delta;\r
+    return ValueTree (object->parent->children.getObjectPointer (index));\r
 }\r
 \r
 static const var& getNullVarRef() noexcept\r
@@ -800,6 +770,16 @@ Identifier ValueTree::getPropertyName (int index) const noexcept
                              : object->properties.getName (index);\r
 }\r
 \r
+void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager)\r
+{\r
+    jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail!\r
+\r
+    if (source.object == nullptr)\r
+        removeAllProperties (undoManager);\r
+    else if (object != nullptr)\r
+        object->copyPropertiesFrom (*(source.object), undoManager);\r
+}\r
+\r
 int ValueTree::getReferenceCount() const noexcept\r
 {\r
     return object != nullptr ? object->getReferenceCount() : 0;\r
@@ -820,7 +800,7 @@ struct ValueTreePropertyValueSource  : public Value::ValueSource,
         tree.removeListener (this);\r
     }\r
 \r
-    var getValue() const override                 { return tree[property]; }\r
+    var getValue() const override                 { return tree [property]; }\r
     void setValue (const var& newValue) override  { tree.setProperty (property, newValue, undoManager); }\r
 \r
 private:\r
@@ -856,30 +836,29 @@ int ValueTree::getNumChildren() const noexcept
 \r
 ValueTree ValueTree::getChild (int index) const\r
 {\r
-    if (object != nullptr)\r
-        if (auto* c = object->children.getObjectPointer (index))\r
-            return ValueTree (*c);\r
-\r
-    return {};\r
+    return ValueTree (object != nullptr ? object->children.getObjectPointer (index)\r
+                                        : static_cast<SharedObject*> (nullptr));\r
 }\r
 \r
-ValueTree::Iterator::Iterator (const ValueTree& v, bool isEnd)\r
+ValueTree::Iterator::Iterator (const ValueTree& v, bool isEnd) noexcept\r
    : internal (v.object != nullptr ? (isEnd ? v.object->children.end() : v.object->children.begin()) : nullptr)\r
 {\r
 }\r
 \r
-ValueTree::Iterator& ValueTree::Iterator::operator++()\r
+ValueTree::Iterator& ValueTree::Iterator::operator++() noexcept\r
 {\r
     internal = static_cast<SharedObject**> (internal) + 1;\r
     return *this;\r
 }\r
 \r
-bool ValueTree::Iterator::operator== (const Iterator& other) const  { return internal == other.internal; }\r
-bool ValueTree::Iterator::operator!= (const Iterator& other) const  { return internal != other.internal; }\r
+bool ValueTree::Iterator::operator!= (const Iterator& other) const noexcept\r
+{\r
+    return internal != other.internal;\r
+}\r
 \r
 ValueTree ValueTree::Iterator::operator*() const\r
 {\r
-    return ValueTree (SharedObject::Ptr (*static_cast<SharedObject**> (internal)));\r
+    return ValueTree (*static_cast<SharedObject**> (internal));\r
 }\r
 \r
 ValueTree::Iterator ValueTree::begin() const noexcept   { return Iterator (*this, false); }\r
@@ -902,7 +881,7 @@ ValueTree ValueTree::getChildWithProperty (const Identifier& propertyName, const
 \r
 bool ValueTree::isAChildOf (const ValueTree& possibleParent) const noexcept\r
 {\r
-    return object != nullptr && object->isAChildOf (possibleParent.object.get());\r
+    return object != nullptr && object->isAChildOf (possibleParent.object);\r
 }\r
 \r
 int ValueTree::indexOf (const ValueTree& child) const noexcept\r
@@ -915,7 +894,7 @@ void ValueTree::addChild (const ValueTree& child, int index, UndoManager* undoMa
     jassert (object != nullptr); // Trying to add a child to a null ValueTree!\r
 \r
     if (object != nullptr)\r
-        object->addChild (child.object.get(), index, undoManager);\r
+        object->addChild (child.object, index, undoManager);\r
 }\r
 \r
 void ValueTree::appendChild (const ValueTree& child, UndoManager* undoManager)\r
@@ -953,10 +932,7 @@ void ValueTree::createListOfChildren (OwnedArray<ValueTree>& list) const
     jassert (object != nullptr);\r
 \r
     for (auto* o : object->children)\r
-    {\r
-        jassert (o != nullptr);\r
-        list.add (new ValueTree (*o));\r
-    }\r
+        list.add (new ValueTree (o));\r
 }\r
 \r
 void ValueTree::reorderChildren (const OwnedArray<ValueTree>& newOrder, UndoManager* undoManager)\r
@@ -1028,7 +1004,7 @@ String ValueTree::toXmlString() const
 //==============================================================================\r
 void ValueTree::writeToStream (OutputStream& output) const\r
 {\r
-    SharedObject::writeObjectToStream (output, object.get());\r
+    SharedObject::writeObjectToStream (output, object);\r
 }\r
 \r
 ValueTree ValueTree::readFromStream (InputStream& input)\r
@@ -1069,7 +1045,7 @@ ValueTree ValueTree::readFromStream (InputStream& input)
             return v;\r
 \r
         v.object->children.add (child.object);\r
-        child.object->parent = v.object.get();\r
+        child.object->parent = v.object;\r
     }\r
 \r
     return v;\r
@@ -1104,7 +1080,7 @@ public:
         const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:";\r
 \r
         for (int i = 1 + r.nextInt (numElementsInArray (buffer) - 2); --i >= 0;)\r
-            buffer[i] = chars[r.nextInt (sizeof (chars) - 1)];\r
+            buffer[i] = chars [r.nextInt (sizeof (chars) - 1)];\r
 \r
         String result (buffer);\r
 \r
index 601bda2635e5bd5ba8f6b9756d7e08976e027bf7..b1cffbdae88ca7db80db50e8799e333f3c6b17d2 100644 (file)
@@ -128,23 +128,18 @@ public:
         @endverbatim\r
     */\r
     ValueTree (const Identifier& type,\r
-               std::initializer_list<NamedValueSet::NamedValue> properties,\r
+               std::initializer_list<std::pair<Identifier, var>> properties,\r
                std::initializer_list<ValueTree> subTrees = {});\r
 \r
     /** Creates a reference to another ValueTree. */\r
     ValueTree (const ValueTree&) noexcept;\r
 \r
+    /** Changes this object to be a reference to the given tree. */\r
+    ValueTree& operator= (const ValueTree&);\r
+\r
     /** Move constructor */\r
     ValueTree (ValueTree&&) noexcept;\r
 \r
-    /** Changes this object to be a reference to the given tree.\r
-        Note that calling this just points this at the new object and invokes the\r
-        Listener::valueTreeRedirected callback, but it's not an undoable operation. If\r
-        you're trying to replace an entire tree in an undoable way, you probably want\r
-        to use copyPropertiesAndChildrenFrom() instead.\r
-    */\r
-    ValueTree& operator= (const ValueTree&);\r
-\r
     /** Destructor. */\r
     ~ValueTree();\r
 \r
@@ -177,19 +172,6 @@ public:
     /** Returns a deep copy of this tree and all its sub-trees. */\r
     ValueTree createCopy() const;\r
 \r
-    /** Overwrites all the properties in this tree with the properties of the source tree.\r
-        Any properties that already exist will be updated; and new ones will be added, and\r
-        any that are not present in the source tree will be removed.\r
-        @see copyPropertiesAndChildrenFrom\r
-    */\r
-    void copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager);\r
-\r
-    /** Replaces all children and properties of this object with copies of those from\r
-        the source object.\r
-        @see copyPropertiesFrom\r
-    */\r
-    void copyPropertiesAndChildrenFrom (const ValueTree& source, UndoManager* undoManager);\r
-\r
     //==============================================================================\r
     /** Returns the type of this tree.\r
         The type is specified when the ValueTree is created.\r
@@ -279,6 +261,12 @@ public:
     Value getPropertyAsValue (const Identifier& name, UndoManager* undoManager,\r
                               bool shouldUpdateSynchronously = false);\r
 \r
+    /** Overwrites all the properties in this tree with the properties of the source tree.\r
+        Any properties that already exist will be updated; and new ones will be added, and\r
+        any that are not present in the source tree will be removed.\r
+    */\r
+    void copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager);\r
+\r
     //==============================================================================\r
     /** Returns the number of child trees inside this one.\r
         @see getChild\r
@@ -400,11 +388,10 @@ public:
     */\r
     struct Iterator\r
     {\r
-        Iterator (const ValueTree&, bool isEnd);\r
-        Iterator& operator++();\r
+        Iterator (const ValueTree&, bool isEnd) noexcept;\r
+        Iterator& operator++() noexcept;\r
 \r
-        bool operator== (const Iterator&) const;\r
-        bool operator!= (const Iterator&) const;\r
+        bool operator!= (const Iterator&) const noexcept;\r
         ValueTree operator*() const;\r
 \r
         using difference_type    = std::ptrdiff_t;\r
@@ -605,7 +592,7 @@ public:
     /* An invalid ValueTree that can be used if you need to return one as an error condition, etc.\r
         @deprecated If you need an empty ValueTree object, just use ValueTree() or {}.\r
     */\r
-    JUCE_DEPRECATED_STATIC (static const ValueTree invalid;)\r
+    JUCE_DEPRECATED_STATIC (static const ValueTree invalid);\r
 \r
 private:\r
     //==============================================================================\r
@@ -633,8 +620,7 @@ private:
     void createListOfChildren (OwnedArray<ValueTree>&) const;\r
     void reorderChildren (const OwnedArray<ValueTree>&, UndoManager*);\r
 \r
-    explicit ValueTree (ReferenceCountedObjectPtr<SharedObject>) noexcept;\r
-    explicit ValueTree (SharedObject&) noexcept;\r
+    explicit ValueTree (SharedObject*) noexcept;\r
 };\r
 \r
 } // namespace juce\r
index d30dfc039e851d3f3cef7df182998b0a13959627..211473ee783d22b6cf3ea8d927a2a9a1c0ab64bd 100644 (file)
@@ -209,7 +209,6 @@ private:
         jassert (delimiter.isNotEmpty());\r
 \r
         StringArray elements;\r
-\r
         for (auto& v : input)\r
             elements.add (v.toString());\r
 \r
index 081b16b157d0982a1f238439a31972d5771e4f6c..36d710daa8cf11a3ffd5f01c9a49b6790e034f50 100644 (file)
@@ -275,7 +275,7 @@ public:
         auto maxChannels = jmin (static_cast<size_t> (src.getNumChannels()), static_cast<size_t> (numChannels));\r
 \r
         for (size_t ch = 0; ch < maxChannels; ++ch)\r
-            FloatVectorOperations::copy (channelPtr (ch) + dstPos,\r
+            FloatVectorOperations::copy (channelPtr (ch),\r
                                          src.getReadPointer (static_cast<int> (ch),\r
                                                              static_cast<int> (srcPos * sizeFactor)),\r
                                          n);\r
@@ -299,7 +299,7 @@ public:
         for (size_t ch = 0; ch < maxChannels; ++ch)\r
             FloatVectorOperations::copy (dst.getWritePointer (static_cast<int> (ch),\r
                                                               static_cast<int> (dstPos * sizeFactor)),\r
-                                         channelPtr (ch) + srcPos, n);\r
+                                         channelPtr (ch), n);\r
 \r
         return *this;\r
     }\r
@@ -327,7 +327,7 @@ public:
         pointed to by the receiver remains valid through-out the life-time of the\r
         returned sub-block.\r
 \r
-        @param newOffset   The index of an element inside the receiver which will\r
+        @param newOffset   The index of an element inside the reciever which will\r
                            will become the first element of the return value.\r
         @param newLength   The number of elements of the newly created sub-block.\r
     */\r
@@ -344,7 +344,7 @@ public:
         pointed to by the receiver remains valid through-out the life-time of the\r
         returned sub-block.\r
 \r
-        @param newOffset   The index of an element inside the receiver which will\r
+        @param newOffset   The index of an element inside the reciever which will\r
                            will become the first element of the return value.\r
                            The return value will include all subsequent elements\r
                            of the receiver.\r
@@ -513,7 +513,7 @@ public:
 \r
         if (! value.isSmoothing())\r
         {\r
-            multiply (src, value.getTargetValue());\r
+            copy (src);\r
         }\r
         else\r
         {\r
index be268b52202f9fb2fff60df537fdaafcd9b6bbf8..23d7d5dc7c5e18120ee082d71b0b1e65a7c94107 100644 (file)
@@ -39,7 +39,7 @@ namespace dsp
 /**\r
     A wrapper around the platform's native SIMD register type.\r
 \r
-    This class is only available on SIMD machines. Use JUCE_USE_SIMD to query\r
+    This class is only availabe on SIMD machines. Use JUCE_USE_SIMD to query\r
     if SIMD is avaialble for your system.\r
 \r
     SIMDRegister<Type> is a templated class representing the native\r
index d348c6e1a01db96ae2b60b4cd57bfb0e553276d2..0774b1a950876dd2df5fa30da86a5a29e6028db1 100644 (file)
@@ -54,7 +54,7 @@ private:
 template <typename Scalar>\r
 struct CmplxSIMDOps\r
 {\r
-    using vSIMDType = typename SIMDNativeOps<Scalar>::vSIMDType;\r
+    typedef typename SIMDNativeOps<Scalar>::vSIMDType vSIMDType;\r
 \r
     static inline vSIMDType JUCE_VECTOR_CALLTYPE load (const Scalar* a) noexcept\r
     {\r
@@ -101,7 +101,7 @@ struct CmplxSIMDOps
 template <typename Scalar>\r
 struct CmplxSIMDOps<std::complex<Scalar>>\r
 {\r
-    using vSIMDType = typename SIMDNativeOps<Scalar>::vSIMDType;\r
+    typedef typename SIMDNativeOps<Scalar>::vSIMDType vSIMDType;\r
 \r
     static inline vSIMDType JUCE_VECTOR_CALLTYPE load (const std::complex<Scalar>* a) noexcept\r
     {\r
index 861a91f032371d8419447a1499977c93f3813f17..8213aa3439ca4391ac0845cb952569f24779b1cb 100644 (file)
@@ -131,7 +131,7 @@ namespace SIMDRegister_test_internal
 }\r
 \r
 // These tests need to be strictly run on all platforms supported by JUCE as the\r
-// SIMD code is highly platform dependent.\r
+// SIMD code is highly platform dependant.\r
 \r
 class SIMDRegisterUnitTests   : public UnitTest\r
 {\r
index e250f53402db37212ddc8a66808b836f8477ef38..19d5fcbf5bfa7be2c1d66a205f42dffc94e89982 100644 (file)
@@ -60,7 +60,7 @@ typename FIR::Coefficients<FloatType>::Ptr
     WindowingFunction<FloatType> theWindow (order + 1, type, false, beta);\r
     theWindow.multiplyWithWindowingTable (c, order + 1);\r
 \r
-    return *result;\r
+    return result;\r
 }\r
 \r
 template <typename FloatType>\r
@@ -108,7 +108,7 @@ typename FIR::Coefficients<FloatType>::Ptr
 \r
     for (size_t i = 0; i <= order; ++i)\r
     {\r
-        if (i == order / 2 && order % 2 == 0)\r
+        if (i == order / 2)\r
         {\r
             c[i] = static_cast<FloatType> (2 * normalizedFrequency);\r
         }\r
@@ -121,7 +121,7 @@ typename FIR::Coefficients<FloatType>::Ptr
         }\r
     }\r
 \r
-    return *result;\r
+    return result;\r
 }\r
 \r
 template <typename FloatType>\r
@@ -231,7 +231,7 @@ typename FIR::Coefficients<FloatType>::Ptr
         }\r
     }\r
 \r
-    return *result;\r
+    return result;\r
 }\r
 \r
 template <typename FloatType>\r
@@ -290,7 +290,7 @@ typename FIR::Coefficients<FloatType>::Ptr
 \r
     c[2 * n + 1] = static_cast<FloatType> (0.5);\r
 \r
-    return *result;\r
+    return result;\r
 }\r
 \r
 template <typename FloatType>\r
@@ -337,7 +337,7 @@ Array<double> FilterDesign<FloatType>::getPartialImpulseResponseHn (int n, doubl
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
                                                                          FloatType normalizedTransitionWidth,\r
                                                                          FloatType passbandAttenuationdB,\r
@@ -348,7 +348,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRLowpassHighOrderChebyshev1Method (FloatType frequency, double sampleRate,\r
                                                                         FloatType normalizedTransitionWidth,\r
                                                                         FloatType passbandAttenuationdB,\r
@@ -359,7 +359,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRLowpassHighOrderChebyshev2Method (FloatType frequency, double sampleRate,\r
                                                                         FloatType normalizedTransitionWidth,\r
                                                                         FloatType passbandAttenuationdB,\r
@@ -370,7 +370,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRLowpassHighOrderEllipticMethod (FloatType frequency, double sampleRate,\r
                                                                       FloatType normalizedTransitionWidth,\r
                                                                       FloatType passbandAttenuationdB,\r
@@ -381,7 +381,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRLowpassHighOrderGeneralMethod (int type, FloatType frequency, double sampleRate,\r
                                                                      FloatType normalizedTransitionWidth,\r
                                                                      FloatType passbandAttenuationdB,\r
@@ -510,7 +510,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
         g.add ((1.0 - p[i + r]) / (1.0 - z[i]));\r
     }\r
 \r
-    ReferenceCountedArray<IIR::Coefficients<FloatType>> cascadedCoefficients;\r
+    Array<IIR::Coefficients<FloatType>> cascadedCoefficients;\r
 \r
     if (r == 1)\r
     {\r
@@ -518,7 +518,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
         auto b1 = b0;\r
         auto a1 = static_cast<FloatType> (-std::real (p[0]));\r
 \r
-        cascadedCoefficients.add (new IIR::Coefficients<FloatType> (b0, b1, 1.0f, a1));\r
+        cascadedCoefficients.add ({ b0, b1, 1.0f, a1 });\r
     }\r
 \r
     for (int i = 0; i < L; ++i)\r
@@ -532,14 +532,14 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
         auto a1 = static_cast<FloatType> (std::real (-p[i+r] - std::conj (p[i + r])));\r
         auto a2 = static_cast<FloatType> (std::real ( p[i+r] * std::conj (p[i + r])));\r
 \r
-        cascadedCoefficients.add (new IIR::Coefficients<FloatType> (b0, b1, b2, 1, a1, a2));\r
+        cascadedCoefficients.add ({ b0, b1, b2, 1, a1, a2 });\r
     }\r
 \r
     return cascadedCoefficients;\r
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRLowpassHighOrderButterworthMethod (FloatType frequency,\r
                                                                          double sampleRate, int order)\r
 {\r
@@ -547,7 +547,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
     jassert (frequency > 0 && frequency <= sampleRate * 0.5);\r
     jassert (order > 0);\r
 \r
-    ReferenceCountedArray<IIR::Coefficients<FloatType>> arrayFilters;\r
+    Array<IIR::Coefficients<FloatType>> arrayFilters;\r
 \r
     if (order % 2 == 1)\r
     {\r
@@ -574,7 +574,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
 }\r
 \r
 template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
     FilterDesign<FloatType>::designIIRHighpassHighOrderButterworthMethod (FloatType frequency,\r
                                                                           double sampleRate, int order)\r
 {\r
@@ -582,7 +582,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
     jassert (frequency > 0 && frequency <= sampleRate * 0.5);\r
     jassert (order > 0);\r
 \r
-    ReferenceCountedArray<IIR::Coefficients<FloatType>> arrayFilters;\r
+    Array<IIR::Coefficients<FloatType>> arrayFilters;\r
 \r
     if (order % 2 == 1)\r
     {\r
@@ -678,16 +678,14 @@ typename FilterDesign<FloatType>::IIRPolyphaseAllpassStructure
     IIRPolyphaseAllpassStructure structure;\r
 \r
     for (int i = 0; i < N; i += 2)\r
-        structure.directPath.add (new IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
-                                                                    0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
+        structure.directPath.add (IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
+                                                                0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
 \r
-    structure.delayedPath.add (new IIR::Coefficients<FloatType> (0, 1, 1, 0));\r
+    structure.delayedPath.add (IIR::Coefficients<FloatType> (0, 1, 1, 0));\r
 \r
     for (int i = 1; i < N; i += 2)\r
-        structure.delayedPath.add (new IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
-                                                                     0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
-\r
-    structure.alpha.addArray (ai);\r
+        structure.delayedPath.add (IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
+                                                                 0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
 \r
     return structure;\r
 }\r
old mode 100644 (file)
new mode 100755 (executable)
index e94c5b5..9b00d3e
@@ -55,7 +55,7 @@ struct FilterDesign
 \r
         It generates linear phase filters coefficients.\r
 \r
-        Note: The flatTop WindowingMethod generates an impulse response with a\r
+        Note : the flatTop WindowingMethod generates an impulse response with a\r
         maximum amplitude higher than one, and might be normalized if necessary\r
         depending on the applications.\r
 \r
@@ -158,10 +158,10 @@ struct FilterDesign
         @param stopbandAttenuationdB        the attenuation in dB expected in the stop band\r
     */\r
 \r
-    static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
-                                                                                              FloatType normalizedTransitionWidth,\r
-                                                                                              FloatType passbandAttenuationdB,\r
-                                                                                              FloatType stopbandAttenuationdB);\r
+    static Array<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
+                                                                              FloatType normalizedTransitionWidth,\r
+                                                                              FloatType passbandAttenuationdB,\r
+                                                                              FloatType stopbandAttenuationdB);\r
 \r
     //==============================================================================\r
     /** This method returns an array of IIR::Coefficients, made to be used in\r
@@ -174,8 +174,8 @@ struct FilterDesign
                                             an attenuation of -6 dB times order / octave\r
     */\r
 \r
-    static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
-                                                                                              int order);\r
+    static Array<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
+                                                                              int order);\r
 \r
     /** This method returns an array of IIR::Coefficients, made to be used in\r
         cascaded IIRFilters, providing a minimum phase high-pass filter without any\r
@@ -187,8 +187,8 @@ struct FilterDesign
                                             an attenuation of -6 dB times order / octave\r
     */\r
 \r
-    static ReferenceCountedArray<IIRCoefficients> designIIRHighpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
-                                                                                               int order);\r
+    static Array<IIRCoefficients> designIIRHighpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
+                                                                               int order);\r
 \r
     /** This method returns an array of IIR::Coefficients, made to be used in\r
         cascaded IIRFilters, providing a minimum phase low-pass filter without any\r
@@ -204,10 +204,10 @@ struct FilterDesign
         @param passbandAttenuationdB        the lowest attenuation in dB expected in the pass band\r
         @param stopbandAttenuationdB        the attenuation in dB expected in the stop band\r
     */\r
-    static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderChebyshev1Method (FloatType frequency, double sampleRate,\r
-                                                                                             FloatType normalizedTransitionWidth,\r
-                                                                                             FloatType passbandAttenuationdB,\r
-                                                                                             FloatType stopbandAttenuationdB);\r
+    static Array<IIRCoefficients> designIIRLowpassHighOrderChebyshev1Method (FloatType frequency, double sampleRate,\r
+                                                                             FloatType normalizedTransitionWidth,\r
+                                                                             FloatType passbandAttenuationdB,\r
+                                                                             FloatType stopbandAttenuationdB);\r
 \r
     /** This method returns an array of IIR::Coefficients, made to be used in\r
         cascaded IIRFilters, providing a minimum phase low-pass filter without any\r
@@ -223,10 +223,10 @@ struct FilterDesign
         @param passbandAttenuationdB        the lowest attenuation in dB expected in the pass band\r
         @param stopbandAttenuationdB        the attenuation in dB expected in the stop band\r
     */\r
-    static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderChebyshev2Method (FloatType frequency, double sampleRate,\r
-                                                                                             FloatType normalizedTransitionWidth,\r
-                                                                                             FloatType passbandAttenuationdB,\r
-                                                                                             FloatType stopbandAttenuationdB);\r
+    static Array<IIRCoefficients> designIIRLowpassHighOrderChebyshev2Method (FloatType frequency, double sampleRate,\r
+                                                                             FloatType normalizedTransitionWidth,\r
+                                                                             FloatType passbandAttenuationdB,\r
+                                                                             FloatType stopbandAttenuationdB);\r
 \r
     /** This method returns an array of IIR::Coefficients, made to be used in\r
         cascaded IIR::Filters, providing a minimum phase low-pass filter with ripples\r
@@ -242,25 +242,20 @@ struct FilterDesign
         @param passbandAttenuationdB        the lowest attenuation in dB expected in the pass band\r
         @param stopbandAttenuationdB        the attenuation in dB expected in the stop band\r
     */\r
-    static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderEllipticMethod (FloatType frequency, double sampleRate,\r
-                                                                                           FloatType normalizedTransitionWidth,\r
-                                                                                           FloatType passbandAttenuationdB,\r
-                                                                                           FloatType stopbandAttenuationdB);\r
+    static Array<IIRCoefficients> designIIRLowpassHighOrderEllipticMethod (FloatType frequency, double sampleRate,\r
+                                                                           FloatType normalizedTransitionWidth,\r
+                                                                           FloatType passbandAttenuationdB,\r
+                                                                           FloatType stopbandAttenuationdB);\r
 \r
     /** The structure returned by the function designIIRLowpassHalfBandPolyphaseAllpassMethod.\r
 \r
-        The two first members of this structure directPath and delayedPath are arrays of\r
+        The two members of this structure directPath and delayedPath are arrays of\r
         IIR::Coefficients, made of polyphase second order allpass filters and an additional\r
         delay in the second array, that can be used in cascaded filters processed in two\r
         parallel paths, which must be summed at the end to get the high order efficient\r
-        low-pass filtering. The last member is an array with the useful parameters for\r
-        simulating the structure using any custom processing function.\r
+        low-pass filtering.\r
     */\r
-    struct IIRPolyphaseAllpassStructure\r
-    {\r
-        ReferenceCountedArray<IIRCoefficients> directPath, delayedPath;\r
-        Array<double> alpha;\r
-    };\r
+    struct IIRPolyphaseAllpassStructure { Array<IIRCoefficients> directPath, delayedPath; };\r
 \r
     /** This method generates arrays of IIR::Coefficients for a low-pass filter, with\r
         a cutoff frequency at half band, using an algorithm described in the article\r
@@ -289,10 +284,10 @@ private:
     //==============================================================================\r
     static Array<double> getPartialImpulseResponseHn (int n, double kp);\r
 \r
-    static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderGeneralMethod (int type, FloatType frequency, double sampleRate,\r
-                                                                                          FloatType normalizedTransitionWidth,\r
-                                                                                          FloatType passbandAttenuationdB,\r
-                                                                                          FloatType stopbandAttenuationdB);\r
+    static Array<IIRCoefficients> designIIRLowpassHighOrderGeneralMethod (int type, FloatType frequency, double sampleRate,\r
+                                                                          FloatType normalizedTransitionWidth,\r
+                                                                          FloatType passbandAttenuationdB,\r
+                                                                          FloatType stopbandAttenuationdB);\r
     FilterDesign() = delete;\r
 };\r
 \r
index bdbce85bde10185d803b4e66bbaf8077bedae0d6..469985d8951fd289e2e7a58d1e2607cefc015a79 100644 (file)
@@ -104,7 +104,6 @@ struct ConvolutionEngine
 \r
         buffersInputSegments.clear();\r
         buffersImpulseSegments.clear();\r
-        bufferOutput.clear();\r
 \r
         for (size_t i = 0; i < numInputSegments; ++i)\r
         {\r
@@ -378,16 +377,6 @@ struct Convolution::Pimpl  : private Thread
         stopThread (10000);\r
     }\r
 \r
-    //==============================================================================\r
-    /** Inits the size of the interpolation buffer. */\r
-    void initProcessing (int maximumBufferSize)\r
-    {\r
-        stopThread (1000);\r
-\r
-        interpolationBuffer.setSize (1, maximumBufferSize, false, false, true);\r
-        mustInterpolate = false;\r
-    }\r
-\r
     //==============================================================================\r
     /** Adds a new change request. */\r
     void addToFifo (ChangeRequest type, juce::var parameter)\r
@@ -670,6 +659,8 @@ struct Convolution::Pimpl  : private Thread
         // action depending on the change level\r
         if (changeLevel == 3)\r
         {\r
+            interpolationBuffer.setSize (2, static_cast<int> (currentInfo.maximumBufferSize), false, false, true);\r
+\r
             loadImpulseResponse();\r
             processImpulseResponse();\r
             initializeConvolutionEngines();\r
@@ -726,16 +717,16 @@ struct Convolution::Pimpl  : private Thread
             {\r
                 auto&& buffer = output.getSingleChannelBlock (channel);\r
 \r
-                interpolationBuffer.copyFrom (0, 0, input.getChannelPointer (channel), (int) numSamples);\r
+                interpolationBuffer.copyFrom ((int) channel, 0, input.getChannelPointer (channel), (int) numSamples);\r
 \r
                 engines[(int) channel]->processSamples (input.getChannelPointer (channel), buffer.getChannelPointer (0), numSamples);\r
                 changeVolumes[channel].applyGain (buffer.getChannelPointer (0), (int) numSamples);\r
 \r
-                auto* interPtr = interpolationBuffer.getWritePointer (0);\r
+                auto* interPtr = interpolationBuffer.getWritePointer ((int) channel);\r
                 engines[(int) channel + 2]->processSamples (interPtr, interPtr, numSamples);\r
                 changeVolumes[channel + 2].applyGain (interPtr, (int) numSamples);\r
 \r
-                buffer += interpolated;\r
+                buffer += interpolated.getSingleChannelBlock (channel);\r
             }\r
 \r
             if (input.getNumChannels() > 1 && currentInfo.wantsStereo == false)\r
@@ -1163,7 +1154,6 @@ void Convolution::prepare (const ProcessSpec& spec)
                                juce::var (static_cast<int> (spec.maximumBlockSize)) };\r
 \r
     pimpl->addToFifo (types, parameters, 2);\r
-    pimpl->initProcessing (static_cast<int> (spec.maximumBlockSize));\r
 \r
     for (size_t channel = 0; channel < spec.numChannels; ++channel)\r
     {\r
index 45b805f02a4a4fd84c192b47dafd647fb8c94a2c..b5891165d4b84b7246917484caddc262af12b302 100644 (file)
@@ -85,7 +85,7 @@ public:
         formats registered in JUCE, and performs some resampling and pre-processing\r
         as well if needed.\r
 \r
-        Note: Obviously, don't try to use this function on float samples, since the\r
+        Note : obviously, don't try to use this function on float samples, since the\r
         data is supposed to be an audio file in its binary format, and be sure that\r
         the original data is not going to move at all its memory location during the\r
         process !!\r
index 34778f889c3321d7e076a923b06cfa0e9755cb32..2fb5e4c03bfccbdfdae58200ba9be51f2655ca7f 100644 (file)
@@ -641,8 +641,6 @@ struct FFTWImpl  : public FFT::Instance
     FFTWImpl (size_t orderToUse, DynamicLibrary&& libraryToUse, const Symbols& symbols)\r
         : fftwLibrary (std::move (libraryToUse)), fftw (symbols), order (static_cast<size_t> (orderToUse))\r
     {\r
-        ScopedLock lock (getFFTWPlanLock());\r
-\r
         auto n = (1u << order);\r
         HeapBlock<Complex<float>> in (n), out (n);\r
 \r
@@ -655,8 +653,6 @@ struct FFTWImpl  : public FFT::Instance
 \r
     ~FFTWImpl() override\r
     {\r
-        ScopedLock lock (getFFTWPlanLock());\r
-\r
         fftw.destroy_fftw (c2cForward);\r
         fftw.destroy_fftw (c2cInverse);\r
         fftw.destroy_fftw (r2c);\r
@@ -701,15 +697,6 @@ struct FFTWImpl  : public FFT::Instance
         FloatVectorOperations::multiply ((float*) inputOutputData, 1.0f / static_cast<float> (n), (int) n);\r
     }\r
 \r
-    //==============================================================================\r
-    // fftw's plan_* and destroy_* methods are NOT thread safe. So we need to share\r
-    // a lock between all instances of FFTWImpl\r
-    static CriticalSection& getFFTWPlanLock() noexcept\r
-    {\r
-        static CriticalSection cs;\r
-        return cs;\r
-    }\r
-\r
     //==============================================================================\r
     DynamicLibrary fftwLibrary;\r
     Symbols fftw;\r
index 6ac73681d8c1a057de619145bc654f1496b5c84b..f72fd8fc043d7fa5110274c04b19cebc6af26546 100644 (file)
@@ -36,7 +36,7 @@
 \r
   ID:                 juce_dsp\r
   vendor:             juce\r
-  version:            5.4.1\r
+  version:            5.3.2\r
   name:               JUCE DSP classes\r
   description:        Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc.\r
   website:            http://www.juce.com/juce\r
 //==============================================================================\r
 #undef Complex  // apparently some C libraries actually define these symbols (!)\r
 #undef Factor\r
-#undef check\r
 \r
 namespace juce\r
 {\r
index 22f26d95707ca331c4c06b98244db60cfdeda9c6..e3912d8b26398fdbd6d7392e78541082d9339f0f 100644 (file)
@@ -39,7 +39,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function cosh(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -5 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -54,7 +54,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function cosh(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -5 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -67,7 +67,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function sinh(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -5 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -82,7 +82,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function sinh(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -5 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -95,7 +95,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function tanh(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -5 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -110,7 +110,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function tanh(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -5 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -124,7 +124,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function cos(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -pi and +pi for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -139,7 +139,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function cos(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -pi and +pi for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -152,7 +152,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function sin(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -pi and +pi for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -167,7 +167,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function sin(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -pi and +pi for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -180,7 +180,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function tan(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -pi/2 and +pi/2 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -195,7 +195,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function tan(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -pi/2 and +pi/2 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -209,7 +209,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function exp(x) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -6 and +4 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -223,7 +223,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function exp(x) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -6 and +4 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -236,7 +236,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function log(x+1) using a Pade approximant\r
         continued fraction, calculated sample by sample.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -0.8 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
@@ -250,7 +250,7 @@ struct FastMathApproximations
     /** Provides a fast approximation of the function log(x+1) using a Pade approximant\r
         continued fraction, calculated on a whole buffer.\r
 \r
-        Note: This is an approximation which works on a limited range. You are\r
+        Note : this is an approximation which works on a limited range. You are\r
         advised to use input values only between -0.8 and +5 for limiting the error.\r
     */\r
     template <typename FloatType>\r
index 620e5acd45a8ae49e138cf426993c9a5e1a30148..970f56a66a9e4697eb881be6c0a033790b3be235 100644 (file)
@@ -164,7 +164,7 @@ private:
         LookupTableTransform<float> tanhApprox ([] (float x) { return std::tanh (x); }, -5.0f, 5.0f, 64);\r
         auto outValue = tanhApprox (4.2f);\r
 \r
-    Note: If you try to call the function with an input outside the provided\r
+    Note : if you try to call the function with an input outside the provided\r
     range, it will return either the first or the last recorded LookupTable value.\r
 \r
     @see LookupTable\r
index b506c162a93a49ee5355cd6ff6ac195b2b089ea0..f9a125dea9928f04ac9ea623654fce66243d87b7 100644 (file)
@@ -496,7 +496,7 @@ struct SIMDNativeOps<int32_t>
         tmp = _mm256_hadd_epi32 (tmp, tmp);\r
 \r
        #if JUCE_GCC\r
-        return (int32_t) (tmp[0] + tmp[2]);\r
+        return tmp[0] + tmp[2];\r
        #else\r
         constexpr int mask = (2 << 0) | (3 << 2) | (0 << 4) | (1 << 6);\r
 \r
index 92447a8b23269e9d54d3d4cb8c943a44f528ed1a..dad1284093a4d094097eb6fa08db4812d9252a28 100644 (file)
@@ -61,7 +61,7 @@ struct SIMDFallbackOps
 {\r
     static constexpr size_t n    =  sizeof (vSIMDType) / sizeof (ScalarType);\r
     static constexpr size_t mask = (sizeof (vSIMDType) / sizeof (ScalarType)) - 1;\r
-    static constexpr size_t bits = SIMDInternal::Log2Helper<(int) n>::value;\r
+    static constexpr size_t bits = SIMDInternal::Log2Helper<n>::value;\r
 \r
     // helper types\r
     using MaskType = typename SIMDInternal::MaskTypeFor<ScalarType>::type;\r
index 98195e4580af8a8f2cb9bfe245239f02b5c35ce3..73b0b90f548dc214ff1403cdaa1581fc1726be75 100644 (file)
@@ -60,15 +60,12 @@ namespace FIR
         */\r
         using NumericType = typename SampleTypeHelpers::ElementType<SampleType>::Type;\r
 \r
-        /** A typedef for a ref-counted pointer to the coefficients object */\r
-        using CoefficientsPtr = typename Coefficients<NumericType>::Ptr;\r
-\r
         //==============================================================================\r
         /** This will create a filter which will produce silence. */\r
         Filter() : coefficients (new Coefficients<NumericType>)                                     { reset(); }\r
 \r
         /** Creates a filter with a given set of coefficients. */\r
-        Filter (CoefficientsPtr coefficientsToUse)  : coefficients (static_cast<CoefficientsPtr&&> (coefficientsToUse))   { reset(); }\r
+        Filter (Coefficients<NumericType>* coefficientsToUse)  : coefficients (coefficientsToUse)   { reset(); }\r
 \r
         Filter (const Filter&) = default;\r
         Filter (Filter&&) = default;\r
@@ -111,7 +108,7 @@ namespace FIR
         }\r
 \r
         //==============================================================================\r
-        /** The coefficients of the FIR filter. It's up to the caller to ensure that\r
+        /** The coefficients of the FIR filter. It's up to the called to ensure that\r
             these coefficients are modified in a thread-safe way.\r
 \r
             If you change the order of the coefficients then you must call reset after\r
index 9f6da271c51ee568ee83f9ee8a8df7313f9b0b23..308ed209703378f807ec14b09296390d917bcdaf 100644 (file)
@@ -178,7 +178,7 @@ class FIRFilterTest : public UnitTest
             AudioBlock<NumericType> fir (firBlock, 1, static_cast<size_t> (size));\r
             fillRandom (random, fir.getChannelPointer (0), static_cast<size_t> (size));\r
 \r
-            FIR::Filter<SampleType> filter (*new FIR::Coefficients<NumericType> (fir.getChannelPointer (0), static_cast<size_t> (size)));\r
+            FIR::Filter<SampleType> filter (new FIR::Coefficients<NumericType> (fir.getChannelPointer (0), static_cast<size_t> (size)));\r
             ProcessSpec spec {0.0, n, 1};\r
             filter.prepare (spec);\r
 \r
index 359c5470130973ea43299eacd2b939eed8f33308..7cdf2f32b46a6a467e92a0c31976bebe0b8a262d 100644 (file)
@@ -99,7 +99,7 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
 \r
     auto n = std::tan (MathConstants<NumericType>::pi * frequency / static_cast<NumericType> (sampleRate));\r
 \r
-    return *new Coefficients (n, n, n + 1, n - 1);\r
+    return new Coefficients (n, n, n + 1, n - 1);\r
 }\r
 \r
 template <typename NumericType>\r
@@ -111,7 +111,7 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
 \r
     auto n = std::tan (MathConstants<NumericType>::pi * frequency / static_cast<NumericType> (sampleRate));\r
 \r
-    return *new Coefficients (1, -1, n + 1, n - 1);\r
+    return new Coefficients (1, -1, n + 1, n - 1);\r
 }\r
 \r
 template <typename NumericType>\r
@@ -123,7 +123,7 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
 \r
     auto n = std::tan (MathConstants<NumericType>::pi * frequency / static_cast<NumericType> (sampleRate));\r
 \r
-    return *new Coefficients (n - 1, n + 1, n + 1, n - 1);\r
+    return new Coefficients (n - 1, n + 1, n + 1, n - 1);\r
 }\r
 \r
 template <typename NumericType>\r
@@ -147,9 +147,9 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto invQ = 1 / Q;\r
     auto c1 = 1 / (1 + invQ * n + nSquared);\r
 \r
-    return *new Coefficients (c1, c1 * 2, c1,\r
-                              1, c1 * 2 * (1 - nSquared),\r
-                              c1 * (1 - invQ * n + nSquared));\r
+    return new Coefficients (c1, c1 * 2, c1,\r
+                             1, c1 * 2 * (1 - nSquared),\r
+                             c1 * (1 - invQ * n + nSquared));\r
 }\r
 \r
 template <typename NumericType>\r
@@ -173,9 +173,9 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto invQ = 1 / Q;\r
     auto c1 = 1 / (1 + invQ * n + nSquared);\r
 \r
-    return *new Coefficients (c1, c1 * -2, c1,\r
-                              1, c1 * 2 * (nSquared - 1),\r
-                              c1 * (1 - invQ * n + nSquared));\r
+    return new Coefficients (c1, c1 * -2, c1,\r
+                             1, c1 * 2 * (nSquared - 1),\r
+                             c1 * (1 - invQ * n + nSquared));\r
 }\r
 \r
 template <typename NumericType>\r
@@ -199,10 +199,10 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto invQ = 1 / Q;\r
     auto c1 = 1 / (1 + invQ * n + nSquared);\r
 \r
-    return *new Coefficients (c1 * n * invQ, 0,\r
-                             -c1 * n * invQ, 1,\r
-                              c1 * 2 * (1 - nSquared),\r
-                              c1 * (1 - invQ * n + nSquared));\r
+    return new Coefficients (c1 * n * invQ, 0,\r
+                            -c1 * n * invQ, 1,\r
+                             c1 * 2 * (1 - nSquared),\r
+                             c1 * (1 - invQ * n + nSquared));\r
 }\r
 \r
 template <typename NumericType>\r
@@ -228,7 +228,7 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto b0 = c1 * (1 + nSquared);\r
     auto b1 = 2 * c1 * (1 - nSquared);\r
 \r
-    return *new Coefficients (b0, b1, b0, 1, b1, c1 * (1 - n * invQ + nSquared));\r
+    return new Coefficients (b0, b1, b0, 1, b1, c1 * (1 - n * invQ + nSquared));\r
 }\r
 \r
 template <typename NumericType>\r
@@ -254,7 +254,7 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto b0 = c1 * (1 - n * invQ + nSquared);\r
     auto b1 = c1 * 2 * (1 - nSquared);\r
 \r
-    return *new Coefficients (b0, b1, 1, 1, b1, b0);\r
+    return new Coefficients (b0, b1, 1, 1, b1, b0);\r
 }\r
 \r
 template <typename NumericType>\r
@@ -275,12 +275,12 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto beta = std::sin (omega) * std::sqrt (A) / Q;\r
     auto aminus1TimesCoso = aminus1 * coso;\r
 \r
-    return *new Coefficients (A * (aplus1 - aminus1TimesCoso + beta),\r
-                              A * 2 * (aminus1 - aplus1 * coso),\r
-                              A * (aplus1 - aminus1TimesCoso - beta),\r
-                              aplus1 + aminus1TimesCoso + beta,\r
-                              -2 * (aminus1 + aplus1 * coso),\r
-                              aplus1 + aminus1TimesCoso - beta);\r
+    return new Coefficients (A * (aplus1 - aminus1TimesCoso + beta),\r
+                             A * 2 * (aminus1 - aplus1 * coso),\r
+                             A * (aplus1 - aminus1TimesCoso - beta),\r
+                             aplus1 + aminus1TimesCoso + beta,\r
+                             -2 * (aminus1 + aplus1 * coso),\r
+                             aplus1 + aminus1TimesCoso - beta);\r
 }\r
 \r
 template <typename NumericType>\r
@@ -301,12 +301,12 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto beta = std::sin (omega) * std::sqrt (A) / Q;\r
     auto aminus1TimesCoso = aminus1 * coso;\r
 \r
-    return *new Coefficients (A * (aplus1 + aminus1TimesCoso + beta),\r
-                              A * -2 * (aminus1 + aplus1 * coso),\r
-                              A * (aplus1 + aminus1TimesCoso - beta),\r
-                              aplus1 - aminus1TimesCoso + beta,\r
-                              2 * (aminus1 - aplus1 * coso),\r
-                              aplus1 - aminus1TimesCoso - beta);\r
+    return new Coefficients (A * (aplus1 + aminus1TimesCoso + beta),\r
+                             A * -2 * (aminus1 + aplus1 * coso),\r
+                             A * (aplus1 + aminus1TimesCoso - beta),\r
+                             aplus1 - aminus1TimesCoso + beta,\r
+                             2 * (aminus1 - aplus1 * coso),\r
+                             aplus1 - aminus1TimesCoso - beta);\r
 }\r
 \r
 template <typename NumericType>\r
@@ -327,10 +327,10 @@ typename IIR::Coefficients<NumericType>::Ptr IIR::Coefficients<NumericType>::mak
     auto alphaTimesA = alpha * A;\r
     auto alphaOverA = alpha / A;\r
 \r
-    return *new Coefficients (1 + alphaTimesA, c2,\r
-                              1 - alphaTimesA,\r
-                              1 + alphaOverA, c2,\r
-                              1 - alphaOverA);\r
+    return new Coefficients (1 + alphaTimesA, c2,\r
+                             1 - alphaTimesA,\r
+                             1 + alphaOverA, c2,\r
+                             1 - alphaOverA);\r
 }\r
 \r
 template <typename NumericType>\r
index 587c7630d0a7ddcf6d232ebfeb4076879cfc011c..a111d8a3cab39571245601d70da8ca36225c6e8d 100644 (file)
@@ -59,9 +59,6 @@ namespace IIR
         */\r
         using NumericType = typename SampleTypeHelpers::ElementType<SampleType>::Type;\r
 \r
-        /** A typedef for a ref-counted pointer to the coefficients object */\r
-        using CoefficientsPtr = typename Coefficients<NumericType>::Ptr;\r
-\r
         //==============================================================================\r
         /** Creates a filter.\r
 \r
@@ -72,7 +69,7 @@ namespace IIR
         Filter();\r
 \r
         /** Creates a filter with a given set of coefficients. */\r
-        Filter (CoefficientsPtr coefficientsToUse);\r
+        Filter (Coefficients<NumericType>* coefficientsToUse);\r
 \r
         Filter (const Filter&) = default;\r
         Filter (Filter&&) = default;\r
@@ -80,13 +77,13 @@ namespace IIR
         Filter& operator= (Filter&&) = default;\r
 \r
         //==============================================================================\r
-        /** The coefficients of the IIR filter. It's up to the caller to ensure that\r
+        /** The coefficients of the IIR filter. It's up to the called to ensure that\r
             these coefficients are modified in a thread-safe way.\r
 \r
             If you change the order of the coefficients then you must call reset after\r
             modifying them.\r
         */\r
-        CoefficientsPtr coefficients;\r
+        typename Coefficients<NumericType>::Ptr coefficients;\r
 \r
         //==============================================================================\r
         /** Resets the filter's processing pipeline, ready to start a new stream of data.\r
index b2ce0d0d4b085da51534d90fc2eaad10498bdf1b..f4f8848f66e526985c3900c690a364375edfef84 100644 (file)
@@ -42,7 +42,8 @@ Filter<SampleType>::Filter()
 }\r
 \r
 template <typename SampleType>\r
-Filter<SampleType>::Filter (CoefficientsPtr c)  : coefficients (static_cast<CoefficientsPtr&&> (c))\r
+Filter<SampleType>::Filter (Coefficients<typename Filter<SampleType>::NumericType>* c)\r
+    : coefficients (c)\r
 {\r
     reset();\r
 }\r
@@ -66,6 +67,7 @@ void Filter<SampleType>::reset (SampleType resetToValue)
 template <typename SampleType>\r
 void Filter<SampleType>::prepare (const ProcessSpec&) noexcept     { reset(); }\r
 \r
+\r
 template <typename SampleType>\r
 template <typename ProcessContext, bool bypassed>\r
 void Filter<SampleType>::processInternal (const ProcessContext& context) noexcept\r
@@ -87,6 +89,11 @@ void Filter<SampleType>::processInternal (const ProcessContext& context) noexcep
     auto* dst = outputBlock.getChannelPointer (0);\r
     auto* coeffs = coefficients->getRawCoefficients();\r
 \r
+    // we need to copy this template parameter into a constexpr\r
+    // otherwise MSVC will moan that the tenary expressions below\r
+    // are constant conditional expressions\r
+    constexpr bool isBypassed = bypassed;\r
+\r
     switch (order)\r
     {\r
         case 1:\r
@@ -99,12 +106,12 @@ void Filter<SampleType>::processInternal (const ProcessContext& context) noexcep
 \r
             for (size_t i = 0; i < numSamples; ++i)\r
             {\r
-                auto input = src[i];\r
-                auto output = input * b0 + lv1;\r
+                auto in = src[i];\r
+                auto out = in * b0 + lv1;\r
 \r
-                dst[i] = bypassed ? input : output;\r
+                dst[i] = isBypassed ? in : out;\r
 \r
-                lv1 = (input * b1) - (output * a1);\r
+                lv1 = (in * b1) - (out * a1);\r
             }\r
 \r
             util::snapToZero (lv1); state[0] = lv1;\r
@@ -124,12 +131,12 @@ void Filter<SampleType>::processInternal (const ProcessContext& context) noexcep
 \r
             for (size_t i = 0; i < numSamples; ++i)\r
             {\r
-                auto input = src[i];\r
-                auto output = (input * b0) + lv1;\r
-                dst[i] = bypassed ? input : output;\r
+                auto in = src[i];\r
+                auto out = (in * b0) + lv1;\r
+                dst[i] = isBypassed ? in : out;\r
 \r
-                lv1 = (input * b1) - (output* a1) + lv2;\r
-                lv2 = (input * b2) - (output* a2);\r
+                lv1 = (in * b1) - (out * a1) + lv2;\r
+                lv2 = (in * b2) - (out * a2);\r
             }\r
 \r
             util::snapToZero (lv1); state[0] = lv1;\r
@@ -153,13 +160,13 @@ void Filter<SampleType>::processInternal (const ProcessContext& context) noexcep
 \r
             for (size_t i = 0; i < numSamples; ++i)\r
             {\r
-                auto input = src[i];\r
-                auto output = (input * b0) + lv1;\r
-                dst[i] = bypassed ? input : output;\r
+                auto in = src[i];\r
+                auto out = (in * b0) + lv1;\r
+                dst[i] = isBypassed ? in : out;\r
 \r
-                lv1 = (input * b1) - (output* a1) + lv2;\r
-                lv2 = (input * b2) - (output* a2) + lv3;\r
-                lv3 = (input * b3) - (output* a3);\r
+                lv1 = (in * b1) - (out * a1) + lv2;\r
+                lv2 = (in * b2) - (out * a2) + lv3;\r
+                lv3 = (in * b3) - (out * a3);\r
             }\r
 \r
             util::snapToZero (lv1); state[0] = lv1;\r
@@ -172,14 +179,14 @@ void Filter<SampleType>::processInternal (const ProcessContext& context) noexcep
         {\r
             for (size_t i = 0; i < numSamples; ++i)\r
             {\r
-                auto input = src[i];\r
-                auto output= (input * coeffs[0]) + state[0];\r
-                dst[i] = bypassed ? input : output;\r
+                auto in = src[i];\r
+                auto out = (in * coeffs[0]) + state[0];\r
+                dst[i] = isBypassed ? in : out;\r
 \r
                 for (size_t j = 0; j < order - 1; ++j)\r
-                    state[j] = (input * coeffs[j + 1]) - (output* coeffs[order + j + 1]) + state[j + 1];\r
+                    state[j] = (in * coeffs[j + 1]) - (out * coeffs[order + j + 1]) + state[j + 1];\r
 \r
-                state[order - 1] = (input * coeffs[order]) - (output* coeffs[order * 2]);\r
+                state[order - 1] = (in * coeffs[order]) - (out * coeffs[order * 2]);\r
             }\r
 \r
             snapToZero();\r
@@ -193,14 +200,14 @@ SampleType JUCE_VECTOR_CALLTYPE Filter<SampleType>::processSample (SampleType sa
     check();\r
     auto* c = coefficients->getRawCoefficients();\r
 \r
-    auto output= (c[0] * sample) + state[0];\r
+    auto out = (c[0] * sample) + state[0];\r
 \r
     for (size_t j = 0; j < order - 1; ++j)\r
-        state[j] = (c[j + 1] * sample) - (c[order + j + 1] * output) + state[j + 1];\r
+        state[j] = (c[j + 1] * sample) - (c[order + j + 1] * out) + state[j + 1];\r
 \r
-    state[order - 1] = (c[order] * sample) - (c[order * 2] * output);\r
+    state[order - 1] = (c[order] * sample) - (c[order * 2] * out);\r
 \r
-    return output;\r
+    return out;\r
 }\r
 \r
 template <typename SampleType>\r
index 4a97ef88637bfb503a71befd68f4c7a71b708af6..b0f3817e80befddcc29ddcf22d242e328744361c 100644 (file)
@@ -29,23 +29,29 @@ namespace juce
 namespace dsp\r
 {\r
 \r
-/** Abstract class for the provided oversampling stages used internally in\r
+/** Abstract class for the provided oversampling engines used internally in\r
     the Oversampling class.\r
 */\r
 template <typename SampleType>\r
-struct Oversampling<SampleType>::OversamplingStage\r
+class OversamplingEngine\r
 {\r
-    OversamplingStage (size_t numChans, size_t newFactor)  : numChannels (numChans), factor (newFactor) {}\r
-    virtual ~OversamplingStage() {}\r
+public:\r
+    //===============================================================================\r
+    OversamplingEngine (size_t newNumChannels, size_t newFactor)\r
+    {\r
+        numChannels = newNumChannels;\r
+        factor = newFactor;\r
+    }\r
+\r
+    virtual ~OversamplingEngine() {}\r
 \r
     //===============================================================================\r
     virtual SampleType getLatencyInSamples() = 0;\r
+    size_t getFactor() { return factor; }\r
 \r
     virtual void initProcessing (size_t maximumNumberOfSamplesBeforeOversampling)\r
     {\r
-        buffer.setSize (static_cast<int> (numChannels),\r
-                        static_cast<int> (maximumNumberOfSamplesBeforeOversampling * factor),\r
-                        false, false, true);\r
+        buffer.setSize (static_cast<int> (numChannels), static_cast<int> (maximumNumberOfSamplesBeforeOversampling * factor), false, false, true);\r
     }\r
 \r
     virtual void reset()\r
@@ -58,86 +64,93 @@ struct Oversampling<SampleType>::OversamplingStage
         return dsp::AudioBlock<SampleType> (buffer).getSubBlock (0, numSamples);\r
     }\r
 \r
-    virtual void processSamplesUp (dsp::AudioBlock<SampleType>&) = 0;\r
-    virtual void processSamplesDown (dsp::AudioBlock<SampleType>&) = 0;\r
+    virtual void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) = 0;\r
+    virtual void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) = 0;\r
 \r
+protected:\r
+    //===============================================================================\r
     AudioBuffer<SampleType> buffer;\r
-    size_t numChannels, factor;\r
+    size_t factor;\r
+    size_t numChannels;\r
 };\r
 \r
 \r
 //===============================================================================\r
-/** Dummy oversampling stage class which simply copies and pastes the input\r
+/** Dummy oversampling engine class which simply copies and pastes the input\r
     signal, which could be equivalent to a "one time" oversampling processing.\r
 */\r
 template <typename SampleType>\r
-struct OversamplingDummy   : public Oversampling<SampleType>::OversamplingStage\r
+class OversamplingDummy : public OversamplingEngine<SampleType>\r
 {\r
-    using ParentType = typename Oversampling<SampleType>::OversamplingStage;\r
-\r
-    OversamplingDummy (size_t numChans) : ParentType (numChans, 1) {}\r
+public:\r
+    //===============================================================================\r
+    OversamplingDummy (size_t numChannels) : OversamplingEngine<SampleType> (numChannels, 1) {}\r
+    ~OversamplingDummy() {}\r
 \r
     //===============================================================================\r
     SampleType getLatencyInSamples() override\r
     {\r
-        return 0;\r
+        return 0.f;\r
     }\r
 \r
-    void processSamplesUp (dsp::AudioBlock<SampleType>inputBlock) override\r
+    void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) override\r
     {\r
-        jassert (inputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
-        jassert (inputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+        jassert (inputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+        jassert (inputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
 \r
-        for (size_t channel = 0; channel < inputBlock.getNumChannels(); ++channel)\r
-            ParentType::buffer.copyFrom (static_cast<int> (channel), 0,\r
+        for (size_t channel = 0; channel < inputBlock.getNumChannels(); channel++)\r
+            OversamplingEngine<SampleType>::buffer.copyFrom (static_cast<int> (channel), 0,\r
                 inputBlock.getChannelPointer (channel), static_cast<int> (inputBlock.getNumSamples()));\r
     }\r
 \r
-    void processSamplesDown (dsp::AudioBlock<SampleType>outputBlock) override\r
+    void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) override\r
     {\r
-        jassert (outputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
-        jassert (outputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+        jassert (outputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+        jassert (outputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
 \r
-        outputBlock.copy (ParentType::getProcessedSamples (outputBlock.getNumSamples()));\r
+        outputBlock.copy (OversamplingEngine<SampleType>::getProcessedSamples (outputBlock.getNumSamples()));\r
     }\r
 \r
+private:\r
+    //===============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OversamplingDummy)\r
 };\r
 \r
 //===============================================================================\r
-/** Oversampling stage class performing 2 times oversampling using the Filter\r
+/** Oversampling engine class performing 2 times oversampling using the Filter\r
     Design FIR Equiripple method. The resulting filter is linear phase,\r
     symmetric, and has every two samples but the middle one equal to zero,\r
     leading to specific processing optimizations.\r
 */\r
 template <typename SampleType>\r
-struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::OversamplingStage\r
+class Oversampling2TimesEquirippleFIR : public OversamplingEngine<SampleType>\r
 {\r
-    using ParentType = typename Oversampling<SampleType>::OversamplingStage;\r
-\r
-    Oversampling2TimesEquirippleFIR (size_t numChans,\r
+public:\r
+    //===============================================================================\r
+    Oversampling2TimesEquirippleFIR (size_t numChannels,\r
                                      SampleType normalizedTransitionWidthUp,\r
                                      SampleType stopbandAttenuationdBUp,\r
                                      SampleType normalizedTransitionWidthDown,\r
-                                     SampleType stopbandAttenuationdBDown)\r
-        : ParentType (numChans, 2)\r
+                                     SampleType stopbandAttenuationdBDown) : OversamplingEngine<SampleType> (numChannels, 2)\r
     {\r
-        coefficientsUp   = *dsp::FilterDesign<SampleType>::designFIRLowpassHalfBandEquirippleMethod (normalizedTransitionWidthUp,   stopbandAttenuationdBUp);\r
+        coefficientsUp = *dsp::FilterDesign<SampleType>::designFIRLowpassHalfBandEquirippleMethod (normalizedTransitionWidthUp, stopbandAttenuationdBUp);\r
         coefficientsDown = *dsp::FilterDesign<SampleType>::designFIRLowpassHalfBandEquirippleMethod (normalizedTransitionWidthDown, stopbandAttenuationdBDown);\r
 \r
         auto N = coefficientsUp.getFilterOrder() + 1;\r
-        stateUp.setSize (static_cast<int> (this->numChannels), static_cast<int> (N));\r
+        stateUp.setSize (static_cast<int> (numChannels), static_cast<int> (N));\r
 \r
         N = coefficientsDown.getFilterOrder() + 1;\r
         auto Ndiv2 = N / 2;\r
         auto Ndiv4 = Ndiv2 / 2;\r
 \r
-        stateDown.setSize  (static_cast<int> (this->numChannels), static_cast<int> (N));\r
-        stateDown2.setSize (static_cast<int> (this->numChannels), static_cast<int> (Ndiv4 + 1));\r
+        stateDown.setSize (static_cast<int> (numChannels), static_cast<int> (N));\r
+        stateDown2.setSize (static_cast<int> (numChannels), static_cast<int> (Ndiv4 + 1));\r
 \r
-        position.resize (static_cast<int> (this->numChannels));\r
+        position.resize (static_cast<int> (numChannels));\r
     }\r
 \r
+    ~Oversampling2TimesEquirippleFIR() {}\r
+\r
     //===============================================================================\r
     SampleType getLatencyInSamples() override\r
     {\r
@@ -146,7 +159,7 @@ struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::Overs
 \r
     void reset() override\r
     {\r
-        ParentType::reset();\r
+        OversamplingEngine<SampleType>::reset();\r
 \r
         stateUp.clear();\r
         stateDown.clear();\r
@@ -155,10 +168,10 @@ struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::Overs
         position.fill (0);\r
     }\r
 \r
-    void processSamplesUp (dsp::AudioBlock<SampleType>inputBlock) override\r
+    void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) override\r
     {\r
-        jassert (inputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
-        jassert (inputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+        jassert (inputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+        jassert (inputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
 \r
         // Initialization\r
         auto fir = coefficientsUp.getRawCoefficients();\r
@@ -167,20 +180,19 @@ struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::Overs
         auto numSamples = inputBlock.getNumSamples();\r
 \r
         // Processing\r
-        for (size_t channel = 0; channel < inputBlock.getNumChannels(); ++channel)\r
+        for (size_t channel = 0; channel < inputBlock.getNumChannels(); channel++)\r
         {\r
-            auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+            auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
             auto buf = stateUp.getWritePointer (static_cast<int> (channel));\r
             auto samples = inputBlock.getChannelPointer (channel);\r
 \r
-            for (size_t i = 0; i < numSamples; ++i)\r
+            for (size_t i = 0; i < numSamples; i++)\r
             {\r
                 // Input\r
                 buf[N - 1] = 2 * samples[i];\r
 \r
                 // Convolution\r
                 auto out = static_cast<SampleType> (0.0);\r
-\r
                 for (size_t k = 0; k < Ndiv2; k += 2)\r
                     out += (buf[k] + buf[N - k - 1]) * fir[k];\r
 \r
@@ -195,10 +207,10 @@ struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::Overs
         }\r
     }\r
 \r
-    void processSamplesDown (dsp::AudioBlock<SampleType>outputBlock) override\r
+    void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) override\r
     {\r
-        jassert (outputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
-        jassert (outputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+        jassert (outputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+        jassert (outputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
 \r
         // Initialization\r
         auto fir = coefficientsDown.getRawCoefficients();\r
@@ -208,22 +220,21 @@ struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::Overs
         auto numSamples = outputBlock.getNumSamples();\r
 \r
         // Processing\r
-        for (size_t channel = 0; channel < outputBlock.getNumChannels(); ++channel)\r
+        for (size_t channel = 0; channel < outputBlock.getNumChannels(); channel++)\r
         {\r
-            auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+            auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
             auto buf = stateDown.getWritePointer (static_cast<int> (channel));\r
             auto buf2 = stateDown2.getWritePointer (static_cast<int> (channel));\r
             auto samples = outputBlock.getChannelPointer (channel);\r
             auto pos = position.getUnchecked (static_cast<int> (channel));\r
 \r
-            for (size_t i = 0; i < numSamples; ++i)\r
+            for (size_t i = 0; i < numSamples; i++)\r
             {\r
                 // Input\r
                 buf[N - 1] = bufferSamples[i << 1];\r
 \r
                 // Convolution\r
                 auto out = static_cast<SampleType> (0.0);\r
-\r
                 for (size_t k = 0; k < Ndiv2; k += 2)\r
                     out += (buf[k] + buf[N - k - 1]) * fir[k];\r
 \r
@@ -234,7 +245,7 @@ struct Oversampling2TimesEquirippleFIR  : public Oversampling<SampleType>::Overs
                 samples[i] = out;\r
 \r
                 // Shift data\r
-                for (size_t k = 0; k < N - 2; ++k)\r
+                for (size_t k = 0; k < N - 2; k++)\r
                     buf[k] = buf[k + 2];\r
 \r
                 // Circular buffer\r
@@ -258,47 +269,48 @@ private:
 \r
 \r
 //===============================================================================\r
-/** Oversampling stage class performing 2 times oversampling using the Filter\r
+/** Oversampling engine class performing 2 times oversampling using the Filter\r
     Design IIR Polyphase Allpass Cascaded method. The resulting filter is minimum\r
     phase, and provided with a method to get the exact resulting latency.\r
 */\r
 template <typename SampleType>\r
-struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::OversamplingStage\r
+class Oversampling2TimesPolyphaseIIR : public OversamplingEngine<SampleType>\r
 {\r
-    using ParentType = typename Oversampling<SampleType>::OversamplingStage;\r
-\r
-    Oversampling2TimesPolyphaseIIR (size_t numChans,\r
+public:\r
+    //===============================================================================\r
+    Oversampling2TimesPolyphaseIIR (size_t numChannels,\r
                                     SampleType normalizedTransitionWidthUp,\r
                                     SampleType stopbandAttenuationdBUp,\r
                                     SampleType normalizedTransitionWidthDown,\r
-                                    SampleType stopbandAttenuationdBDown)\r
-        : ParentType (numChans, 2)\r
+                                    SampleType stopbandAttenuationdBDown) : OversamplingEngine<SampleType> (numChannels, 2)\r
     {\r
         auto structureUp = dsp::FilterDesign<SampleType>::designIIRLowpassHalfBandPolyphaseAllpassMethod (normalizedTransitionWidthUp, stopbandAttenuationdBUp);\r
-        auto coeffsUp = getCoefficients (structureUp);\r
+        dsp::IIR::Coefficients<SampleType> coeffsUp = getCoefficients (structureUp);\r
         latency = static_cast<SampleType> (-(coeffsUp.getPhaseForFrequency (0.0001, 1.0)) / (0.0001 * MathConstants<double>::twoPi));\r
 \r
         auto structureDown = dsp::FilterDesign<SampleType>::designIIRLowpassHalfBandPolyphaseAllpassMethod (normalizedTransitionWidthDown, stopbandAttenuationdBDown);\r
-        auto coeffsDown = getCoefficients (structureDown);\r
+        dsp::IIR::Coefficients<SampleType> coeffsDown = getCoefficients (structureDown);\r
         latency += static_cast<SampleType> (-(coeffsDown.getPhaseForFrequency (0.0001, 1.0)) / (0.0001 * MathConstants<double>::twoPi));\r
 \r
-        for (auto i = 0; i < structureUp.directPath.size(); ++i)\r
-            coefficientsUp.add (structureUp.directPath.getObjectPointer (i)->coefficients[0]);\r
+        for (auto i = 0; i < structureUp.directPath.size(); i++)\r
+            coefficientsUp.add (structureUp.directPath[i].coefficients[0]);\r
 \r
-        for (auto i = 1; i < structureUp.delayedPath.size(); ++i)\r
-            coefficientsUp.add (structureUp.delayedPath.getObjectPointer (i)->coefficients[0]);\r
+        for (auto i = 1; i < structureUp.delayedPath.size(); i++)\r
+            coefficientsUp.add (structureUp.delayedPath[i].coefficients[0]);\r
 \r
-        for (auto i = 0; i < structureDown.directPath.size(); ++i)\r
-            coefficientsDown.add (structureDown.directPath.getObjectPointer (i)->coefficients[0]);\r
+        for (auto i = 0; i < structureDown.directPath.size(); i++)\r
+            coefficientsDown.add (structureDown.directPath[i].coefficients[0]);\r
 \r
-        for (auto i = 1; i < structureDown.delayedPath.size(); ++i)\r
-            coefficientsDown.add (structureDown.delayedPath.getObjectPointer (i)->coefficients[0]);\r
+        for (auto i = 1; i < structureDown.delayedPath.size(); i++)\r
+            coefficientsDown.add (structureDown.delayedPath[i].coefficients[0]);\r
 \r
-        v1Up.setSize   (static_cast<int> (this->numChannels), coefficientsUp.size());\r
-        v1Down.setSize (static_cast<int> (this->numChannels), coefficientsDown.size());\r
-        delayDown.resize (static_cast<int> (this->numChannels));\r
+        v1Up.setSize (static_cast<int> (numChannels), coefficientsUp.size());\r
+        v1Down.setSize (static_cast<int> (numChannels), coefficientsDown.size());\r
+        delayDown.resize (static_cast<int> (numChannels));\r
     }\r
 \r
+    ~Oversampling2TimesPolyphaseIIR() {}\r
+\r
     //===============================================================================\r
     SampleType getLatencyInSamples() override\r
     {\r
@@ -307,16 +319,17 @@ struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::Oversa
 \r
     void reset() override\r
     {\r
-        ParentType::reset();\r
+        OversamplingEngine<SampleType>::reset();\r
+\r
         v1Up.clear();\r
         v1Down.clear();\r
         delayDown.fill (0);\r
     }\r
 \r
-    void processSamplesUp (dsp::AudioBlock<SampleType>inputBlock) override\r
+    void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) override\r
     {\r
-        jassert (inputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
-        jassert (inputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+        jassert (inputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+        jassert (inputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
 \r
         // Initialization\r
         auto coeffs = coefficientsUp.getRawDataPointer();\r
@@ -326,18 +339,17 @@ struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::Oversa
         auto numSamples = inputBlock.getNumSamples();\r
 \r
         // Processing\r
-        for (size_t channel = 0; channel < inputBlock.getNumChannels(); ++channel)\r
+        for (size_t channel = 0; channel < inputBlock.getNumChannels(); channel++)\r
         {\r
-            auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+            auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
             auto lv1 = v1Up.getWritePointer (static_cast<int> (channel));\r
             auto samples = inputBlock.getChannelPointer (channel);\r
 \r
-            for (size_t i = 0; i < numSamples; ++i)\r
+            for (size_t i = 0; i < numSamples; i++)\r
             {\r
                 // Direct path cascaded allpass filters\r
                 auto input = samples[i];\r
-\r
-                for (auto n = 0; n < directStages; ++n)\r
+                for (auto n = 0; n < directStages; n++)\r
                 {\r
                     auto alpha = coeffs[n];\r
                     auto output = alpha * input + lv1[n];\r
@@ -350,8 +362,7 @@ struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::Oversa
 \r
                 // Delayed path cascaded allpass filters\r
                 input = samples[i];\r
-\r
-                for (auto n = directStages; n < numStages; ++n)\r
+                for (auto n = directStages; n < numStages; n++)\r
                 {\r
                     auto alpha = coeffs[n];\r
                     auto output = alpha * input + lv1[n];\r
@@ -368,10 +379,10 @@ struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::Oversa
         snapToZero (true);\r
     }\r
 \r
-    void processSamplesDown (dsp::AudioBlock<SampleType>outputBlock) override\r
+    void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) override\r
     {\r
-        jassert (outputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
-        jassert (outputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+        jassert (outputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+        jassert (outputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
 \r
         // Initialization\r
         auto coeffs = coefficientsDown.getRawDataPointer();\r
@@ -381,32 +392,29 @@ struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::Oversa
         auto numSamples = outputBlock.getNumSamples();\r
 \r
         // Processing\r
-        for (size_t channel = 0; channel < outputBlock.getNumChannels(); ++channel)\r
+        for (size_t channel = 0; channel < outputBlock.getNumChannels(); channel++)\r
         {\r
-            auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+            auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
             auto lv1 = v1Down.getWritePointer (static_cast<int> (channel));\r
             auto samples = outputBlock.getChannelPointer (channel);\r
             auto delay = delayDown.getUnchecked (static_cast<int> (channel));\r
 \r
-            for (size_t i = 0; i < numSamples; ++i)\r
+            for (size_t i = 0; i < numSamples; i++)\r
             {\r
                 // Direct path cascaded allpass filters\r
                 auto input = bufferSamples[i << 1];\r
-\r
-                for (auto n = 0; n < directStages; ++n)\r
+                for (auto n = 0; n < directStages; n++)\r
                 {\r
                     auto alpha = coeffs[n];\r
                     auto output = alpha * input + lv1[n];\r
                     lv1[n] = input - alpha * output;\r
                     input = output;\r
                 }\r
-\r
                 auto directOut = input;\r
 \r
                 // Delayed path cascaded allpass filters\r
                 input = bufferSamples[(i << 1) + 1];\r
-\r
-                for (auto n = directStages; n < numStages; ++n)\r
+                for (auto n = directStages; n < numStages; n++)\r
                 {\r
                     auto alpha = coeffs[n];\r
                     auto output = alpha * input + lv1[n];\r
@@ -430,23 +438,23 @@ struct Oversampling2TimesPolyphaseIIR  : public Oversampling<SampleType>::Oversa
     {\r
         if (snapUpProcessing)\r
         {\r
-            for (auto channel = 0; channel < ParentType::buffer.getNumChannels(); ++channel)\r
+            for (auto channel = 0; channel < OversamplingEngine<SampleType>::buffer.getNumChannels(); channel++)\r
             {\r
                 auto lv1 = v1Up.getWritePointer (channel);\r
                 auto numStages = coefficientsUp.size();\r
 \r
-                for (auto n = 0; n < numStages; ++n)\r
+                for (auto n = 0; n < numStages; n++)\r
                     util::snapToZero (lv1[n]);\r
             }\r
         }\r
         else\r
         {\r
-            for (auto channel = 0; channel < ParentType::buffer.getNumChannels(); ++channel)\r
+            for (auto channel = 0; channel < OversamplingEngine<SampleType>::buffer.getNumChannels(); channel++)\r
             {\r
                 auto lv1 = v1Down.getWritePointer (channel);\r
                 auto numStages = coefficientsDown.size();\r
 \r
-                for (auto n = 0; n < numStages; ++n)\r
+                for (auto n = 0; n < numStages; n++)\r
                     util::snapToZero (lv1[n]);\r
             }\r
         }\r
@@ -457,59 +465,73 @@ private:
     /** This function calculates the equivalent high order IIR filter of a given\r
         polyphase cascaded allpass filters structure.\r
     */\r
-    dsp::IIR::Coefficients<SampleType> getCoefficients (typename dsp::FilterDesign<SampleType>::IIRPolyphaseAllpassStructure& structure) const\r
+    const dsp::IIR::Coefficients<SampleType> getCoefficients (typename dsp::FilterDesign<SampleType>::IIRPolyphaseAllpassStructure& structure) const\r
     {\r
-        constexpr auto one = static_cast<SampleType> (1.0);\r
+        dsp::Polynomial<SampleType> numerator1   ({ static_cast<SampleType> (1.0) });\r
+        dsp::Polynomial<SampleType> denominator1 ({ static_cast<SampleType> (1.0) });\r
+        dsp::Polynomial<SampleType> numerator2   ({ static_cast<SampleType> (1.0) });\r
+        dsp::Polynomial<SampleType> denominator2 ({ static_cast<SampleType> (1.0) });\r
 \r
-        dsp::Polynomial<SampleType> numerator1 ({ one }), denominator1 ({ one }),\r
-                                    numerator2 ({ one }), denominator2 ({ one });\r
+        dsp::Polynomial<SampleType> temp;\r
 \r
-        for (auto* i : structure.directPath)\r
+        for (auto n = 0; n < structure.directPath.size(); n++)\r
         {\r
-            auto coeffs = i->getRawCoefficients();\r
+            auto* coeffs = structure.directPath.getReference (n).getRawCoefficients();\r
 \r
-            if (i->getFilterOrder() == 1)\r
+            if (structure.directPath[n].getFilterOrder() == 1)\r
             {\r
-                numerator1 = numerator1.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] }));\r
-                denominator1 = denominator1.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[2] }));\r
+                temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] });\r
+                numerator1 = numerator1.getProductWith (temp);\r
+\r
+                temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[2] });\r
+                denominator1 = denominator1.getProductWith (temp);\r
             }\r
             else\r
             {\r
-                numerator1 = numerator1.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] }));\r
-                denominator1 = denominator1.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[3], coeffs[4] }));\r
+                temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] });\r
+                numerator1 = numerator1.getProductWith (temp);\r
+\r
+                temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[3], coeffs[4] });\r
+                denominator1 = denominator1.getProductWith (temp);\r
             }\r
         }\r
 \r
-        for (auto* i : structure.delayedPath)\r
+        for (auto n = 0; n < structure.delayedPath.size(); n++)\r
         {\r
-            auto coeffs = i->getRawCoefficients();\r
+            auto* coeffs = structure.delayedPath.getReference (n).getRawCoefficients();\r
 \r
-            if (i->getFilterOrder() == 1)\r
+            if (structure.delayedPath[n].getFilterOrder() == 1)\r
             {\r
-                numerator2 = numerator2.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] }));\r
-                denominator2 = denominator2.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[2] }));\r
+                temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] });\r
+                numerator2 = numerator2.getProductWith (temp);\r
+\r
+                temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[2] });\r
+                denominator2 = denominator2.getProductWith (temp);\r
             }\r
             else\r
             {\r
-                numerator2 = numerator2.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] }));\r
-                denominator2 = denominator2.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[3], coeffs[4] }));\r
+                temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] });\r
+                numerator2 = numerator2.getProductWith (temp);\r
+\r
+                temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[3], coeffs[4] });\r
+                denominator2 = denominator2.getProductWith (temp);\r
             }\r
         }\r
 \r
-        auto numeratorf1 = numerator1.getProductWith (denominator2);\r
-        auto numeratorf2 = numerator2.getProductWith (denominator1);\r
-        auto numerator   = numeratorf1.getSumWith (numeratorf2);\r
-        auto denominator = denominator1.getProductWith (denominator2);\r
+        dsp::Polynomial<SampleType> numeratorf1 = numerator1.getProductWith (denominator2);\r
+        dsp::Polynomial<SampleType> numeratorf2 = numerator2.getProductWith (denominator1);\r
+        dsp::Polynomial<SampleType> numerator   = numeratorf1.getSumWith (numeratorf2);\r
+        dsp::Polynomial<SampleType> denominator = denominator1.getProductWith (denominator2);\r
 \r
         dsp::IIR::Coefficients<SampleType> coeffs;\r
 \r
         coeffs.coefficients.clear();\r
-        auto inversion = one / denominator[0];\r
+        auto inversion = static_cast<SampleType> (1.0) / denominator[0];\r
 \r
-        for (auto i = 0; i <= numerator.getOrder(); ++i)\r
+        for (auto i = 0; i <= numerator.getOrder(); i++)\r
             coeffs.coefficients.add (numerator[i] * inversion);\r
 \r
-        for (auto i = 1; i <= denominator.getOrder(); ++i)\r
+        for (auto i = 1; i <= denominator.getOrder(); i++)\r
             coeffs.coefficients.add (denominator[i] * inversion);\r
 \r
         return coeffs;\r
@@ -529,57 +551,56 @@ private:
 \r
 //===============================================================================\r
 template <typename SampleType>\r
-Oversampling<SampleType>::Oversampling (size_t newNumChannels)\r
-    : numChannels (newNumChannels)\r
+Oversampling<SampleType>::Oversampling (size_t newNumChannels, size_t newFactor, FilterType newType, bool newMaxQuality)\r
 {\r
-    jassert (numChannels > 0);\r
+    jassert (newFactor >= 0 && newFactor <= 4 && newNumChannels > 0);\r
 \r
-    addDummyOversamplingStage();\r
-}\r
-\r
-template <typename SampleType>\r
-Oversampling<SampleType>::Oversampling (size_t newNumChannels, size_t newFactor,\r
-                                        FilterType newType, bool isMaximumQuality)\r
-    : numChannels (newNumChannels)\r
-{\r
-    jassert (isPositiveAndBelow (newFactor, 5) && numChannels > 0);\r
+    factorOversampling = static_cast<size_t> (1) << newFactor;\r
+    isMaximumQuality = newMaxQuality;\r
+    type = newType;\r
+    numChannels = newNumChannels;\r
 \r
     if (newFactor == 0)\r
     {\r
-        addDummyOversamplingStage();\r
+        numStages = 1;\r
+        engines.add (new OversamplingDummy<SampleType> (numChannels));\r
     }\r
-    else if (newType == FilterType::filterHalfBandPolyphaseIIR)\r
+    else if (type == FilterType::filterHalfBandPolyphaseIIR)\r
     {\r
-        for (size_t n = 0; n < newFactor; ++n)\r
+        numStages = newFactor;\r
+\r
+        for (size_t n = 0; n < numStages; n++)\r
         {\r
-            auto twUp   = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.0f);\r
-            auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.0f);\r
+            auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.f);\r
+            auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.f);\r
 \r
-            auto gaindBStartUp    = (isMaximumQuality ? -90.0f : -70.0f);\r
-            auto gaindBStartDown  = (isMaximumQuality ? -75.0f : -60.0f);\r
-            auto gaindBFactorUp   = (isMaximumQuality ? 10.0f  : 8.0f);\r
-            auto gaindBFactorDown = (isMaximumQuality ? 10.0f  : 8.0f);\r
+            auto gaindBStartUp = (isMaximumQuality ? -75.f : -65.f);\r
+            auto gaindBStartDown = (isMaximumQuality ? -70.f : -60.f);\r
+            auto gaindBFactorUp = (isMaximumQuality ? 10.f : 8.f);\r
+            auto gaindBFactorDown = (isMaximumQuality ? 10.f : 8.f);\r
 \r
-            addOversamplingStage (FilterType::filterHalfBandPolyphaseIIR,\r
-                                  twUp, gaindBStartUp + gaindBFactorUp * n,\r
-                                  twDown, gaindBStartDown + gaindBFactorDown * n);\r
+            engines.add (new Oversampling2TimesPolyphaseIIR<SampleType> (numChannels,\r
+                                                                         twUp, gaindBStartUp + gaindBFactorUp * n,\r
+                                                                         twDown, gaindBStartDown + gaindBFactorDown * n));\r
         }\r
     }\r
-    else if (newType == FilterType::filterHalfBandFIREquiripple)\r
+    else if (type == FilterType::filterHalfBandFIREquiripple)\r
     {\r
-        for (size_t n = 0; n < newFactor; ++n)\r
+        numStages = newFactor;\r
+\r
+        for (size_t n = 0; n < numStages; n++)\r
         {\r
-            auto twUp   = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.0f);\r
-            auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.0f);\r
+            auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.f);\r
+            auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.f);\r
 \r
-            auto gaindBStartUp    = (isMaximumQuality ? -90.0f : -70.0f);\r
-            auto gaindBStartDown  = (isMaximumQuality ? -75.0f : -60.0f);\r
-            auto gaindBFactorUp   = (isMaximumQuality ? 10.0f  : 8.0f);\r
-            auto gaindBFactorDown = (isMaximumQuality ? 10.0f  : 8.0f);\r
+            auto gaindBStartUp = (isMaximumQuality ? -90.f : -70.f);\r
+            auto gaindBStartDown = (isMaximumQuality ? -70.f : -60.f);\r
+            auto gaindBFactorUp = (isMaximumQuality ? 10.f : 8.f);\r
+            auto gaindBFactorDown = (isMaximumQuality ? 10.f : 8.f);\r
 \r
-            addOversamplingStage (FilterType::filterHalfBandFIREquiripple,\r
-                                  twUp, gaindBStartUp + gaindBFactorUp * n,\r
-                                  twDown, gaindBStartDown + gaindBFactorDown * n);\r
+            engines.add (new Oversampling2TimesEquirippleFIR<SampleType> (numChannels,\r
+                                                                          twUp, gaindBStartUp + gaindBFactorUp * n,\r
+                                                                          twDown, gaindBStartDown + gaindBFactorDown * n));\r
         }\r
     }\r
 }\r
@@ -587,44 +608,7 @@ Oversampling<SampleType>::Oversampling (size_t newNumChannels, size_t newFactor,
 template <typename SampleType>\r
 Oversampling<SampleType>::~Oversampling()\r
 {\r
-    stages.clear();\r
-}\r
-\r
-//===============================================================================\r
-template <typename SampleType>\r
-void Oversampling<SampleType>::addDummyOversamplingStage()\r
-{\r
-    stages.add (new OversamplingDummy<SampleType> (numChannels));\r
-}\r
-\r
-template <typename SampleType>\r
-void Oversampling<SampleType>::addOversamplingStage (FilterType type,\r
-                                                     float normalizedTransitionWidthUp,\r
-                                                     float stopbandAttenuationdBUp,\r
-                                                     float normalizedTransitionWidthDown,\r
-                                                     float stopbandAttenuationdBDown)\r
-{\r
-    if (type == FilterType::filterHalfBandPolyphaseIIR)\r
-    {\r
-        stages.add (new Oversampling2TimesPolyphaseIIR<SampleType> (numChannels,\r
-                                                                    normalizedTransitionWidthUp, stopbandAttenuationdBUp,\r
-                                                                    normalizedTransitionWidthDown, stopbandAttenuationdBDown));\r
-    }\r
-    else\r
-    {\r
-        stages.add (new Oversampling2TimesEquirippleFIR<SampleType> (numChannels,\r
-                                                                     normalizedTransitionWidthUp, stopbandAttenuationdBUp,\r
-                                                                     normalizedTransitionWidthDown, stopbandAttenuationdBDown));\r
-    }\r
-\r
-    factorOversampling *= 2;\r
-}\r
-\r
-template <typename SampleType>\r
-void Oversampling<SampleType>::clearOversamplingStages()\r
-{\r
-    stages.clear();\r
-    factorOversampling = 1u;\r
+    engines.clear();\r
 }\r
 \r
 //===============================================================================\r
@@ -634,10 +618,12 @@ SampleType Oversampling<SampleType>::getLatencyInSamples() noexcept
     auto latency = static_cast<SampleType> (0);\r
     size_t order = 1;\r
 \r
-    for (auto* stage : stages)\r
+    for (size_t n = 0; n < numStages; n++)\r
     {\r
-        order *= stage->factor;\r
-        latency += stage->getLatencyInSamples() / static_cast<SampleType> (order);\r
+        auto& engine = *engines[static_cast<int> (n)];\r
+\r
+        order *= engine.getFactor();\r
+        latency += engine.getLatencyInSamples() / static_cast<SampleType> (order);\r
     }\r
 \r
     return latency;\r
@@ -653,13 +639,15 @@ size_t Oversampling<SampleType>::getOversamplingFactor() noexcept
 template <typename SampleType>\r
 void Oversampling<SampleType>::initProcessing (size_t maximumNumberOfSamplesBeforeOversampling)\r
 {\r
-    jassert (! stages.isEmpty());\r
+    jassert (! engines.isEmpty());\r
     auto currentNumSamples = maximumNumberOfSamplesBeforeOversampling;\r
 \r
-    for (auto* stage : stages)\r
+    for (size_t n = 0; n < numStages; n++)\r
     {\r
-        stage->initProcessing (currentNumSamples);\r
-        currentNumSamples *= stage->factor;\r
+        auto& engine = *engines[static_cast<int> (n)];\r
+\r
+        engine.initProcessing (currentNumSamples);\r
+        currentNumSamples *= engine.getFactor();\r
     }\r
 \r
     isReady = true;\r
@@ -669,55 +657,57 @@ void Oversampling<SampleType>::initProcessing (size_t maximumNumberOfSamplesBefo
 template <typename SampleType>\r
 void Oversampling<SampleType>::reset() noexcept\r
 {\r
-    jassert (! stages.isEmpty());\r
+    jassert (! engines.isEmpty());\r
 \r
     if (isReady)\r
-        for (auto* stage : stages)\r
-           stage->reset();\r
+        for (auto n = 0; n < engines.size(); n++)\r
+            engines[n]->reset();\r
 }\r
 \r
 template <typename SampleType>\r
-typename dsp::AudioBlock<SampleType> Oversampling<SampleType>::processSamplesUp (const dsp::AudioBlock<SampleType>inputBlock) noexcept\r
+typename dsp::AudioBlock<SampleType> Oversampling<SampleType>::processSamplesUp (const dsp::AudioBlock<SampleType> &inputBlock) noexcept\r
 {\r
-    jassert (! stages.isEmpty());\r
+    jassert (! engines.isEmpty());\r
 \r
     if (! isReady)\r
-        return {};\r
+        return dsp::AudioBlock<SampleType>();\r
 \r
-    auto audioBlock = inputBlock;\r
+    dsp::AudioBlock<SampleType> audioBlock = inputBlock;\r
 \r
-    for (auto* stage : stages)\r
+    for (size_t n = 0; n < numStages; n++)\r
     {\r
-        stage->processSamplesUp (audioBlock);\r
-        audioBlock = stage->getProcessedSamples (audioBlock.getNumSamples() * stage->factor);\r
+        auto& engine = *engines[static_cast<int> (n)];\r
+        engine.processSamplesUp (audioBlock);\r
+        audioBlock = engine.getProcessedSamples (audioBlock.getNumSamples() * engine.getFactor());\r
     }\r
 \r
     return audioBlock;\r
 }\r
 \r
 template <typename SampleType>\r
-void Oversampling<SampleType>::processSamplesDown (dsp::AudioBlock<SampleType>outputBlock) noexcept\r
+void Oversampling<SampleType>::processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) noexcept\r
 {\r
-    jassert (! stages.isEmpty());\r
+    jassert (! engines.isEmpty());\r
 \r
     if (! isReady)\r
         return;\r
 \r
     auto currentNumSamples = outputBlock.getNumSamples();\r
 \r
-    for (int n = 0; n < stages.size() - 1; ++n)\r
-        currentNumSamples *= stages.getUnchecked(n)->factor;\r
+    for (size_t n = 0; n < numStages - 1; n++)\r
+        currentNumSamples *= engines[static_cast<int> (n)]->getFactor();\r
 \r
-    for (int n = stages.size() - 1; n > 0; --n)\r
+    for (size_t n = numStages - 1; n > 0; n--)\r
     {\r
-        auto& stage = *stages.getUnchecked(n);\r
-        auto audioBlock = stages.getUnchecked (n - 1)->getProcessedSamples (currentNumSamples);\r
-        stage.processSamplesDown (audioBlock);\r
+        auto& engine = *engines[static_cast<int> (n)];\r
+\r
+        auto audioBlock = engines[static_cast<int> (n - 1)]->getProcessedSamples (currentNumSamples);\r
+        engine.processSamplesDown (audioBlock);\r
 \r
-        currentNumSamples /= stage.factor;\r
+        currentNumSamples /= engine.getFactor();\r
     }\r
 \r
-    stages.getFirst()->processSamplesDown (outputBlock);\r
+    engines[static_cast<int> (0)]->processSamplesDown (outputBlock);\r
 }\r
 \r
 template class Oversampling<float>;\r
index d8befe023505984dad09adc13182591d88bff785..878d3e9030734982dbf720e9f442c30588cf1a46 100644 (file)
@@ -29,6 +29,11 @@ namespace juce
 namespace dsp\r
 {\r
 \r
+#ifndef DOXYGEN\r
+template <typename NumericType>\r
+class OversamplingEngine;\r
+#endif\r
+\r
 //===============================================================================\r
 /**\r
     A processing class performing multi-channel oversampling.\r
@@ -70,7 +75,7 @@ public:
         Constructor of the oversampling class. All the processing parameters must be\r
         provided at the creation of the oversampling object.\r
 \r
-        Note: You might want to create a class inheriting from Oversampling with a\r
+        Note : you might want to create a class heriting from Oversampling with a\r
         different constructor if you need more control on what happens in the process.\r
 \r
         @param numChannels      the number of channels to process with this object\r
@@ -81,15 +86,7 @@ public:
                                 the filters will be more efficient, but the CPU load will\r
                                 increase as well\r
     */\r
-    Oversampling (size_t numChannels,\r
-                  size_t factor,\r
-                  FilterType type,\r
-                  bool isMaxQuality = true);\r
-\r
-    /** Default constructor of the oversampling class, which can be used to create an\r
-        empty object and then add the appropriate stages.\r
-    */\r
-    explicit Oversampling (size_t numChannels = 1);\r
+    Oversampling (size_t numChannels, size_t factor, FilterType type, bool isMaxQuality = true);\r
 \r
     /** Destructor. */\r
     ~Oversampling();\r
@@ -100,7 +97,7 @@ public:
         the oversampling, for example with a dry / wet functionality, and to report\r
         the latency to the DAW.\r
 \r
-        Note: The latency might not be integer, so you might need to round its value\r
+        Note : the latency might not be integer, so you might need to round its value\r
         or to compensate it properly in your processing code.\r
     */\r
     SampleType getLatencyInSamples() noexcept;\r
@@ -124,37 +121,27 @@ public:
         Don't forget to set the sample rate of that processing to N times the original\r
         sample rate.\r
     */\r
-    dsp::AudioBlock<SampleType> processSamplesUp (const dsp::AudioBlock<SampleType>inputBlock) noexcept;\r
+    dsp::AudioBlock<SampleType> processSamplesUp (const dsp::AudioBlock<SampleType> &inputBlock) noexcept;\r
 \r
     /** Must be called to perform the downsampling, after the upsampling and the\r
         non-linear processing. The output signal is probably delayed by the internal\r
         latency of the whole oversampling behaviour, so don't forget to take this\r
         into account.\r
     */\r
-    void processSamplesDown (dsp::AudioBlock<SampleType>& outputBlock) noexcept;\r
-\r
-    //===============================================================================\r
-    void addOversamplingStage (FilterType,\r
-                               float normalizedTransitionWidthUp, float stopbandAttenuationdBUp,\r
-                               float normalizedTransitionWidthDown, float stopbandAttenuationdBDown);\r
-\r
-    void addDummyOversamplingStage();\r
-\r
-    void clearOversamplingStages();\r
+    void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) noexcept;\r
 \r
+private:\r
     //===============================================================================\r
-    size_t factorOversampling = 1;\r
-    size_t numChannels = 1;\r
-\r
-   #ifndef DOXYGEN\r
-    struct OversamplingStage;\r
-   #endif\r
+    bool isMaximumQuality;\r
+    size_t factorOversampling, numStages;\r
+    FilterType type;\r
+    size_t numChannels;\r
 \r
-private:\r
     //===============================================================================\r
-    OwnedArray<OversamplingStage> stages;\r
     bool isReady = false;\r
 \r
+    OwnedArray<OversamplingEngine<SampleType>> engines;\r
+\r
     //===============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Oversampling)\r
 };\r
index 280945bc60db8eef21a29b44eef99ba2b7ee7a0d..398ba8131ae77cf30c0a126c2a78d7ce845ba1fe 100644 (file)
@@ -44,7 +44,6 @@ struct ProcessorDuplicator
 {\r
     ProcessorDuplicator() : state (new StateType()) {}\r
     ProcessorDuplicator (StateType* stateToUse) : state (stateToUse) {}\r
-    ProcessorDuplicator (typename StateType::Ptr stateToUse) : state (static_cast<typename StateType::Ptr&&> (stateToUse)) {}\r
     ProcessorDuplicator (const ProcessorDuplicator&) = default;\r
     ProcessorDuplicator (ProcessorDuplicator&&) = default;\r
 \r
index 2e8b1b0aaf026d101729075236226418a8e79b6e..6caed43f7a02a96f65051bd7c8bd32e79492b5f7 100644 (file)
@@ -44,7 +44,7 @@ namespace StateVariableFilter
         structures for more information). Its behaviour is based on the analog\r
         state variable filter circuit.\r
 \r
-        Note: The bandpass here is not the one in the RBJ CookBook, its gain can be\r
+        Note : the bandpass here is not the one in the RBJ CookBook, its gain can be\r
         higher than 0 dB. For the classic 0 dB bandpass, we need to multiply the\r
         result with R2\r
 \r
@@ -60,14 +60,11 @@ namespace StateVariableFilter
         */\r
         using NumericType = typename SampleTypeHelpers::ElementType<SampleType>::Type;\r
 \r
-        /** A typedef for a ref-counted pointer to the coefficients object */\r
-        using ParametersPtr = typename Parameters<NumericType>::Ptr;\r
-\r
         //==============================================================================\r
         /** Creates a filter with default parameters. */\r
-        Filter()                               : parameters (new Parameters<NumericType>) { reset(); }\r
+        Filter()                            : parameters (new Parameters<NumericType>) { reset(); }\r
 \r
-        Filter (ParametersPtr parametersToUse) : parameters (static_cast<ParametersPtr&&> (parametersToUse)) { reset(); }\r
+        Filter (Parameters<NumericType>* paramtersToUse) : parameters (paramtersToUse) { reset(); }\r
 \r
         /** Creates a copy of another filter. */\r
         Filter (const Filter&) = default;\r
@@ -89,7 +86,7 @@ namespace StateVariableFilter
         void snapToZero() noexcept                     { util::snapToZero (s1); util::snapToZero (s2); }\r
 \r
         //==============================================================================\r
-        /** The parameters of the state variable filter. It's up to the caller to ensure\r
+        /** The parameters of the state variable filter. It's up to the called to ensure\r
             that these parameters are modified in a thread-safe way. */\r
         typename Parameters<NumericType>::Ptr parameters;\r
 \r
@@ -203,8 +200,7 @@ namespace StateVariableFilter
         Type type = Type::lowPass;\r
 \r
         /** Sets the cutoff frequency and resonance of the IIR filter.\r
-\r
-            Note: The bandwidth of the resonance increases with the value of the\r
+            Note : the bandwidth of the resonance increases with the value of the\r
             parameter. To have a standard 12 dB/octave filter, the value must be set\r
             at 1 / sqrt(2).\r
         */\r
index 7112a8116a6a2cf1350e9defb747569b52046ea8..9efb3a9e1dd3cea4c3619dcab5b3041cd16a8d71 100644 (file)
@@ -35,7 +35,7 @@ public:
 \r
     void messageCallback() override\r
     {\r
-        if (auto b = broadcaster.get())\r
+        if (const ActionBroadcaster* const b = broadcaster)\r
             if (b->actionListeners.contains (listener))\r
                 listener->actionListenerCallback (message);\r
     }\r
@@ -52,13 +52,13 @@ private:
 ActionBroadcaster::ActionBroadcaster()\r
 {\r
     // are you trying to create this object before or after juce has been intialised??\r
-    JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+    jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
 }\r
 \r
 ActionBroadcaster::~ActionBroadcaster()\r
 {\r
     // all event-based objects must be deleted BEFORE juce is shut down!\r
-    JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+    jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
 }\r
 \r
 void ActionBroadcaster::addActionListener (ActionListener* const listener)\r
index 66795e476b6248bfb0719a969981a42561d48af3..8d9a20e5a9fb65105106ad538dbab34307e507ae 100644 (file)
@@ -43,7 +43,7 @@ public:
 //==============================================================================\r
 AsyncUpdater::AsyncUpdater()\r
 {\r
-    activeMessage = *new AsyncUpdaterMessage (*this);\r
+    activeMessage = new AsyncUpdaterMessage (*this);\r
 }\r
 \r
 AsyncUpdater::~AsyncUpdater()\r
@@ -63,7 +63,7 @@ void AsyncUpdater::triggerAsyncUpdate()
 {\r
     // If you're calling this before (or after) the MessageManager is\r
     // running, then you're not going to get any callbacks!\r
-    JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+    jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
 \r
     if (activeMessage->shouldDeliver.compareAndSetBool (1, 0))\r
         if (! activeMessage->post())\r
@@ -79,7 +79,7 @@ void AsyncUpdater::cancelPendingUpdate() noexcept
 void AsyncUpdater::handleUpdateNowIfNeeded()\r
 {\r
     // This can only be called by the event thread.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
     if (activeMessage->shouldDeliver.exchange (0) != 0)\r
         handleAsyncUpdate();\r
index 0b8941c79de7900b7c102ff2d7b9cdc8b161b61c..5b7298a2b5d2d998e0f20b26ac149f1ad13c830d 100644 (file)
@@ -36,7 +36,7 @@ void ChangeBroadcaster::addChangeListener (ChangeListener* const listener)
 {\r
     // Listeners can only be safely added when the event thread is locked\r
     // You can  use a MessageManagerLock if you need to call this from another thread.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
     changeListeners.add (listener);\r
 }\r
@@ -45,7 +45,7 @@ void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener)
 {\r
     // Listeners can only be safely removed when the event thread is locked\r
     // You can  use a MessageManagerLock if you need to call this from another thread.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
     changeListeners.remove (listener);\r
 }\r
@@ -54,7 +54,7 @@ void ChangeBroadcaster::removeAllChangeListeners()
 {\r
     // Listeners can only be safely removed when the event thread is locked\r
     // You can  use a MessageManagerLock if you need to call this from another thread.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
     changeListeners.clear();\r
 }\r
@@ -68,7 +68,7 @@ void ChangeBroadcaster::sendChangeMessage()
 void ChangeBroadcaster::sendSynchronousChangeMessage()\r
 {\r
     // This can only be called by the event thread.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
     broadcastCallback.cancelPendingUpdate();\r
     callListeners();\r
index 5cd8564f77c7ad21e8c753b3f50ca5805604b2a5..0e522e25a6bc8caca695e137ec28a36bf2f6189c 100644 (file)
@@ -104,6 +104,8 @@ public:
 \r
 private:\r
     struct Connection;\r
+    friend struct Connection;\r
+    friend struct ContainerDeletePolicy<Connection>;\r
     std::unique_ptr<Connection> connection;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessSlave)\r
@@ -192,6 +194,8 @@ private:
     std::unique_ptr<ChildProcess> childProcess;\r
 \r
     struct Connection;\r
+    friend struct Connection;\r
+    friend struct ContainerDeletePolicy<Connection>;\r
     std::unique_ptr<Connection> connection;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessMaster)\r
index 43e207a0deec9bd9ae8805c7d5c551f120103c70..26b723368e0c7ec9db074d383c3898842a693a66 100644 (file)
@@ -197,8 +197,9 @@ private:
     int readData (void*, int);\r
 \r
     struct ConnectionThread;\r
+    friend struct ConnectionThread;\r
+    friend struct ContainerDeletePolicy<ConnectionThread>;\r
     std::unique_ptr<ConnectionThread> thread;\r
-\r
     void runThread();\r
     int writeData (void*, int);\r
 \r
diff --git a/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp b/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp
deleted file mode 100644 (file)
index 1e5474f..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-NetworkServiceDiscovery::Advertiser::Advertiser (const String& serviceTypeUID,\r
-                                                 const String& serviceDescription,\r
-                                                 int broadcastPortToUse, int connectionPort,\r
-                                                 RelativeTime minTimeBetweenBroadcasts)\r
-    : Thread ("Discovery_broadcast"),\r
-      message (serviceTypeUID), broadcastPort (broadcastPortToUse),\r
-      minInterval (minTimeBetweenBroadcasts)\r
-{\r
-    message.setAttribute ("id", Uuid().toString());\r
-    message.setAttribute ("name", serviceDescription);\r
-    message.setAttribute ("address", String());\r
-    message.setAttribute ("port", connectionPort);\r
-\r
-    startThread (2);\r
-}\r
-\r
-NetworkServiceDiscovery::Advertiser::~Advertiser()\r
-{\r
-    stopThread (2000);\r
-    socket.shutdown();\r
-}\r
-\r
-void NetworkServiceDiscovery::Advertiser::run()\r
-{\r
-    if (! socket.bindToPort (0))\r
-    {\r
-        jassertfalse;\r
-        return;\r
-    }\r
-\r
-    while (! threadShouldExit())\r
-    {\r
-        sendBroadcast();\r
-        wait ((int) minInterval.inMilliseconds());\r
-    }\r
-}\r
-\r
-void NetworkServiceDiscovery::Advertiser::sendBroadcast()\r
-{\r
-    auto localAddress = IPAddress::getLocalAddress();\r
-    message.setAttribute ("address", localAddress.toString());\r
-    auto broadcastAddress = IPAddress::getInterfaceBroadcastAddress (localAddress);\r
-    auto data = message.createDocument ({}, true, false);\r
-    socket.write (broadcastAddress.toString(), broadcastPort, data.toRawUTF8(), (int) data.getNumBytesAsUTF8());\r
-}\r
-\r
-//==============================================================================\r
-NetworkServiceDiscovery::AvailableServiceList::AvailableServiceList (const String& serviceType, int broadcastPort)\r
-    : Thread ("Discovery_listen"), serviceTypeUID (serviceType)\r
-{\r
-    socket.bindToPort (broadcastPort);\r
-    startThread (2);\r
-}\r
-\r
-NetworkServiceDiscovery::AvailableServiceList::~AvailableServiceList()\r
-{\r
-    socket.shutdown();\r
-    stopThread (2000);\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::run()\r
-{\r
-    while (! threadShouldExit())\r
-    {\r
-        if (socket.waitUntilReady (true, 200) == 1)\r
-        {\r
-            char buffer[1024];\r
-            auto bytesRead = socket.read (buffer, sizeof (buffer) - 1, false);\r
-\r
-            if (bytesRead > 10)\r
-                if (auto xml = parseXML (String (CharPointer_UTF8 (buffer),\r
-                                                 CharPointer_UTF8 (buffer + bytesRead))))\r
-                    if (xml->hasTagName (serviceTypeUID))\r
-                        handleMessage (*xml);\r
-        }\r
-\r
-        removeTimedOutServices();\r
-    }\r
-}\r
-\r
-std::vector<NetworkServiceDiscovery::Service> NetworkServiceDiscovery::AvailableServiceList::getServices() const\r
-{\r
-    const ScopedLock sl (listLock);\r
-    auto listCopy = services;\r
-    return listCopy;\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::handleAsyncUpdate()\r
-{\r
-    if (onChange != nullptr)\r
-        onChange();\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::handleMessage (const XmlElement& xml)\r
-{\r
-    Service service;\r
-    service.instanceID = xml.getStringAttribute ("id");\r
-\r
-    if (service.instanceID.trim().isNotEmpty())\r
-    {\r
-        service.description = xml.getStringAttribute ("name");\r
-        service.address = IPAddress (xml.getStringAttribute ("address"));\r
-        service.port = xml.getIntAttribute ("port");\r
-        service.lastSeen = Time::getCurrentTime();\r
-\r
-        handleMessage (service);\r
-    }\r
-}\r
-\r
-static void sortServiceList (std::vector<NetworkServiceDiscovery::Service>& services)\r
-{\r
-    auto compareServices = [] (const NetworkServiceDiscovery::Service& s1,\r
-                               const NetworkServiceDiscovery::Service& s2)\r
-    {\r
-        return s1.instanceID < s2.instanceID;\r
-    };\r
-\r
-    std::sort (services.begin(), services.end(), compareServices);\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::handleMessage (const Service& service)\r
-{\r
-    const ScopedLock sl (listLock);\r
-\r
-    for (auto& s : services)\r
-    {\r
-        if (s.instanceID == service.instanceID)\r
-        {\r
-            if (s.description != service.description\r
-                 || s.address != service.address\r
-                 || s.port != service.port)\r
-            {\r
-                s = service;\r
-                triggerAsyncUpdate();\r
-            }\r
-\r
-            s.lastSeen = service.lastSeen;\r
-            return;\r
-        }\r
-    }\r
-\r
-    services.push_back (service);\r
-    sortServiceList (services);\r
-    triggerAsyncUpdate();\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::removeTimedOutServices()\r
-{\r
-    const double timeoutSeconds = 5.0;\r
-    auto oldestAllowedTime = Time::getCurrentTime() - RelativeTime::seconds (timeoutSeconds);\r
-\r
-    const ScopedLock sl (listLock);\r
-\r
-    auto oldEnd = std::end (services);\r
-    auto newEnd = std::remove_if (std::begin (services), oldEnd,\r
-                                  [=] (const Service& s) { return s.lastSeen < oldestAllowedTime; });\r
-\r
-    if (newEnd != oldEnd)\r
-    {\r
-        services.erase (newEnd, oldEnd);\r
-        triggerAsyncUpdate();\r
-    }\r
-}\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h b/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h
deleted file mode 100644 (file)
index 63e3e4f..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
-    Contains classes that implement a simple protocol for broadcasting the availability\r
-    and location of a discoverable service on the local network, and for maintaining a\r
-    list of known services.\r
-*/\r
-struct NetworkServiceDiscovery\r
-{\r
-    /** An object which runs a thread to repeatedly broadcast the existence of a\r
-        discoverable service.\r
-\r
-        To use, simply create an instance of an Advertiser and it'll broadcast until\r
-        you delete it.\r
-    */\r
-    struct Advertiser  : private Thread\r
-    {\r
-        /** Creates and starts an Advertiser thread, broadcasting with the given properties.\r
-            @param serviceTypeUID       A user-supplied string to define the type of service this represents\r
-            @param serviceDescription   A description string that will appear in the Service::description field for clients\r
-            @param broadcastPort        The port number on which to broadcast the service discovery packets\r
-            @param connectionPort       The port number that will be sent to appear in the Service::port field\r
-            @param minTimeBetweenBroadcasts   The interval to wait between sending broadcast messages\r
-        */\r
-        Advertiser (const String& serviceTypeUID,\r
-                    const String& serviceDescription,\r
-                    int broadcastPort,\r
-                    int connectionPort,\r
-                    RelativeTime minTimeBetweenBroadcasts = RelativeTime::seconds (1.5));\r
-\r
-        /** Destructor */\r
-        ~Advertiser();\r
-\r
-    private:\r
-        XmlElement message;\r
-        const int broadcastPort;\r
-        const RelativeTime minInterval;\r
-        DatagramSocket socket { true };\r
-\r
-        void run() override;\r
-        void sendBroadcast();\r
-    };\r
-\r
-    //==============================================================================\r
-    /**\r
-        Contains information about a service that has been found on the network.\r
-        @see AvailableServiceList, Advertiser\r
-    */\r
-    struct Service\r
-    {\r
-        String instanceID;   /**< A UUID that identifies the particular instance of the Advertiser class.  */\r
-        String description;  /**< The service description as sent by the Advertiser */\r
-        IPAddress address;   /**< The IP address of the advertiser */\r
-        int port;            /**< The port number of the advertiser */\r
-        Time lastSeen;       /**< The time of the last ping received from the advertiser */\r
-    };\r
-\r
-    //==============================================================================\r
-    /**\r
-        Watches the network for broadcasts from Advertiser objects, and keeps a list of\r
-        all the currently active instances.\r
-\r
-        Just create an instance of AvailableServiceList and it will start listening - you\r
-        can register a callback with its onChange member to find out when services\r
-        appear/disappear, and you can call getServices() to find out the current list.\r
-        @see Service, Advertiser\r
-    */\r
-    struct AvailableServiceList  : private Thread,\r
-                                   private AsyncUpdater\r
-    {\r
-        /** Creates an AvailableServiceList that will bind to the given port number and watch\r
-            the network for Advertisers broadcasting the given service type.\r
-\r
-            This will only detect broadcasts from an Advertiser object with a matching\r
-            serviceTypeUID value, and where the broadcastPort matches.\r
-        */\r
-        AvailableServiceList (const String& serviceTypeUID, int broadcastPort);\r
-\r
-        /** Destructor */\r
-        ~AvailableServiceList();\r
-\r
-        /** A lambda that can be set to recieve a callback when the list changes */\r
-        std::function<void()> onChange;\r
-\r
-        /** Returns a list of the currently known services. */\r
-        std::vector<Service> getServices() const;\r
-\r
-    private:\r
-        DatagramSocket socket { true };\r
-        String serviceTypeUID;\r
-        CriticalSection listLock;\r
-        std::vector<Service> services;\r
-\r
-        void run() override;\r
-        void handleAsyncUpdate() override;\r
-        void handleMessage (const XmlElement&);\r
-        void handleMessage (const Service&);\r
-        void removeTimedOutServices();\r
-    };\r
-};\r
-\r
-} // namespace juce\r
index a29883f92a32ad2b460dae69b6594b6275845049..bee0e3dff2fc40620bb7c3887d44213d5730717c 100644 (file)
@@ -66,7 +66,6 @@
 #include "interprocess/juce_InterprocessConnection.cpp"\r
 #include "interprocess/juce_InterprocessConnectionServer.cpp"\r
 #include "interprocess/juce_ConnectedChildProcess.cpp"\r
-#include "interprocess/juce_NetworkServiceDiscovery.cpp"\r
 \r
 //==============================================================================\r
 #if JUCE_MAC || JUCE_IOS\r
index 901acf02f8de1a20eb3418a403ed079b4cc757e0..52552ce396a5f7353368a9cc536bb4da8ff66ff8 100644 (file)
@@ -31,7 +31,7 @@
 \r
   ID:               juce_events\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE message and event handling classes\r
   description:      Classes for running an application's main event loop and sending/receiving messages, timers, etc.\r
   website:          http://www.juce.com/juce\r
 #endif\r
 \r
 #if JUCE_EVENTS_INCLUDE_WINRT_WRAPPER && JUCE_WINDOWS\r
- // If this header file is missing then you are probably attempting to use WinRT\r
- // functionality without the WinRT libraries installed on your system. Try installing\r
- // the latest Windows Standalone SDK and maybe also adding the path to the WinRT\r
- // headers to your build system. This path should have the form\r
- // "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
- #include <inspectable.h>\r
  #include <hstring.h>\r
 #endif\r
 \r
@@ -87,7 +81,6 @@
 #include "interprocess/juce_InterprocessConnection.h"\r
 #include "interprocess/juce_InterprocessConnectionServer.h"\r
 #include "interprocess/juce_ConnectedChildProcess.h"\r
-#include "interprocess/juce_NetworkServiceDiscovery.h"\r
 \r
 #if JUCE_LINUX\r
  #include "native/juce_linux_EventLoop.h"\r
index bd10c17023c78d3255b56817c79c1f6ee6873eb1..5f8ab68257b247b9b9b7b77f410273a7e5931478 100644 (file)
@@ -23,7 +23,7 @@
 namespace juce\r
 {\r
 \r
-JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance = nullptr;\r
+JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance = 0;\r
 JUCEApplicationBase* JUCEApplicationBase::appInstance = nullptr;\r
 \r
 #if JUCE_IOS\r
index a5f0260c4fb8355fa4f9b944467570f4de362efe..6d0f9c562f03ade2a8485b36a3df721d2ebe426d 100644 (file)
@@ -107,11 +107,9 @@ public:
         If your application class returns true for this, more than one instance is\r
         permitted to run (except on the Mac where this isn't possible).\r
 \r
-        If it's false, the second instance won't start, but you will still get a\r
+        If it's false, the second instance won't start, but it you will still get a\r
         callback to anotherInstanceStarted() to tell you about this - which\r
         gives you a chance to react to what the user was trying to do.\r
-\r
-        @see anotherInstanceStarted\r
     */\r
     virtual bool moreThanOneInstanceAllowed() = 0;\r
 \r
@@ -153,9 +151,6 @@ public:
     /** Indicates that the user has tried to start up another instance of the app.\r
 \r
         This will get called even if moreThanOneInstanceAllowed() is false.\r
-        It is currently only implemented on Windows and Mac.\r
-\r
-        @see moreThanOneInstanceAllowed\r
     */\r
     virtual void anotherInstanceStarted (const String& commandLine) = 0;\r
 \r
@@ -275,7 +270,7 @@ public:
     static int main (int argc, const char* argv[]);\r
 \r
     static void appWillTerminateByForce();\r
-    using CreateInstanceFunction = JUCEApplicationBase* (*)();\r
+    typedef JUCEApplicationBase* (*CreateInstanceFunction)();\r
     static CreateInstanceFunction createInstance;\r
 \r
    #if JUCE_IOS\r
@@ -295,6 +290,8 @@ private:
     bool stillInitialising = true;\r
 \r
     struct MultipleInstanceHandler;\r
+    friend struct MultipleInstanceHandler;\r
+    friend struct ContainerDeletePolicy<MultipleInstanceHandler>;\r
     std::unique_ptr<MultipleInstanceHandler> multipleInstanceHandler;\r
 \r
     JUCE_DECLARE_NON_COPYABLE (JUCEApplicationBase)\r
index 9fa1ef31f473a18c43fb862ef347f5745e956e84..0a2985fb0c9d8c11cd517e7b4474e7ef22ed69b5 100644 (file)
@@ -155,7 +155,7 @@ public:
 \r
   #if JUCE_IOS\r
     /**\r
-       You can instruct JUCE to use a custom iOS app delegate class instead of JUCE's default\r
+       You can instruct JUCE to use a custom iOS app delegate class instaed of JUCE's default\r
        app delegate. For JUCE to work you must pass all messages to JUCE's internal app delegate.\r
        Below is an example of minimal forwarding custom delegate. Note that you are at your own\r
        risk if you decide to use your own delegate and subtle, hard to debug bugs may occur.\r
index 78f18aa2d7eef30b75db4b52ec5e57eca28223e1..741122d963df6d3e30fd2975605e3e5de8a9df23 100644 (file)
@@ -35,7 +35,7 @@ void Message::messageCallback()
 MessageListener::MessageListener() noexcept\r
 {\r
     // Are you trying to create a messagelistener before or after juce has been intialised??\r
-    JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+    jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
 }\r
 \r
 MessageListener::~MessageListener()\r
index 81ecbba31f9bf6c3529ffabdb07731332f9730e0..320b41aeee8c074d5e2868b2cd0aa1c491c3e6d7 100644 (file)
@@ -231,22 +231,6 @@ bool MessageManager::currentThreadHasLockedMessageManager() const noexcept
     return thisThread == messageThreadId || thisThread == threadWithLock.get();\r
 }\r
 \r
-bool MessageManager::existsAndIsLockedByCurrentThread() noexcept\r
-{\r
-    if (auto i = getInstanceWithoutCreating())\r
-        return i->currentThreadHasLockedMessageManager();\r
-\r
-    return false;\r
-}\r
-\r
-bool MessageManager::existsAndIsCurrentThread() noexcept\r
-{\r
-    if (auto i = getInstanceWithoutCreating())\r
-        return i->isThisTheMessageThread();\r
-\r
-    return false;\r
-}\r
-\r
 //==============================================================================\r
 //==============================================================================\r
 /*  The only safe way to lock the message thread while another thread does\r
@@ -310,7 +294,7 @@ bool MessageManager::Lock::tryAcquire (bool lockIsMandatory) const noexcept
 \r
     try\r
     {\r
-        blockingMessage = *new BlockingMessage (this);\r
+        blockingMessage = new BlockingMessage (this);\r
     }\r
     catch (...)\r
     {\r
@@ -365,7 +349,7 @@ void MessageManager::Lock::exit() const noexcept
         lockGained.set (0);\r
 \r
         if (mm != nullptr)\r
-            mm->threadWithLock = {};\r
+            mm->threadWithLock = 0;\r
 \r
         if (blockingMessage != nullptr)\r
         {\r
index 4518cb40666f5e6c1467c6b6b191a33c61ebd7e8..345b80349e5dba5c9d2c4d751c66e778fb5fccc1 100644 (file)
@@ -35,7 +35,7 @@ class OpenGLContext;
 \r
 //==============================================================================\r
 /** See MessageManager::callFunctionOnMessageThread() for use of this function type. */\r
-using MessageCallbackFunction = void* (void* userData);\r
+typedef void* (MessageCallbackFunction) (void* userData);\r
 \r
 \r
 //==============================================================================\r
@@ -147,16 +147,6 @@ public:
     */\r
     bool currentThreadHasLockedMessageManager() const noexcept;\r
 \r
-    /** Returns true if there's an instance of the MessageManager, and if the current thread\r
-        has the lock on it.\r
-    */\r
-    static bool existsAndIsLockedByCurrentThread() noexcept;\r
-\r
-    /** Returns true if there's an instance of the MessageManager, and if the current thread\r
-        is running it.\r
-    */\r
-    static bool existsAndIsCurrentThread() noexcept;\r
-\r
     //==============================================================================\r
     /** Sends a message to all other JUCE applications that are running.\r
 \r
@@ -290,13 +280,13 @@ public:
 \r
         //==============================================================================\r
         /** Provides the type of scoped lock to use with a CriticalSection. */\r
-        using ScopedLockType = GenericScopedLock<Lock>;\r
+        typedef GenericScopedLock<Lock>       ScopedLockType;\r
 \r
         /** Provides the type of scoped unlocker to use with a CriticalSection. */\r
-        using ScopedUnlockType = GenericScopedUnlock<Lock>;\r
+        typedef GenericScopedUnlock<Lock>     ScopedUnlockType;\r
 \r
         /** Provides the type of scoped try-locker to use with a CriticalSection. */\r
-        using ScopedTryLockType = GenericScopedTryLock<Lock>;\r
+        typedef GenericScopedTryLock<Lock>    ScopedTryLockType;\r
 \r
     private:\r
         struct BlockingMessage;\r
@@ -472,28 +462,4 @@ private:
     JUCE_DECLARE_NON_COPYABLE (MessageManagerLock)\r
 };\r
 \r
-//==============================================================================\r
-/** This macro is used to catch unsafe use of functions which expect to only be called\r
-    on the message thread, or when a MessageManagerLock is in place.\r
-    It will also fail if you try to use the function before the message manager has been\r
-    created, which could happen if you accidentally invoke it during a static constructor.\r
-*/\r
-#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED \\r
-    jassert (juce::MessageManager::existsAndIsLockedByCurrentThread());\r
-\r
-/** This macro is used to catch unsafe use of functions which expect to only be called\r
-    on the message thread.\r
-    It will also fail if you try to use the function before the message manager has been\r
-    created, which could happen if you accidentally invoke it during a static constructor.\r
-*/\r
-#define JUCE_ASSERT_MESSAGE_THREAD \\r
-    jassert (juce::MessageManager::existsAndIsCurrentThread());\r
-\r
-/** This macro is used to catch unsafe use of functions which expect to not be called\r
-    outside the lifetime of the MessageManager.\r
-*/\r
-#define JUCE_ASSERT_MESSAGE_MANAGER_EXISTS \\r
-    jassert (juce::MessageManager::getInstanceWithoutCreating() != nullptr);\r
-\r
-\r
 } // namespace juce\r
index d1bade84a70a60ac6e36603500038df3b68c18fa..d9883da2df2b968741fed14eb93da6e137b31470 100644 (file)
@@ -48,6 +48,7 @@ public:
 \r
 private:\r
     JUCE_PUBLIC_IN_DLL_BUILD (struct Pimpl)\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MountedVolumeListChangeDetector)\r
index a43d97a9d9493ca772398ec36c9aff32f3299979..abc5e6bcee7f82b6d171d72d2b020da58f3006f0 100644 (file)
@@ -78,7 +78,7 @@ struct AndroidMessageQueue     : private Android::Runnable
 \r
     ~AndroidMessageQueue()\r
     {\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
         clearSingletonInstance();\r
     }\r
 \r
@@ -94,7 +94,7 @@ private:
 \r
     void run() override\r
     {\r
-        for (;;)\r
+        while (true)\r
         {\r
             MessageManager::MessageBase::Ptr message (queue.removeAndReturn (0));\r
 \r
index 01463e8da1df5a7bb8cb951b33406b10f3492e08..ef6749cb81c08bf9efd243add49f0709551accab 100644 (file)
 namespace juce\r
 {\r
 \r
-using AppFocusChangeCallback = void (*)();\r
+typedef void (*AppFocusChangeCallback)();\r
 AppFocusChangeCallback appFocusChangeCallback = nullptr;\r
 \r
-using CheckEventBlockedByModalComps = bool (*)(NSEvent*);\r
+typedef bool (*CheckEventBlockedByModalComps) (NSEvent*);\r
 CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr;\r
 \r
-using MenuTrackingChangedCallback = void (*)(bool);\r
+typedef void (*MenuTrackingChangedCallback)(bool);\r
 MenuTrackingChangedCallback menuTrackingChangedCallback = nullptr;\r
 \r
 //==============================================================================\r
index d9eabdf5cddd36ed8486b556f1a0d8ffc742854a..b3760e23a066ef569dbeb3ed40cc3adf7314a727 100644 (file)
@@ -25,16 +25,12 @@ namespace juce
 \r
 extern HWND juce_messageWindowHandle;\r
 \r
-using CheckEventBlockedByModalComps = bool (*)(const MSG&);\r
+typedef bool (*CheckEventBlockedByModalComps) (const MSG&);\r
 CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr;\r
 \r
-using SettingChangeCallbackFunc = void (*)(void);\r
+typedef void (*SettingChangeCallbackFunc) (void);\r
 SettingChangeCallbackFunc settingChangeCallback = nullptr;\r
 \r
-#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
- bool juce_isRunningInUnity();\r
-#endif\r
-\r
 //==============================================================================\r
 namespace WindowsMessageHelpers\r
 {\r
@@ -46,7 +42,7 @@ namespace WindowsMessageHelpers
 \r
     void dispatchMessageFromLParam (LPARAM lParam)\r
     {\r
-        if (auto message = reinterpret_cast<MessageManager::MessageBase*> (lParam))\r
+        if (MessageManager::MessageBase* message = reinterpret_cast<MessageManager::MessageBase*> (lParam))\r
         {\r
             JUCE_TRY\r
             {\r
@@ -72,7 +68,7 @@ namespace WindowsMessageHelpers
         return TRUE;\r
     }\r
 \r
-    void handleBroadcastMessage (const COPYDATASTRUCT* data)\r
+    void handleBroadcastMessage (const COPYDATASTRUCT* const data)\r
     {\r
         if (data != nullptr && data->dwData == broadcastMessageMagicNumber)\r
         {\r
@@ -91,7 +87,7 @@ namespace WindowsMessageHelpers
     }\r
 \r
     //==============================================================================\r
-    LRESULT CALLBACK messageWndProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) noexcept\r
+    LRESULT CALLBACK messageWndProc (HWND h, const UINT message, const WPARAM wParam, const LPARAM lParam) noexcept\r
     {\r
         if (h == juce_messageWindowHandle)\r
         {\r
@@ -108,10 +104,11 @@ namespace WindowsMessageHelpers
                 handleBroadcastMessage (reinterpret_cast<const COPYDATASTRUCT*> (lParam));\r
                 return 0;\r
             }\r
-\r
-            if (message == WM_SETTINGCHANGE)\r
+            else if (message == WM_SETTINGCHANGE)\r
+            {\r
                 if (settingChangeCallback != nullptr)\r
                     settingChangeCallback();\r
+            }\r
         }\r
 \r
         return DefWindowProc (h, message, wParam, lParam);\r
@@ -123,7 +120,7 @@ LRESULT juce_offerEventToActiveXControl (::MSG&);
 #endif\r
 \r
 //==============================================================================\r
-bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages)\r
+bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPendingMessages)\r
 {\r
     using namespace WindowsMessageHelpers;\r
     MSG m;\r
@@ -133,10 +130,10 @@ bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMes
 \r
     if (GetMessage (&m, (HWND) 0, 0, 0) >= 0)\r
     {\r
-       #if JUCE_MODULE_AVAILABLE_juce_gui_extra\r
+      #if JUCE_MODULE_AVAILABLE_juce_gui_extra\r
         if (juce_offerEventToActiveXControl (m) != S_FALSE)\r
             return true;\r
-       #endif\r
+      #endif\r
 \r
         if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle)\r
         {\r
@@ -154,7 +151,7 @@ bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMes
             {\r
                 // if it's someone else's window being clicked on, and the focus is\r
                 // currently on a juce window, pass the kb focus over..\r
-                auto currentFocus = GetFocus();\r
+                HWND currentFocus = GetFocus();\r
 \r
                 if (currentFocus == 0 || JuceWindowIdentifier::isJUCEWindow (currentFocus))\r
                     SetFocus (m.hwnd);\r
@@ -171,18 +168,12 @@ bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMes
 bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message)\r
 {\r
     message->incReferenceCount();\r
-\r
-   #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
-    if (juce_isRunningInUnity())\r
-        return SendNotifyMessage (juce_messageWindowHandle, WindowsMessageHelpers::customMessageID, 0, (LPARAM) message) != 0;\r
-   #endif\r
-\r
     return PostMessage (juce_messageWindowHandle, WindowsMessageHelpers::customMessageID, 0, (LPARAM) message) != 0;\r
 }\r
 \r
 void MessageManager::broadcastMessage (const String& value)\r
 {\r
-    auto localCopy = value;\r
+    const String localCopy (value);\r
 \r
     Array<HWND> windows;\r
     EnumWindows (&WindowsMessageHelpers::broadcastEnumWindowProc, (LPARAM) &windows);\r
index c90fdaffe072703ade40e30b93fb8f9cfb0b1cd9..75b774f0d6951ea89a3011523e7ff50f325f8e74 100644 (file)
 \r
 namespace juce\r
 {\r
-\r
-WinRTWrapper::ScopedHString::ScopedHString (String str)\r
-{\r
-    if (WinRTWrapper::getInstance()->isInitialised())\r
-        WinRTWrapper::getInstance()->createHString (str.toWideCharPointer(),\r
-                                                    static_cast<uint32_t> (str.length()),\r
-                                                    &hstr);\r
-}\r
-\r
-WinRTWrapper::ScopedHString::~ScopedHString()\r
-{\r
-    if (WinRTWrapper::getInstance()->isInitialised() && hstr != nullptr)\r
-        WinRTWrapper::getInstance()->deleteHString (hstr);\r
-}\r
-\r
-WinRTWrapper::~WinRTWrapper()\r
-{\r
-    if (winRTHandle != nullptr)\r
-        ::FreeLibrary (winRTHandle);\r
-\r
-    clearSingletonInstance();\r
-}\r
-\r
-String WinRTWrapper::hStringToString (HSTRING hstr)\r
-{\r
-    if (isInitialised())\r
-        if (const wchar_t* str = getHStringRawBuffer (hstr, nullptr))\r
-            return String (str);\r
-\r
-    return {};\r
-}\r
-\r
-WinRTWrapper::WinRTWrapper()\r
-{\r
-    winRTHandle = ::LoadLibraryA ("api-ms-win-core-winrt-l1-1-0");\r
-\r
-    if (winRTHandle == nullptr)\r
-        return;\r
-\r
-    roInitialize           = (RoInitializeFuncPtr)              ::GetProcAddress (winRTHandle, "RoInitialize");\r
-    createHString          = (WindowsCreateStringFuncPtr)       ::GetProcAddress (winRTHandle, "WindowsCreateString");\r
-    deleteHString          = (WindowsDeleteStringFuncPtr)       ::GetProcAddress (winRTHandle, "WindowsDeleteString");\r
-    getHStringRawBuffer    = (WindowsGetStringRawBufferFuncPtr) ::GetProcAddress (winRTHandle, "WindowsGetStringRawBuffer");\r
-    roActivateInstance     = (RoActivateInstanceFuncPtr)        ::GetProcAddress (winRTHandle, "RoActivateInstance");\r
-    roGetActivationFactory = (RoGetActivationFactoryFuncPtr)    ::GetProcAddress (winRTHandle, "RoGetActivationFactory");\r
-\r
-    if (roInitialize == nullptr || createHString == nullptr || deleteHString == nullptr\r
-        || getHStringRawBuffer == nullptr || roActivateInstance == nullptr || roGetActivationFactory == nullptr)\r
-        return;\r
-\r
-    HRESULT status = roInitialize (1);\r
-    initialised = ! (status != S_OK && status != S_FALSE && status != 0x80010106L);\r
-}\r
-\r
-JUCE_IMPLEMENT_SINGLETON (WinRTWrapper)\r
-\r
+    JUCE_IMPLEMENT_SINGLETON (WinRTWrapper)\r
 }\r
index db25d933a80d7a51f2e206c6f22277f2a7376b5d..b47162b78815faaa69d93acb9b975906bffd53e2 100644 (file)
@@ -26,96 +26,66 @@ namespace juce
 class WinRTWrapper :   public DeletedAtShutdown\r
 {\r
 public:\r
-    class ScopedHString\r
-    {\r
-    public:\r
-        ScopedHString (String);\r
-\r
-        ~ScopedHString();\r
-\r
-        HSTRING get() const noexcept          { return hstr; }\r
-\r
-    private:\r
-        HSTRING hstr = nullptr;\r
-\r
-        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedHString)\r
-    };\r
+    JUCE_DECLARE_SINGLETON (WinRTWrapper, true)\r
 \r
-    template <class ComClass>\r
-    class ComPtr\r
+    class ScopedHString\r
     {\r
     public:\r
-        ComPtr() noexcept {}\r
-        ComPtr (ComClass* obj) : p (obj) { if (p) p->AddRef(); }\r
-        ComPtr (const ComPtr& other) : p (other.p) { if (p) p->AddRef(); }\r
-        ~ComPtr() { release(); }\r
-\r
-        operator ComClass*()   const noexcept { return p; }\r
-        ComClass& operator*()  const noexcept { return *p; }\r
-        ComClass* operator->() const noexcept { return p; }\r
-\r
-        ComPtr& operator= (ComClass* const newP)\r
+        ScopedHString (String str)\r
         {\r
-            if (newP != nullptr)\r
-                newP->AddRef();\r
-\r
-            release();\r
-            p = newP;\r
-            return *this;\r
+            if (WinRTWrapper::getInstance()->isInitialised())\r
+                WinRTWrapper::getInstance()->createHString (str.toWideCharPointer(),\r
+                                                            static_cast<uint32_t> (str.length()),\r
+                                                            &hstr);\r
         }\r
 \r
-        ComPtr& operator= (const ComPtr& newP) { return operator= (newP.p); }\r
+        ~ScopedHString()\r
+        {\r
+            if (WinRTWrapper::getInstance()->isInitialised() && hstr != nullptr)\r
+                WinRTWrapper::getInstance()->deleteHString (hstr);\r
+        }\r
 \r
-        ComClass** resetAndGetPointerAddress()\r
+        HSTRING get() const noexcept\r
         {\r
-            release();\r
-            p = nullptr;\r
-            return &p;\r
+            return hstr;\r
         }\r
 \r
     private:\r
-        ComClass* p = nullptr;\r
-\r
-        void release() { if (p != nullptr) p->Release(); }\r
+        HSTRING hstr = nullptr;\r
 \r
-        ComClass** operator&() noexcept; // private to avoid it being used accidentally\r
+        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedHString)\r
     };\r
 \r
-    JUCE_DECLARE_SINGLETON (WinRTWrapper, true)\r
-\r
-    ~WinRTWrapper();\r
-\r
-    String hStringToString (HSTRING);\r
+    ~WinRTWrapper()\r
+    {\r
+        if (winRTHandle != nullptr)\r
+            ::FreeLibrary (winRTHandle);\r
 \r
-    bool isInitialised() const noexcept       { return initialised; }\r
+        clearSingletonInstance();\r
+    }\r
 \r
-    template <class ComClass>\r
-    ComPtr<ComClass> activateInstance (const wchar_t* runtimeClassID, REFCLSID classUUID)\r
+    String hStringToString (HSTRING hstr)\r
     {\r
-        ComPtr<ComClass> result;\r
-\r
         if (isInitialised())\r
-        {\r
-            ComPtr<IInspectable> inspectable;\r
-            ScopedHString runtimeClass (runtimeClassID);\r
-            auto hr = roActivateInstance (runtimeClass.get(), inspectable.resetAndGetPointerAddress());\r
+            if (const wchar_t* str = getHStringRawBuffer (hstr, nullptr))\r
+                return String (str);\r
 \r
-            if (SUCCEEDED (hr))\r
-                inspectable->QueryInterface (classUUID, (void**) result.resetAndGetPointerAddress());\r
-        }\r
+        return {};\r
+    }\r
 \r
-        return result;\r
+    bool isInitialised() const noexcept\r
+    {\r
+        return initialised;\r
     }\r
 \r
     template <class ComClass>\r
-    ComPtr<ComClass> getWRLFactory (const wchar_t* runtimeClassID)\r
+    ComSmartPtr<ComClass> getWRLFactory (const wchar_t* runtimeClassID)\r
     {\r
-        ComPtr<ComClass> comPtr;\r
+        ComSmartPtr<ComClass> comPtr;\r
 \r
         if (isInitialised())\r
         {\r
             ScopedHString classID (runtimeClassID);\r
-\r
             if (classID.get() != nullptr)\r
                 roGetActivationFactory (classID.get(), __uuidof (ComClass), (void**) comPtr.resetAndGetPointerAddress());\r
         }\r
@@ -124,7 +94,25 @@ public:
     }\r
 \r
 private:\r
-    WinRTWrapper();\r
+    WinRTWrapper()\r
+    {\r
+        winRTHandle = ::LoadLibraryA ("api-ms-win-core-winrt-l1-1-0");\r
+        if (winRTHandle == nullptr)\r
+            return;\r
+\r
+        roInitialize           = (RoInitializeFuncPtr)              ::GetProcAddress (winRTHandle, "RoInitialize");\r
+        createHString          = (WindowsCreateStringFuncPtr)       ::GetProcAddress (winRTHandle, "WindowsCreateString");\r
+        deleteHString          = (WindowsDeleteStringFuncPtr)       ::GetProcAddress (winRTHandle, "WindowsDeleteString");\r
+        getHStringRawBuffer    = (WindowsGetStringRawBufferFuncPtr) ::GetProcAddress (winRTHandle, "WindowsGetStringRawBuffer");\r
+        roGetActivationFactory = (RoGetActivationFactoryFuncPtr)    ::GetProcAddress (winRTHandle, "RoGetActivationFactory");\r
+\r
+        if (roInitialize == nullptr || createHString == nullptr || deleteHString == nullptr\r
+         || getHStringRawBuffer == nullptr || roGetActivationFactory == nullptr)\r
+            return;\r
+\r
+        HRESULT status = roInitialize (1);\r
+        initialised = ! (status != S_OK && status != S_FALSE && status != 0x80010106L);\r
+    }\r
 \r
     HMODULE winRTHandle = nullptr;\r
     bool initialised = false;\r
@@ -133,14 +121,12 @@ private:
     typedef HRESULT (WINAPI* WindowsCreateStringFuncPtr) (LPCWSTR, UINT32, HSTRING*);\r
     typedef HRESULT (WINAPI* WindowsDeleteStringFuncPtr) (HSTRING);\r
     typedef PCWSTR  (WINAPI* WindowsGetStringRawBufferFuncPtr) (HSTRING, UINT32*);\r
-    typedef HRESULT (WINAPI* RoActivateInstanceFuncPtr) (HSTRING, IInspectable**);\r
     typedef HRESULT (WINAPI* RoGetActivationFactoryFuncPtr) (HSTRING, REFIID, void**);\r
 \r
     RoInitializeFuncPtr roInitialize = nullptr;\r
     WindowsCreateStringFuncPtr createHString = nullptr;\r
     WindowsDeleteStringFuncPtr deleteHString = nullptr;\r
     WindowsGetStringRawBufferFuncPtr getHStringRawBuffer = nullptr;\r
-    RoActivateInstanceFuncPtr roActivateInstance = nullptr;\r
     RoGetActivationFactoryFuncPtr roGetActivationFactory = nullptr;\r
 };\r
 \r
index a989c89b0defe79852f4c2330ffcc0feebccf679..1d724cd9a6dc9fa50883ef66467c2466dedbad63 100644 (file)
@@ -28,7 +28,7 @@ class Timer::TimerThread  : private Thread,
                             private AsyncUpdater\r
 {\r
 public:\r
-    using LockType = CriticalSection; // (mysteriously, using a SpinLock here causes problems on some XP machines..)\r
+    typedef CriticalSection LockType; // (mysteriously, using a SpinLock here causes problems on some XP machines..)\r
 \r
     TimerThread()  : Thread ("JUCE Timer")\r
     {\r
@@ -324,7 +324,7 @@ void Timer::startTimer (int interval) noexcept
 {\r
     // If you're calling this before (or after) the MessageManager is\r
     // running, then you're not going to get any timer callbacks!\r
-    JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+    jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
 \r
     const TimerThread::LockType::ScopedLockType sl (TimerThread::lock);\r
 \r
index c9634ec9c0a74d6daaa23158d36d9cbf45f75036..a4a8630465f6ed4c0f2ad172e197b6a10f0ab7c6 100644 (file)
@@ -140,6 +140,22 @@ namespace ColourHelpers
 }\r
 \r
 //==============================================================================\r
+Colour::Colour() noexcept\r
+    : argb (0, 0, 0, 0)\r
+{\r
+}\r
+\r
+Colour::Colour (const Colour& other) noexcept\r
+    : argb (other.argb)\r
+{\r
+}\r
+\r
+Colour& Colour::operator= (const Colour& other) noexcept\r
+{\r
+    argb = other.argb;\r
+    return *this;\r
+}\r
+\r
 bool Colour::operator== (const Colour& other) const noexcept    { return argb.getNativeARGB() == other.argb.getNativeARGB(); }\r
 bool Colour::operator!= (const Colour& other) const noexcept    { return argb.getNativeARGB() != other.argb.getNativeARGB(); }\r
 \r
@@ -211,6 +227,11 @@ Colour::Colour (PixelAlpha alpha) noexcept
 {\r
 }\r
 \r
+Colour::~Colour() noexcept\r
+{\r
+}\r
+\r
+\r
 //==============================================================================\r
 const PixelARGB Colour::getPixelARGB() const noexcept\r
 {\r
index 31ab62b6c14a323564758d792b1d981ebb16d2b6..c239f3a88339427cfb737740985f64ebc6c47ac9 100644 (file)
@@ -40,10 +40,10 @@ class JUCE_API  Colour  final
 public:\r
     //==============================================================================\r
     /** Creates a transparent black colour. */\r
-    Colour() = default;\r
+    Colour() noexcept;\r
 \r
     /** Creates a copy of another Colour object. */\r
-    Colour (const Colour&) = default;\r
+    Colour (const Colour& other) noexcept;\r
 \r
     /** Creates a colour from a 32-bit ARGB value.\r
 \r
@@ -143,10 +143,10 @@ public:
                            float alpha) noexcept;\r
 \r
     /** Destructor. */\r
-    ~Colour() = default;\r
+    ~Colour() noexcept;\r
 \r
     /** Copies another Colour object. */\r
-    Colour& operator= (const Colour&) = default;\r
+    Colour& operator= (const Colour& other) noexcept;\r
 \r
     /** Compares two colours. */\r
     bool operator== (const Colour& other) const noexcept;\r
@@ -191,7 +191,7 @@ public:
     /** Returns a 32-bit integer that represents this colour.\r
 \r
         The format of this number is:\r
-            ((alpha << 24) | (red << 16) | (green << 8) | blue).\r
+            ((alpha << 24) | (red << 16) | (green << 16) | blue).\r
     */\r
     uint32 getARGB() const noexcept;\r
 \r
@@ -363,7 +363,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    PixelARGB argb { 0, 0, 0, 0 };\r
+    PixelARGB argb;\r
 };\r
 \r
 } // namespace juce\r
index 69a66e4c9cf7066a56fabd3119d183a39094971c..4b1ba87da14367e581ff77ea9a8f4f2172e5f6a0 100644 (file)
@@ -60,8 +60,8 @@ class JUCE_API  PixelARGB
 {\r
 public:\r
     /** Creates a pixel without defining its colour. */\r
-    PixelARGB() = default;\r
-    ~PixelARGB() = default;\r
+    PixelARGB() noexcept {}\r
+    ~PixelARGB() noexcept {}\r
 \r
     PixelARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept\r
     {\r
@@ -367,8 +367,8 @@ class JUCE_API  PixelRGB
 {\r
 public:\r
     /** Creates a pixel without defining its colour. */\r
-    PixelRGB() = default;\r
-    ~PixelRGB() = default;\r
+    PixelRGB() noexcept {}\r
+    ~PixelRGB() noexcept {}\r
 \r
     //==============================================================================\r
     /** Returns a uint32 which represents the pixel in a platform dependent format which is compatible\r
@@ -618,8 +618,8 @@ class JUCE_API  PixelAlpha
 {\r
 public:\r
     /** Creates a pixel without defining its colour. */\r
-    PixelAlpha() = default;\r
-    ~PixelAlpha() = default;\r
+    PixelAlpha() noexcept {}\r
+    ~PixelAlpha() noexcept {}\r
 \r
     //==============================================================================\r
     /** Returns a uint32 which represents the pixel in a platform dependent format which is compatible\r
index 1c43b9a27783a16f16429aa7fea88b13ad89a4e6..fe9910e0b33a3de23af032d1b40f0282da583aab 100644 (file)
@@ -273,8 +273,7 @@ void Graphics::drawSingleLineText (const String& text, const int startX, const i
 }\r
 \r
 void Graphics::drawMultiLineText (const String& text, const int startX,\r
-                                  const int baselineY, const int maximumLineWidth,\r
-                                  Justification justification) const\r
+                                  const int baselineY, const int maximumLineWidth) const\r
 {\r
     if (text.isNotEmpty()\r
          && startX < context.getClipBounds().getRight())\r
@@ -282,7 +281,7 @@ void Graphics::drawMultiLineText (const String& text, const int startX,
         GlyphArrangement arr;\r
         arr.addJustifiedText (context.getFont(), text,\r
                               (float) startX, (float) baselineY, (float) maximumLineWidth,\r
-                              justification);\r
+                              Justification::left);\r
         arr.draw (*this);\r
     }\r
 }\r
index 50f517b5f28641cea1462ee32797736b7db32d3c..570fe8a1a8fb3e87da4ae0957ed32b685fc3be53 100644 (file)
@@ -145,8 +145,7 @@ public:
     */\r
     void drawMultiLineText (const String& text,\r
                             int startX, int baselineY,\r
-                            int maximumLineWidth,\r
-                            Justification justification = Justification::left) const;\r
+                            int maximumLineWidth) const;\r
 \r
     /** Draws a line of text within a specified rectangle.\r
 \r
index cf8506787bf2bbba9bafccebf8985ac1d3f1d8c4..868ccf7355df003e2ed195f808b203e4df7a36ad 100644 (file)
@@ -351,8 +351,8 @@ void LowLevelGraphicsPostScriptRenderer::fillRect (const Rectangle<float>& r)
         writeClip();\r
         writeColour (stateStack.getLast()->fillType.colour);\r
 \r
-        auto r2 = r.translated ((float) stateStack.getLast()->xOffset,\r
-                                (float) stateStack.getLast()->yOffset);\r
+        Rectangle<float> r2 (r.translated ((float) stateStack.getLast()->xOffset,\r
+                                           (float) stateStack.getLast()->yOffset));\r
 \r
         out << r2.getX() << ' ' << -r2.getBottom() << ' ' << r2.getWidth() << ' ' << r2.getHeight() << " rectfill\n";\r
     }\r
@@ -401,7 +401,7 @@ void LowLevelGraphicsPostScriptRenderer::fillPath (const Path& path, const Affin
             out << "clip\n";\r
         }\r
 \r
-        auto bounds = stateStack.getLast()->clip.getBounds();\r
+        const Rectangle<int> bounds (stateStack.getLast()->clip.getBounds());\r
 \r
         // ideally this would draw lots of lines or ellipses to approximate the gradient, but for the\r
         // time-being, this just fills it with the average colour..\r
index 6ea68dd38f2fe06b9dab23883c38efa51d8c3139..6557c9dd857b68b54a16224316f2bfab9d3d9917 100644 (file)
@@ -68,6 +68,11 @@ static void blurSingleChannelImage (Image& image, int radius)
 }\r
 \r
 //==============================================================================\r
+DropShadow::DropShadow() noexcept\r
+    : colour (0x90000000), radius (4)\r
+{\r
+}\r
+\r
 DropShadow::DropShadow (Colour shadowColour, const int r, Point<int> o) noexcept\r
     : colour (shadowColour), radius (r), offset (o)\r
 {\r
@@ -94,9 +99,9 @@ void DropShadow::drawForPath (Graphics& g, const Path& path) const
 {\r
     jassert (radius > 0);\r
 \r
-    auto area = (path.getBounds().getSmallestIntegerContainer() + offset)\r
-                  .expanded (radius + 1)\r
-                  .getIntersection (g.getClipBounds().expanded (radius + 1));\r
+    const Rectangle<int> area ((path.getBounds().getSmallestIntegerContainer() + offset)\r
+                                   .expanded (radius + 1)\r
+                                   .getIntersection (g.getClipBounds().expanded (radius + 1)));\r
 \r
     if (area.getWidth() > 2 && area.getHeight() > 2)\r
     {\r
@@ -137,11 +142,11 @@ void DropShadow::drawForRectangle (Graphics& g, const Rectangle<int>& targetArea
     const float radiusInset = (radius + 1) / 2.0f;\r
     const float expandedRadius = radius + radiusInset;\r
 \r
-    auto area = targetArea.toFloat().reduced (radiusInset) + offset.toFloat();\r
+    const Rectangle<float> area (targetArea.toFloat().reduced (radiusInset) + offset.toFloat());\r
 \r
-    auto r = area.expanded (expandedRadius);\r
-    auto top = r.removeFromTop (expandedRadius);\r
-    auto bottom = r.removeFromBottom (expandedRadius);\r
+    Rectangle<float> r (area.expanded (expandedRadius));\r
+    Rectangle<float> top (r.removeFromTop (expandedRadius));\r
+    Rectangle<float> bottom (r.removeFromBottom (expandedRadius));\r
 \r
     drawShadowSection (g, cg, top.removeFromLeft  (expandedRadius), true, 1.0f, 1.0f, 0, 1.0f);\r
     drawShadowSection (g, cg, top.removeFromRight (expandedRadius), true, 0, 1.0f, 1.0f, 1.0f);\r
index ee5d38f56c0064717eb50064a51c7d73645bc721..99a73e1d88151c76c936540ccf3f472e963ca957 100644 (file)
@@ -36,7 +36,7 @@ namespace juce
 struct JUCE_API  DropShadow\r
 {\r
     /** Creates a default drop-shadow effect. */\r
-    DropShadow() = default;\r
+    DropShadow() noexcept;\r
 \r
     /** Creates a drop-shadow object with the given parameters. */\r
     DropShadow (Colour shadowColour, int radius, Point<int> offset) noexcept;\r
@@ -56,10 +56,10 @@ struct JUCE_API  DropShadow
         In most cases you'll probably want to leave this as black with an alpha\r
         value of around 0.5\r
     */\r
-    Colour colour { 0x90000000 };\r
+    Colour colour;\r
 \r
     /** The approximate spread of the shadow. */\r
-    int radius { 4 };\r
+    int radius;\r
 \r
     /** The offset of the shadow. */\r
     Point<int> offset;\r
index 1f31a3035d56660278502d933f79f028edd1d598..e7e0f8e95a835cc35c790bc89706516473477275 100644 (file)
@@ -313,7 +313,7 @@ float CustomTypeface::getStringWidth (const String& text)
         else\r
         {\r
             if (auto fallbackTypeface = Typeface::getFallbackTypeface())\r
-                if (fallbackTypeface.get() != this)\r
+                if (fallbackTypeface != this)\r
                     x += fallbackTypeface->getStringWidth (String::charToString (c));\r
         }\r
     }\r
@@ -342,7 +342,7 @@ void CustomTypeface::getGlyphPositions (const String& text, Array<int>& resultGl
         {\r
             auto fallbackTypeface = getFallbackTypeface();\r
 \r
-            if (fallbackTypeface != nullptr && fallbackTypeface.get() != this)\r
+            if (fallbackTypeface != nullptr && fallbackTypeface != this)\r
             {\r
                 Array<int> subGlyphs;\r
                 Array<float> subOffsets;\r
@@ -371,7 +371,7 @@ bool CustomTypeface::getOutlineForGlyph (int glyphNumber, Path& path)
     }\r
 \r
     if (auto fallbackTypeface = getFallbackTypeface())\r
-        if (fallbackTypeface.get() != this)\r
+        if (fallbackTypeface != this)\r
             return fallbackTypeface->getOutlineForGlyph (glyphNumber, path);\r
 \r
     return false;\r
@@ -389,7 +389,7 @@ EdgeTable* CustomTypeface::getEdgeTableForGlyph (int glyphNumber, const AffineTr
     else\r
     {\r
         if (auto fallbackTypeface = getFallbackTypeface())\r
-            if (fallbackTypeface.get() != this)\r
+            if (fallbackTypeface != this)\r
                 return fallbackTypeface->getEdgeTableForGlyph (glyphNumber, transform, fontHeight);\r
     }\r
 \r
index 4794d58f8a4fae6ac7ef21d53002d670b4b9e3bd..4d8de59260a5fac37cc469c1cf6c955e463fd26c 100644 (file)
@@ -155,8 +155,9 @@ protected:
 private:\r
     //==============================================================================\r
     class GlyphInfo;\r
+    friend struct ContainerDeletePolicy<GlyphInfo>;\r
     OwnedArray<GlyphInfo> glyphs;\r
-    short lookupTable[128];\r
+    short lookupTable [128];\r
 \r
     GlyphInfo* findGlyph (const juce_wchar character, bool loadIfNeeded) noexcept;\r
 \r
index a0da9e81f74ea60206ea43a9ef014d0f4a95d642..1dec474709d9b9c60c3fd52cd4ec7e6a7d8f8848 100644 (file)
@@ -40,7 +40,7 @@ namespace FontValues
     String fallbackFontStyle;\r
 }\r
 \r
-using GetTypefaceForFont = Typeface::Ptr (*)(const Font&);\r
+typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&);\r
 GetTypefaceForFont juce_getTypefaceForFont = nullptr;\r
 \r
 float Font::getDefaultMinimumHorizontalScaleFactor() noexcept                { return FontValues::minimumHorizontalScale; }\r
@@ -308,7 +308,7 @@ bool Font::operator!= (const Font& other) const noexcept
 void Font::dupeInternalIfShared()\r
 {\r
     if (font->getReferenceCount() > 1)\r
-        font = *new SharedFontInternal (*font);\r
+        font = new SharedFontInternal (*font);\r
 }\r
 \r
 void Font::checkTypefaceSuitability()\r
@@ -392,7 +392,7 @@ Typeface* Font::getTypeface() const
         jassert (font->typeface != nullptr);\r
     }\r
 \r
-    return font->typeface.get();\r
+    return font->typeface;\r
 }\r
 \r
 //==============================================================================\r
index fdd86f18ee303f7aac41289ddd5ce452ec0c7661..eaee5033ba50ca536cdabf10b81e1b4b9b2b69f7 100644 (file)
@@ -118,7 +118,7 @@ Typeface::~Typeface()
 Typeface::Ptr Typeface::getFallbackTypeface()\r
 {\r
     const Font fallbackFont (Font::getFallbackFontName(), Font::getFallbackFontStyle(), 10.0f);\r
-    return Typeface::Ptr (fallbackFont.getTypeface());\r
+    return fallbackFont.getTypeface();\r
 }\r
 \r
 EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight)\r
@@ -140,8 +140,9 @@ EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransfor
 struct Typeface::HintingParams\r
 {\r
     HintingParams (Typeface& t)\r
+        : cachedSize (0), top (0), middle (0), bottom (0)\r
     {\r
-        Font font (t);\r
+        Font font (&t);\r
         font = font.withHeight ((float) standardHeight);\r
 \r
         top = getAverageY (font, "BDEFPRTZOQ", true);\r
@@ -208,7 +209,7 @@ private:
         float middle, upperScale, upperOffset, lowerScale, lowerOffset;\r
     };\r
 \r
-    float cachedSize = 0;\r
+    float cachedSize;\r
     Scaling cachedScale;\r
 \r
     static float getAverageY (const Font& font, const char* chars, bool getTop)\r
@@ -247,7 +248,7 @@ private:
     }\r
 \r
     enum { standardHeight = 100 };\r
-    float top = 0, middle = 0, bottom = 0;\r
+    float top, middle, bottom;\r
 };\r
 \r
 void Typeface::applyVerticalHintingTransform (float fontSize, Path& path)\r
index 0c6c17ac53584263045765172716461e16ce2fce..425e2d06bff980fa7bbdecfe5193bc6291289e62 100644 (file)
@@ -153,6 +153,7 @@ protected:
 \r
 private:\r
     struct HintingParams;\r
+    friend struct ContainerDeletePolicy<HintingParams>;\r
     std::unique_ptr<HintingParams> hintingParams;\r
     CriticalSection hintingLock;\r
 \r
index 588253f09115fb21f999eef2d9391901e6579266..e1c6b3fd558c9f2be73bb93b3ea65a0f4a30149a 100644 (file)
 namespace juce\r
 {\r
 \r
+AffineTransform::AffineTransform() noexcept\r
+    : mat00 (1.0f), mat01 (0), mat02 (0),\r
+      mat10 (0), mat11 (1.0f), mat12 (0)\r
+{\r
+}\r
+\r
+AffineTransform::AffineTransform (const AffineTransform& other) noexcept\r
+  : mat00 (other.mat00), mat01 (other.mat01), mat02 (other.mat02),\r
+    mat10 (other.mat10), mat11 (other.mat11), mat12 (other.mat12)\r
+{\r
+}\r
+\r
 AffineTransform::AffineTransform (float m00, float m01, float m02,\r
                                   float m10, float m11, float m12) noexcept\r
  :  mat00 (m00), mat01 (m01), mat02 (m02),\r
@@ -34,6 +46,18 @@ AffineTransform::AffineTransform (float m00, float m01, float m02,
 {\r
 }\r
 \r
+AffineTransform& AffineTransform::operator= (const AffineTransform& other) noexcept\r
+{\r
+    mat00 = other.mat00;\r
+    mat01 = other.mat01;\r
+    mat02 = other.mat02;\r
+    mat10 = other.mat10;\r
+    mat11 = other.mat11;\r
+    mat12 = other.mat12;\r
+\r
+    return *this;\r
+}\r
+\r
 bool AffineTransform::operator== (const AffineTransform& other) const noexcept\r
 {\r
     return mat00 == other.mat00\r
@@ -60,7 +84,7 @@ bool AffineTransform::isIdentity() const noexcept
         && mat11 == 1.0f;\r
 }\r
 \r
-JUCE_DECLARE_DEPRECATED_STATIC (const AffineTransform AffineTransform::identity (1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const AffineTransform AffineTransform::identity);\r
 \r
 //==============================================================================\r
 AffineTransform AffineTransform::followedBy (const AffineTransform& other) const noexcept\r
index 85427116f8e7d9ca051de78e2d2b6ac5eb1e97bf..e7461bc21f5de9544ec58a06704e881291682302 100644 (file)
@@ -45,10 +45,10 @@ class JUCE_API  AffineTransform  final
 public:\r
     //==============================================================================\r
     /** Creates an identity transform. */\r
-    AffineTransform() = default;\r
+    AffineTransform() noexcept;\r
 \r
     /** Creates a copy of another transform. */\r
-    AffineTransform (const AffineTransform&) = default;\r
+    AffineTransform (const AffineTransform& other) noexcept;\r
 \r
     /** Creates a transform from a set of raw matrix values.\r
 \r
@@ -62,7 +62,7 @@ public:
                      float mat10, float mat11, float mat12) noexcept;\r
 \r
     /** Copies from another AffineTransform object */\r
-    AffineTransform& operator= (const AffineTransform&) = default;\r
+    AffineTransform& operator= (const AffineTransform& other) noexcept;\r
 \r
     /** Compares two transforms. */\r
     bool operator== (const AffineTransform& other) const noexcept;\r
@@ -273,7 +273,7 @@ public:
     /* A ready-to-use identity transform - now depracated.\r
        @deprecated If you need an identity transform, just use AffineTransform() or {}.\r
     */\r
-    JUCE_DEPRECATED_STATIC (static const AffineTransform identity;)\r
+    JUCE_DEPRECATED_STATIC (static const AffineTransform identity);\r
 \r
     //==============================================================================\r
     /* The transform matrix is:\r
@@ -282,8 +282,8 @@ public:
         (mat10 mat11 mat12)\r
         (  0     0     1  )\r
     */\r
-    float mat00 { 1.0f }, mat01 { 0.0f }, mat02 { 0.0f };\r
-    float mat10 { 0.0f }, mat11 { 1.0f }, mat12 { 0.0f };\r
+    float mat00, mat01, mat02;\r
+    float mat10, mat11, mat12;\r
 };\r
 \r
 } // namespace juce\r
index 8f954a7683ff8ed4798a3598bb2b2f5dc9652cdc..92a69cd926d33df8aeac741ab6cc4f1d41e8e5ff 100644 (file)
@@ -46,10 +46,16 @@ public:
     /** Creates a null border.\r
         All sizes are left as 0.\r
     */\r
-    BorderSize() = default;\r
+    BorderSize() noexcept\r
+        : top(), left(), bottom(), right()\r
+    {\r
+    }\r
 \r
     /** Creates a copy of another border. */\r
-    BorderSize (const BorderSize&) = default;\r
+    BorderSize (const BorderSize& other) noexcept\r
+        : top (other.top), left (other.left), bottom (other.bottom), right (other.right)\r
+    {\r
+    }\r
 \r
     /** Creates a border with the given gaps. */\r
     BorderSize (ValueType topGap, ValueType leftGap, ValueType bottomGap, ValueType rightGap) noexcept\r
@@ -67,13 +73,13 @@ public:
     /** Returns the gap that should be left at the top of the region. */\r
     ValueType getTop() const noexcept                   { return top; }\r
 \r
-    /** Returns the gap that should be left at the left of the region. */\r
+    /** Returns the gap that should be left at the top of the region. */\r
     ValueType getLeft() const noexcept                  { return left; }\r
 \r
-    /** Returns the gap that should be left at the bottom of the region. */\r
+    /** Returns the gap that should be left at the top of the region. */\r
     ValueType getBottom() const noexcept                { return bottom; }\r
 \r
-    /** Returns the gap that should be left at the right of the region. */\r
+    /** Returns the gap that should be left at the top of the region. */\r
     ValueType getRight() const noexcept                 { return right; }\r
 \r
     /** Returns the sum of the top and bottom gaps. */\r
@@ -143,7 +149,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    ValueType top{}, left{}, bottom{}, right{};\r
+    ValueType top, left, bottom, right;\r
 };\r
 \r
 } // namespace juce\r
index b9b3db0125771d6e318e93358bd9a9037d04e3cd..fbe666ea0a8f91d601b3d03a7f11f9604c9a0d41 100644 (file)
@@ -49,10 +49,13 @@ class Line
 public:\r
     //==============================================================================\r
     /** Creates a line, using (0, 0) as its start and end points. */\r
-    Line() = default;\r
+    Line() noexcept {}\r
 \r
     /** Creates a copy of another line. */\r
-    Line (const Line&) = default;\r
+    Line (const Line& other) noexcept\r
+        : start (other.start), end (other.end)\r
+    {\r
+    }\r
 \r
     /** Creates a line based on the coordinates of its start and end points. */\r
     Line (ValueType startX, ValueType startY, ValueType endX, ValueType endY) noexcept\r
@@ -67,10 +70,15 @@ public:
     }\r
 \r
     /** Copies a line from another one. */\r
-    Line& operator= (const Line&) = default;\r
+    Line& operator= (const Line& other) noexcept\r
+    {\r
+        start = other.start;\r
+        end = other.end;\r
+        return *this;\r
+    }\r
 \r
     /** Destructor. */\r
-    ~Line() = default;\r
+    ~Line() noexcept {}\r
 \r
     //==============================================================================\r
     /** Returns the x coordinate of the line's start point. */\r
@@ -178,7 +186,7 @@ public:
                                 the intersection (if the lines intersect). If the lines\r
                                 are parallel, this will just be set to the position\r
                                 of one of the line's endpoints.\r
-        @returns    true if the line segments intersect; false if they don't. Even if they\r
+        @returns    true if the line segments intersect; false if they dont. Even if they\r
                     don't intersect, the intersection coordinates returned will still\r
                     be valid\r
     */\r
index e418dcf6ba3cb089553a8b362420fd69af082fe2..11541c3eef45068932f215ec82208bae8adf2d98 100644 (file)
@@ -41,10 +41,15 @@ public:
     //==============================================================================\r
     /** Creates a parallelogram with zero size at the origin.\r
     */\r
-    Parallelogram() = default;\r
+    Parallelogram() noexcept\r
+    {\r
+    }\r
 \r
     /** Creates a copy of another parallelogram. */\r
-    Parallelogram (const Parallelogram&) = default;\r
+    Parallelogram (const Parallelogram& other) noexcept\r
+       : topLeft (other.topLeft), topRight (other.topRight), bottomLeft (other.bottomLeft)\r
+    {\r
+    }\r
 \r
     /** Creates a parallelogram based on 3 points. */\r
     Parallelogram (Point<ValueType> topLeftPosition,\r
@@ -62,10 +67,16 @@ public:
     {\r
     }\r
 \r
-    Parallelogram& operator= (const Parallelogram&) = default;\r
+    Parallelogram& operator= (const Parallelogram& other) noexcept\r
+    {\r
+        topLeft = other.topLeft;\r
+        topRight = other.topRight;\r
+        bottomLeft = other.bottomLeft;\r
+        return *this;\r
+    }\r
 \r
     /** Destructor. */\r
-    ~Parallelogram() = default;\r
+    ~Parallelogram() noexcept {}\r
 \r
     //==============================================================================\r
     /** Returns true if the parallelogram has a width or height of more than zero. */\r
index 42e2a6a550202d235fce253dcbbbca75657a2385..c0aef9ec26e5d38adde738a5eebb2cc959b7433f 100644 (file)
@@ -674,8 +674,8 @@ void Path::addBubble (Rectangle<float> bodyArea,
 \r
     startNewSubPath (bodyArea.getX() + cornerSizeW, bodyArea.getY());\r
 \r
-    auto targetLimit = bodyArea.reduced (jmin (halfW - 1.0f, cornerSizeW + arrowBaseWidth),\r
-                                         jmin (halfH - 1.0f, cornerSizeH + arrowBaseWidth));\r
+    const Rectangle<float> targetLimit (bodyArea.reduced (jmin (halfW - 1.0f, cornerSizeW + arrowBaseWidth),\r
+                                                          jmin (halfH - 1.0f, cornerSizeH + arrowBaseWidth)));\r
 \r
     if (Rectangle<float> (targetLimit.getX(), maximumArea.getY(),\r
                           targetLimit.getWidth(), bodyArea.getY() - maximumArea.getY()).contains (arrowTip))\r
index c24afbdc6c3e68af25cbb1299d41da56b800cb27..d1b3d177e31622d96ae1559d4c4a33c20b7a2c91 100644 (file)
@@ -654,10 +654,10 @@ namespace PathStrokeHelpers
 }\r
 \r
 void PathStrokeType::createStrokedPath (Path& destPath, const Path& sourcePath,\r
-                                        const AffineTransform& transform, float extraAccuracy) const\r
+                                        const AffineTransform& transform, const float extraAccuracy) const\r
 {\r
     PathStrokeHelpers::createStroke (thickness, jointStyle, endStyle, destPath, sourcePath,\r
-                                     transform, extraAccuracy, nullptr);\r
+                                     transform, extraAccuracy, 0);\r
 }\r
 \r
 void PathStrokeType::createDashedStroke (Path& destPath,\r
@@ -665,7 +665,7 @@ void PathStrokeType::createDashedStroke (Path& destPath,
                                          const float* dashLengths,\r
                                          int numDashLengths,\r
                                          const AffineTransform& transform,\r
-                                         float extraAccuracy) const\r
+                                         const float extraAccuracy) const\r
 {\r
     jassert (extraAccuracy > 0);\r
 \r
index 3bf9c26606c7abb79f91a7f41ad05edcee06347f..e025f8b6dba4515c9c332addce7fc85020803d71 100644 (file)
@@ -43,17 +43,17 @@ class Point
 {\r
 public:\r
     /** Creates a point at the origin */\r
-    JUCE_CONSTEXPR Point() = default;\r
+    JUCE_CONSTEXPR Point() noexcept : x(), y() {}\r
 \r
     /** Creates a copy of another point. */\r
-    JUCE_CONSTEXPR Point (const Point&) = default;\r
+    JUCE_CONSTEXPR Point (const Point& other) noexcept : x (other.x), y (other.y)  {}\r
 \r
     /** Creates a point from an (x, y) position. */\r
     JUCE_CONSTEXPR Point (ValueType initialX, ValueType initialY) noexcept : x (initialX), y (initialY) {}\r
 \r
     //==============================================================================\r
     /** Copies this point from another one. */\r
-    Point& operator= (const Point&) = default;\r
+    Point& operator= (const Point& other) noexcept                          { x = other.x; y = other.y; return *this; }\r
 \r
     JUCE_CONSTEXPR inline bool operator== (Point other) const noexcept      { return x == other.x && y == other.y; }\r
     JUCE_CONSTEXPR inline bool operator!= (Point other) const noexcept      { return x != other.x || y != other.y; }\r
@@ -141,7 +141,7 @@ public:
 \r
     //==============================================================================\r
     /** This type will be double if the Point's type is double, otherwise it will be float. */\r
-    using FloatType = typename TypeHelpers::SmallestFloatType<ValueType>::type;\r
+    typedef typename TypeHelpers::SmallestFloatType<ValueType>::type FloatType;\r
 \r
     //==============================================================================\r
     /** Returns the straight-line distance between this point and the origin. */\r
@@ -234,8 +234,8 @@ public:
     String toString() const                                       { return String (x) + ", " + String (y); }\r
 \r
     //==============================================================================\r
-    ValueType x{}; /**< The point's X coordinate. */\r
-    ValueType y{}; /**< The point's Y coordinate. */\r
+    ValueType x; /**< The point's X coordinate. */\r
+    ValueType y; /**< The point's Y coordinate. */\r
 };\r
 \r
 /** Multiplies the point's coordinates by a scalar value. */\r
index df2a88f4203998cef9b963fea46e5ad150a0dd89..ba581757b660624da39f198c7afc1901608751f9 100644 (file)
@@ -43,10 +43,16 @@ public:
     /** Creates a rectangle of zero size.\r
         The default coordinates will be (0, 0, 0, 0).\r
     */\r
-    Rectangle() = default;\r
+    Rectangle() noexcept\r
+      : w(), h()\r
+    {\r
+    }\r
 \r
     /** Creates a copy of another rectangle. */\r
-    Rectangle (const Rectangle&) = default;\r
+    Rectangle (const Rectangle& other) noexcept\r
+      : pos (other.pos), w (other.w), h (other.h)\r
+    {\r
+    }\r
 \r
     /** Creates a rectangle with a given position and size. */\r
     Rectangle (ValueType initialX, ValueType initialY,\r
@@ -83,11 +89,15 @@ public:
         return { left, top, right - left, bottom - top };\r
     }\r
 \r
-    /** Creates a copy of another rectangle. */\r
-    Rectangle& operator= (const Rectangle&) = default;\r
+    Rectangle& operator= (const Rectangle& other) noexcept\r
+    {\r
+        pos = other.pos;\r
+        w = other.w; h = other.h;\r
+        return *this;\r
+    }\r
 \r
     /** Destructor. */\r
-    ~Rectangle() = default;\r
+    ~Rectangle() noexcept {}\r
 \r
     //==============================================================================\r
     /** Returns true if the rectangle's width or height are zero or less */\r
@@ -964,7 +974,7 @@ private:
     template <typename OtherType> friend class Rectangle;\r
 \r
     Point<ValueType> pos;\r
-    ValueType w{}, h{};\r
+    ValueType w, h;\r
 \r
     static ValueType parseIntAfterSpace (StringRef s) noexcept\r
         { return static_cast<ValueType> (s.text.findEndOfWhitespace().getIntValue32()); }\r
index 53e513402ca571b967c4ddf670e430f2f03039d3..22091f9b104de98bf844c14224b4feb91508688b 100644 (file)
@@ -43,7 +43,7 @@ template <typename ValueType>
 class RectangleList  final\r
 {\r
 public:\r
-    using RectangleType = Rectangle<ValueType>;\r
+    typedef Rectangle<ValueType> RectangleType;\r
 \r
     //==============================================================================\r
     /** Creates an empty RectangleList */\r
@@ -194,7 +194,7 @@ public:
     void add (const RectangleList& other)\r
     {\r
         for (auto& r : other)\r
-            add (r);\r
+            add (*r);\r
     }\r
 \r
     /** Removes a rectangular region from the list.\r
index 780558433ea5438fb0f7a40f4d1a7e51f167fc17..793d10ba64119df54c0dbf52afdc9565115addf4 100644 (file)
@@ -35,26 +35,18 @@ namespace juce
 namespace jpeglibNamespace\r
 {\r
 #if JUCE_INCLUDE_JPEGLIB_CODE || ! defined (JUCE_INCLUDE_JPEGLIB_CODE)\r
-    #if JUCE_MINGW\r
-     typedef unsigned char boolean;\r
-    #endif\r
-\r
-    #if JUCE_CLANG\r
-     #pragma clang diagnostic push\r
-     #pragma clang diagnostic ignored "-Wconversion"\r
-     #pragma clang diagnostic ignored "-Wdeprecated-register"\r
-     #if __has_warning("-Wzero-as-null-pointer-constant")\r
-      #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
-     #endif\r
-     #if __has_warning("-Wcomma")\r
-      #pragma clang diagnostic ignored "-Wcomma"\r
-     #endif\r
-    #endif\r
+   #if JUCE_MINGW\r
+    typedef unsigned char boolean;\r
+   #endif\r
 \r
-    #if JUCE_GCC && __GNUC__ > 5\r
-     #pragma GCC diagnostic push\r
-     #pragma GCC diagnostic ignored "-Wshift-negative-value"\r
+   #if JUCE_CLANG\r
+    #pragma clang diagnostic push\r
+    #pragma clang diagnostic ignored "-Wconversion"\r
+    #pragma clang diagnostic ignored "-Wdeprecated-register"\r
+    #if __has_warning("-Wcomma")\r
+     #pragma clang diagnostic ignored "-Wcomma"\r
     #endif\r
+   #endif\r
 \r
     #define JPEG_INTERNALS\r
     #undef FAR\r
@@ -129,13 +121,9 @@ namespace jpeglibNamespace
     #include "jpglib/jutils.c"\r
     #include "jpglib/transupp.c"\r
 \r
-    #if JUCE_CLANG\r
-     #pragma clang diagnostic pop\r
-    #endif\r
-\r
-    #if JUCE_GCC && __GNUC__ > 5\r
-     #pragma GCC diagnostic pop\r
-    #endif\r
+   #if JUCE_CLANG\r
+    #pragma clang diagnostic pop\r
+   #endif\r
 #else\r
     #define JPEG_INTERNALS\r
     #undef FAR\r
index b772e46b7b782545ac888e9dac5765b160fab994..5a2a376ededb81ca76cfc168e1a3c04f89588769 100644 (file)
@@ -66,9 +66,6 @@ namespace pnglibNamespace
   #if JUCE_CLANG\r
    #pragma clang diagnostic push\r
    #pragma clang diagnostic ignored "-Wsign-conversion"\r
-   #if __has_warning("-Wzero-as-null-pointer-constant")\r
-    #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
-   #endif\r
    #if __has_warning("-Wcomma")\r
     #pragma clang diagnostic ignored "-Wcomma"\r
    #endif\r
@@ -523,23 +520,23 @@ Image PNGImageFormat::decodeImage (InputStream& in)
 bool PNGImageFormat::writeImageToStream (const Image& image, OutputStream& out)\r
 {\r
     using namespace pnglibNamespace;\r
-    auto width = image.getWidth();\r
-    auto height = image.getHeight();\r
+    const int width = image.getWidth();\r
+    const int height = image.getHeight();\r
 \r
-    auto pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);\r
+    png_structp pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);\r
 \r
     if (pngWriteStruct == nullptr)\r
         return false;\r
 \r
-    auto pngInfoStruct = png_create_info_struct (pngWriteStruct);\r
+    png_infop pngInfoStruct = png_create_info_struct (pngWriteStruct);\r
 \r
     if (pngInfoStruct == nullptr)\r
     {\r
-        png_destroy_write_struct (&pngWriteStruct, nullptr);\r
+        png_destroy_write_struct (&pngWriteStruct, (png_infopp) nullptr);\r
         return false;\r
     }\r
 \r
-    png_set_write_fn (pngWriteStruct, &out, PNGHelpers::writeDataCallback, nullptr);\r
+    png_set_write_fn (pngWriteStruct, &out, PNGHelpers::writeDataCallback, 0);\r
 \r
     png_set_IHDR (pngWriteStruct, pngInfoStruct, (png_uint_32) width, (png_uint_32) height, 8,\r
                   image.hasAlphaChannel() ? PNG_COLOR_TYPE_RGB_ALPHA\r
index 0f3b1290b2307109480aedd14478cb7ca4b2381b..6b478349b2b0956af2379cd20a66f62dc2602b89 100644 (file)
@@ -27,7 +27,7 @@
 namespace juce\r
 {\r
 \r
-ImagePixelData::ImagePixelData (Image::PixelFormat format, int w, int h)\r
+ImagePixelData::ImagePixelData (const Image::PixelFormat format, const int w, const int h)\r
     : pixelFormat (format), width (w), height (h)\r
 {\r
     jassert (format == Image::RGB || format == Image::ARGB || format == Image::SingleChannel);\r
@@ -82,9 +82,9 @@ Image ImageType::convert (const Image& source) const
 class SoftwarePixelData  : public ImagePixelData\r
 {\r
 public:\r
-    SoftwarePixelData (Image::PixelFormat formatToUse, int w, int h, bool clearImage)\r
-        : ImagePixelData (formatToUse, w, h),\r
-          pixelStride (formatToUse == Image::RGB ? 3 : ((formatToUse == Image::ARGB) ? 4 : 1)),\r
+    SoftwarePixelData (const Image::PixelFormat format_, const int w, const int h, const bool clearImage)\r
+        : ImagePixelData (format_, w, h),\r
+          pixelStride (format_ == Image::RGB ? 3 : ((format_ == Image::ARGB) ? 4 : 1)),\r
           lineStride ((pixelStride * jmax (1, w) + 3) & ~3)\r
     {\r
         imageData.allocate ((size_t) lineStride * (size_t) jmax (1, h), clearImage);\r
@@ -93,7 +93,7 @@ public:
     LowLevelGraphicsContext* createLowLevelContext() override\r
     {\r
         sendDataChangeMessage();\r
-        return new LowLevelGraphicsSoftwareRenderer (Image (*this));\r
+        return new LowLevelGraphicsSoftwareRenderer (Image (this));\r
     }\r
 \r
     void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
@@ -109,9 +109,9 @@ public:
 \r
     ImagePixelData::Ptr clone() override\r
     {\r
-        auto s = new SoftwarePixelData (pixelFormat, width, height, false);\r
+        SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false);\r
         memcpy (s->imageData, imageData, (size_t) lineStride * (size_t) height);\r
-        return *s;\r
+        return s;\r
     }\r
 \r
     ImageType* createType() const override    { return new SoftwareImageType(); }\r
@@ -128,7 +128,7 @@ SoftwareImageType::~SoftwareImageType() {}
 \r
 ImagePixelData::Ptr SoftwareImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const\r
 {\r
-    return *new SoftwarePixelData (format, width, height, clearImage);\r
+    return new SoftwarePixelData (format, width, height, clearImage);\r
 }\r
 \r
 int SoftwareImageType::getTypeID() const\r
@@ -156,9 +156,9 @@ ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int widt
 class SubsectionPixelData  : public ImagePixelData\r
 {\r
 public:\r
-    SubsectionPixelData (ImagePixelData::Ptr source, Rectangle<int> r)\r
-        : ImagePixelData (source->pixelFormat, r.getWidth(), r.getHeight()),\r
-          sourceImage (static_cast<ImagePixelData::Ptr&&> (source)), area (r)\r
+    SubsectionPixelData (ImagePixelData* const im, const Rectangle<int>& r)\r
+        : ImagePixelData (im->pixelFormat, r.getWidth(), r.getHeight()),\r
+          sourceImage (im), area (r)\r
     {\r
     }\r
 \r
@@ -187,10 +187,10 @@ public:
 \r
         {\r
             Graphics g (newImage);\r
-            g.drawImageAt (Image (*this), 0, 0);\r
+            g.drawImageAt (Image (this), 0, 0);\r
         }\r
 \r
-        return *newImage.getPixelData();\r
+        return newImage.getPixelData();\r
     }\r
 \r
     ImageType* createType() const override          { return sourceImage->createType(); }\r
@@ -211,12 +211,8 @@ Image Image::getClippedImage (const Rectangle<int>& area) const
     if (area.contains (getBounds()))\r
         return *this;\r
 \r
-    auto validArea = area.getIntersection (getBounds());\r
-\r
-    if (validArea.isEmpty())\r
-        return {};\r
-\r
-    return Image (*new SubsectionPixelData (image, validArea));\r
+    const Rectangle<int> validArea (area.getIntersection (getBounds()));\r
+    return Image (validArea.isEmpty() ? nullptr : new SubsectionPixelData (image, validArea));\r
 }\r
 \r
 \r
@@ -225,17 +221,17 @@ Image::Image() noexcept
 {\r
 }\r
 \r
-Image::Image (ReferenceCountedObjectPtr<ImagePixelData> instance) noexcept\r
-    : image (static_cast<ReferenceCountedObjectPtr<ImagePixelData>&&> (instance))\r
+Image::Image (ImagePixelData* const instance) noexcept\r
+    : image (instance)\r
 {\r
 }\r
 \r
-Image::Image (PixelFormat format, int width, int height, bool clearImage)\r
+Image::Image (const PixelFormat format, int width, int height, bool clearImage)\r
     : image (NativeImageType().create (format, width, height, clearImage))\r
 {\r
 }\r
 \r
-Image::Image (PixelFormat format, int width, int height, bool clearImage, const ImageType& type)\r
+Image::Image (const PixelFormat format, int width, int height, bool clearImage, const ImageType& type)\r
     : image (type.create (format, width, height, clearImage))\r
 {\r
 }\r
@@ -252,13 +248,13 @@ Image& Image::operator= (const Image& other)
 }\r
 \r
 Image::Image (Image&& other) noexcept\r
-    : image (std::move (other.image))\r
+    : image (static_cast<ImagePixelData::Ptr&&> (other.image))\r
 {\r
 }\r
 \r
 Image& Image::operator= (Image&& other) noexcept\r
 {\r
-    image = std::move (other.image);\r
+    image = static_cast<ImagePixelData::Ptr&&> (other.image);\r
     return *this;\r
 }\r
 \r
@@ -266,7 +262,7 @@ Image::~Image()
 {\r
 }\r
 \r
-JUCE_DECLARE_DEPRECATED_STATIC (const Image Image::null;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const Image Image::null);\r
 \r
 int Image::getReferenceCount() const noexcept           { return image == nullptr ? 0 : image->getSharedCount(); }\r
 int Image::getWidth() const noexcept                    { return image == nullptr ? 0 : image->width; }\r
@@ -294,10 +290,10 @@ Image Image::createCopy() const
     if (image != nullptr)\r
         return Image (image->clone());\r
 \r
-    return {};\r
+    return Image();\r
 }\r
 \r
-Image Image::rescaled (int newWidth, int newHeight, Graphics::ResamplingQuality quality) const\r
+Image Image::rescaled (const int newWidth, const int newHeight, const Graphics::ResamplingQuality quality) const\r
 {\r
     if (image == nullptr || (image->width == newWidth && image->height == newHeight))\r
         return *this;\r
@@ -317,7 +313,7 @@ Image Image::convertedToFormat (PixelFormat newFormat) const
     if (image == nullptr || newFormat == image->pixelFormat)\r
         return *this;\r
 \r
-    auto w = image->width, h = image->height;\r
+    const int w = image->width, h = image->height;\r
 \r
     const std::unique_ptr<ImageType> type (image->createType());\r
     Image newImage (type->create (newFormat, w, h, false));\r
@@ -335,8 +331,8 @@ Image Image::convertedToFormat (PixelFormat newFormat) const
 \r
             for (int y = 0; y < h; ++y)\r
             {\r
-                auto src = reinterpret_cast<const PixelARGB*> (srcData.getLinePointer (y));\r
-                auto dst = destData.getLinePointer (y);\r
+                const PixelARGB* const src = (const PixelARGB*) srcData.getLinePointer (y);\r
+                uint8* const dst = destData.getLinePointer (y);\r
 \r
                 for (int x = 0; x < w; ++x)\r
                     dst[x] = src[x].getAlpha();\r
@@ -350,8 +346,8 @@ Image Image::convertedToFormat (PixelFormat newFormat) const
 \r
         for (int y = 0; y < h; ++y)\r
         {\r
-            auto src = reinterpret_cast<const PixelAlpha*> (srcData.getLinePointer (y));\r
-            auto dst = reinterpret_cast<PixelARGB*> (destData.getLinePointer (y));\r
+            const PixelAlpha* const src = (const PixelAlpha*) srcData.getLinePointer (y);\r
+            PixelARGB* const dst = (PixelARGB*) destData.getLinePointer (y);\r
 \r
             for (int x = 0; x < w; ++x)\r
                 dst[x].set (src[x]);\r
@@ -375,7 +371,7 @@ NamedValueSet* Image::getProperties() const
 }\r
 \r
 //==============================================================================\r
-Image::BitmapData::BitmapData (Image& im, int x, int y, int w, int h, BitmapData::ReadWriteMode mode)\r
+Image::BitmapData::BitmapData (Image& im, const int x, const int y, const int w, const int h, BitmapData::ReadWriteMode mode)\r
     : width (w), height (h)\r
 {\r
     // The BitmapData class must be given a valid image, and a valid rectangle within it!\r
@@ -386,7 +382,7 @@ Image::BitmapData::BitmapData (Image& im, int x, int y, int w, int h, BitmapData
     jassert (data != nullptr && pixelStride > 0 && lineStride != 0);\r
 }\r
 \r
-Image::BitmapData::BitmapData (const Image& im, int x, int y, int w, int h)\r
+Image::BitmapData::BitmapData (const Image& im, const int x, const int y, const int w, const int h)\r
     : width (w), height (h)\r
 {\r
     // The BitmapData class must be given a valid image, and a valid rectangle within it!\r
@@ -412,11 +408,11 @@ Image::BitmapData::~BitmapData()
 {\r
 }\r
 \r
-Colour Image::BitmapData::getPixelColour (int x, int y) const noexcept\r
+Colour Image::BitmapData::getPixelColour (const int x, const int y) const noexcept\r
 {\r
     jassert (isPositiveAndBelow (x, width) && isPositiveAndBelow (y, height));\r
 \r
-    auto pixel = getPixelPointer (x, y);\r
+    const uint8* const pixel = getPixelPointer (x, y);\r
 \r
     switch (pixelFormat)\r
     {\r
@@ -426,15 +422,15 @@ Colour Image::BitmapData::getPixelColour (int x, int y) const noexcept
         default:                    jassertfalse; break;\r
     }\r
 \r
-    return {};\r
+    return Colour();\r
 }\r
 \r
-void Image::BitmapData::setPixelColour (int x, int y, Colour colour) const noexcept\r
+void Image::BitmapData::setPixelColour (const int x, const int y, Colour colour) const noexcept\r
 {\r
     jassert (isPositiveAndBelow (x, width) && isPositiveAndBelow (y, height));\r
 \r
-    auto pixel = getPixelPointer (x, y);\r
-    auto col = colour.getPixelARGB();\r
+    uint8* const pixel = getPixelPointer (x, y);\r
+    const PixelARGB col (colour.getPixelARGB());\r
 \r
     switch (pixelFormat)\r
     {\r
@@ -457,7 +453,7 @@ void Image::clear (const Rectangle<int>& area, Colour colourToClearTo)
 }\r
 \r
 //==============================================================================\r
-Colour Image::getPixelAt (int x, int y) const\r
+Colour Image::getPixelAt (const int x, const int y) const\r
 {\r
     if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight()))\r
     {\r
@@ -465,10 +461,10 @@ Colour Image::getPixelAt (int x, int y) const
         return srcData.getPixelColour (0, 0);\r
     }\r
 \r
-    return {};\r
+    return Colour();\r
 }\r
 \r
-void Image::setPixelAt (int x, int y, Colour colour)\r
+void Image::setPixelAt (const int x, const int y, Colour colour)\r
 {\r
     if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight()))\r
     {\r
@@ -477,7 +473,7 @@ void Image::setPixelAt (int x, int y, Colour colour)
     }\r
 }\r
 \r
-void Image::multiplyAlphaAt (int x, int y, float multiplier)\r
+void Image::multiplyAlphaAt (const int x, const int y, const float multiplier)\r
 {\r
     if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight())\r
          && hasAlphaChannel())\r
@@ -485,7 +481,7 @@ void Image::multiplyAlphaAt (int x, int y, float multiplier)
         const BitmapData destData (*this, x, y, 1, 1, BitmapData::readWrite);\r
 \r
         if (isARGB())\r
-            reinterpret_cast<PixelARGB*> (destData.data)->multiplyAlpha (multiplier);\r
+            ((PixelARGB*) destData.data)->multiplyAlpha (multiplier);\r
         else\r
             *(destData.data) = (uint8) (*(destData.data) * multiplier);\r
     }\r
@@ -499,11 +495,11 @@ struct PixelIterator
     {\r
         for (int y = 0; y < data.height; ++y)\r
         {\r
-            auto p = data.getLinePointer (y);\r
+            uint8* p = data.getLinePointer (y);\r
 \r
             for (int x = 0; x < data.width; ++x)\r
             {\r
-                pixelOp (*reinterpret_cast<PixelType*> (p));\r
+                pixelOp (*(PixelType*) p);\r
                 p += data.pixelStride;\r
             }\r
         }\r
@@ -533,7 +529,7 @@ struct AlphaMultiplyOp
     }\r
 };\r
 \r
-void Image::multiplyAllAlphas (float amountToMultiplyBy)\r
+void Image::multiplyAllAlphas (const float amountToMultiplyBy)\r
 {\r
     jassert (hasAlphaChannel());\r
 \r
@@ -559,11 +555,11 @@ void Image::desaturate()
     }\r
 }\r
 \r
-void Image::createSolidAreaMask (RectangleList<int>& result, float alphaThreshold) const\r
+void Image::createSolidAreaMask (RectangleList<int>& result, const float alphaThreshold) const\r
 {\r
     if (hasAlphaChannel())\r
     {\r
-        auto threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));\r
+        const uint8 threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));\r
         SparseSet<int> pixelsOnRow;\r
 \r
         const BitmapData srcData (*this, 0, 0, getWidth(), getHeight());\r
@@ -571,13 +567,13 @@ void Image::createSolidAreaMask (RectangleList<int>& result, float alphaThreshol
         for (int y = 0; y < srcData.height; ++y)\r
         {\r
             pixelsOnRow.clear();\r
-            auto lineData = srcData.getLinePointer (y);\r
+            const uint8* lineData = srcData.getLinePointer (y);\r
 \r
             if (isARGB())\r
             {\r
                 for (int x = 0; x < srcData.width; ++x)\r
                 {\r
-                    if (reinterpret_cast<const PixelARGB*> (lineData)->getAlpha() >= threshold)\r
+                    if (((const PixelARGB*) lineData)->getAlpha() >= threshold)\r
                         pixelsOnRow.addRange (Range<int> (x, x + 1));\r
 \r
                     lineData += srcData.pixelStride;\r
@@ -596,7 +592,7 @@ void Image::createSolidAreaMask (RectangleList<int>& result, float alphaThreshol
 \r
             for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i)\r
             {\r
-                auto range = pixelsOnRow.getRange (i);\r
+                const Range<int> range (pixelsOnRow.getRange (i));\r
                 result.add (Rectangle<int> (range.getStart(), y, range.getLength(), 1));\r
             }\r
 \r
@@ -649,15 +645,15 @@ void Image::moveImageSection (int dx, int dy,
 \r
     if (w > 0 && h > 0)\r
     {\r
-        auto maxX = jmax (dx, sx) + w;\r
-        auto maxY = jmax (dy, sy) + h;\r
+        const int maxX = jmax (dx, sx) + w;\r
+        const int maxY = jmax (dy, sy) + h;\r
 \r
         const BitmapData destData (*this, minX, minY, maxX - minX, maxY - minY, BitmapData::readWrite);\r
 \r
-        auto dst = destData.getPixelPointer (dx - minX, dy - minY);\r
-        auto src = destData.getPixelPointer (sx - minX, sy - minY);\r
+        uint8* dst       = destData.getPixelPointer (dx - minX, dy - minY);\r
+        const uint8* src = destData.getPixelPointer (sx - minX, sy - minY);\r
 \r
-        auto lineSize = (size_t) (destData.pixelStride * w);\r
+        const size_t lineSize = (size_t) (destData.pixelStride * w);\r
 \r
         if (dy > sy)\r
         {\r
index 5fb5818ed06573e04a5e5bdab74e977763f26639..74de5addf57f9e1275394395e5a39d1ae624395a 100644 (file)
@@ -409,15 +409,15 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    ImagePixelData* getPixelData() const noexcept       { return image.get(); }\r
+    ImagePixelData* getPixelData() const noexcept       { return image; }\r
 \r
     /** @internal */\r
-    explicit Image (ReferenceCountedObjectPtr<ImagePixelData>) noexcept;\r
+    explicit Image (ImagePixelData*) noexcept;\r
 \r
     /* A null Image object that can be used when you need to return an invalid image.\r
         @deprecated If you need a default-constructed var, just use Image() or {}.\r
     */\r
-    JUCE_DEPRECATED_STATIC (static const Image null;)\r
+    JUCE_DEPRECATED_STATIC (static const Image null);\r
 \r
 private:\r
     //==============================================================================\r
index baed232ab115db472b3528ebabb2ef97f30a8fd0..2dcbc5e8bb291f09b65ae30c423affa6a8194b90 100644 (file)
@@ -71,8 +71,6 @@
   #include <cstdio>\r
  #endif\r
 \r
- #include <unordered_map>\r
-\r
  #ifdef JUCE_MSVC\r
   #pragma warning (pop)\r
  #endif\r
index 328ca12da61987e1a2d1c5b838421d6dd1794abd..8297e69eb54e7f0cfbaf734ae68a1ddbc0a72bb3 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_graphics\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE graphics classes\r
   description:      Classes for 2D vector graphics, image loading/saving, font handling, etc.\r
   website:          http://www.juce.com/juce\r
  #define JUCE_USE_DIRECTWRITE 1\r
 #endif\r
 \r
-/** Config: JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
-\r
-    Setting this flag will turn off CoreGraphics font smoothing, which some people\r
-    find makes the text too 'fat' for their taste.\r
-*/\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- #define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
 #ifndef JUCE_INCLUDE_PNGLIB_CODE\r
  #define JUCE_INCLUDE_PNGLIB_CODE 1\r
 #endif\r
index 39e46dbd06d84e0651e273aab2a774af4f34b788..9ac3ae20b1200b0ec626b0fe0e94e6357f517506 100644 (file)
@@ -194,34 +194,35 @@ public:
     {\r
         const ScopedLock sl (lock);\r
 \r
-        if (auto g = findExistingGlyph (font, glyphNumber))\r
+        if (auto* g = findExistingGlyph (font, glyphNumber))\r
         {\r
             ++hits;\r
             return g;\r
         }\r
 \r
         ++misses;\r
-        auto g = getGlyphForReuse();\r
+        auto* g = getGlyphForReuse();\r
         jassert (g != nullptr);\r
         g->generate (font, glyphNumber);\r
         return g;\r
     }\r
 \r
 private:\r
+    friend struct ContainerDeletePolicy<CachedGlyphType>;\r
     ReferenceCountedArray<CachedGlyphType> glyphs;\r
     Atomic<int> accessCounter, hits, misses;\r
     CriticalSection lock;\r
 \r
-    ReferenceCountedObjectPtr<CachedGlyphType> findExistingGlyph (const Font& font, int glyphNumber) const noexcept\r
+    CachedGlyphType* findExistingGlyph (const Font& font, int glyphNumber) const noexcept\r
     {\r
-        for (auto g : glyphs)\r
+        for (auto* g : glyphs)\r
             if (g->glyph == glyphNumber && g->font == font)\r
-                return *g;\r
+                return g;\r
 \r
-        return {};\r
+        return nullptr;\r
     }\r
 \r
-    ReferenceCountedObjectPtr<CachedGlyphType> getGlyphForReuse()\r
+    CachedGlyphType* getGlyphForReuse()\r
     {\r
         if (hits.get() + misses.get() > glyphs.size() * 16)\r
         {\r
@@ -232,8 +233,8 @@ private:
             misses = 0;\r
         }\r
 \r
-        if (auto g = findLeastRecentlyUsedGlyph())\r
-            return *g;\r
+        if (auto* g = findLeastRecentlyUsedGlyph())\r
+            return g;\r
 \r
         addNewGlyphSlots (32);\r
         return glyphs.getLast();\r
@@ -580,7 +581,7 @@ namespace EdgeTableFillers
         SolidColour (const Image::BitmapData& image, PixelARGB colour)\r
             : destData (image), sourceColour (colour)\r
         {\r
-            if (sizeof (PixelType) == 3 && (size_t) destData.pixelStride == sizeof (PixelType))\r
+            if (sizeof (PixelType) == 3 && destData.pixelStride == sizeof (PixelType))\r
             {\r
                 areRGBComponentsEqual = sourceColour.getRed() == sourceColour.getGreen()\r
                                             && sourceColour.getGreen() == sourceColour.getBlue();\r
@@ -689,11 +690,11 @@ namespace EdgeTableFillers
 \r
         forcedinline void replaceLine (PixelRGB* dest, PixelARGB colour, int width) const noexcept\r
         {\r
-            if ((size_t) destData.pixelStride == sizeof (*dest))\r
+            if (destData.pixelStride == sizeof (*dest))\r
             {\r
                 if (areRGBComponentsEqual)  // if all the component values are the same, we can cheat..\r
                 {\r
-                    memset ((void*) dest, colour.getRed(), (size_t) width * 3);\r
+                    memset (dest, colour.getRed(), (size_t) width * 3);\r
                 }\r
                 else\r
                 {\r
@@ -734,8 +735,8 @@ namespace EdgeTableFillers
 \r
         forcedinline void replaceLine (PixelAlpha* dest, const PixelARGB colour, int width) const noexcept\r
         {\r
-            if ((size_t) destData.pixelStride == sizeof (*dest))\r
-                memset ((void*) dest, colour.getAlpha(), (size_t) width);\r
+            if (destData.pixelStride == sizeof (*dest))\r
+                memset (dest, colour.getAlpha(), (size_t) width);\r
             else\r
                 JUCE_PERFORM_PIXEL_OP_LOOP (setAlpha (colour.getAlpha()))\r
         }\r
@@ -965,7 +966,7 @@ namespace EdgeTableFillers
                  && srcData.pixelFormat  == Image::RGB\r
                  && destData.pixelFormat == Image::RGB)\r
             {\r
-                memcpy ((void*) dest, src, (size_t) (width * srcStride));\r
+                memcpy (dest, src, (size_t) (width * srcStride));\r
             }\r
             else\r
             {\r
@@ -1670,13 +1671,13 @@ struct ClipRegions
 \r
         using Ptr = typename Base::Ptr;\r
 \r
-        Ptr clone() const override                           { return *new EdgeTableRegion (*this); }\r
+        Ptr clone() const override                           { return new EdgeTableRegion (*this); }\r
         Ptr applyClipTo (const Ptr& target) const override   { return target->clipToEdgeTable (edgeTable); }\r
 \r
         Ptr clipToRectangle (Rectangle<int> r) override\r
         {\r
             edgeTable.clipToRectangle (r);\r
-            return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+            return edgeTable.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr clipToRectangleList (const RectangleList<int>& r) override\r
@@ -1687,26 +1688,26 @@ struct ClipRegions
                 for (auto& i : inverse)\r
                     edgeTable.excludeRectangle (i);\r
 \r
-            return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+            return edgeTable.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr excludeClipRectangle (Rectangle<int> r) override\r
         {\r
             edgeTable.excludeRectangle (r);\r
-            return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+            return edgeTable.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr clipToPath (const Path& p, const AffineTransform& transform) override\r
         {\r
             EdgeTable et (edgeTable.getMaximumBounds(), p, transform);\r
             edgeTable.clipToEdgeTable (et);\r
-            return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+            return edgeTable.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr clipToEdgeTable (const EdgeTable& et) override\r
         {\r
             edgeTable.clipToEdgeTable (et);\r
-            return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+            return edgeTable.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr clipToImageAlpha (const Image& image, const AffineTransform& transform, Graphics::ResamplingQuality quality) override\r
@@ -1725,11 +1726,11 @@ struct ClipRegions
                     auto imageY = ((ty + 128) >> 8);\r
 \r
                     if (image.getFormat() == Image::ARGB)\r
-                        straightClipImage (srcData, imageX, imageY, (PixelARGB*) nullptr);\r
+                        straightClipImage (srcData, imageX, imageY, (PixelARGB*) 0);\r
                     else\r
-                        straightClipImage (srcData, imageX, imageY, (PixelAlpha*) nullptr);\r
+                        straightClipImage (srcData, imageX, imageY, (PixelAlpha*) 0);\r
 \r
-                    return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+                    return edgeTable.isEmpty() ? nullptr : this;\r
                 }\r
             }\r
 \r
@@ -1746,12 +1747,12 @@ struct ClipRegions
             if (! edgeTable.isEmpty())\r
             {\r
                 if (image.getFormat() == Image::ARGB)\r
-                    transformedClipImage (srcData, transform, quality, (PixelARGB*) nullptr);\r
+                    transformedClipImage (srcData, transform, quality, (PixelARGB*) 0);\r
                 else\r
-                    transformedClipImage (srcData, transform, quality, (PixelAlpha*) nullptr);\r
+                    transformedClipImage (srcData, transform, quality, (PixelAlpha*) 0);\r
             }\r
 \r
-            return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+            return edgeTable.isEmpty() ? nullptr : this;\r
         }\r
 \r
         void translate (Point<int> delta) override\r
@@ -1851,25 +1852,25 @@ struct ClipRegions
 \r
         using Ptr = typename Base::Ptr;\r
 \r
-        Ptr clone() const override                           { return *new RectangleListRegion (*this); }\r
+        Ptr clone() const override                           { return new RectangleListRegion (*this); }\r
         Ptr applyClipTo (const Ptr& target) const override   { return target->clipToRectangleList (clip); }\r
 \r
         Ptr clipToRectangle (Rectangle<int> r) override\r
         {\r
             clip.clipTo (r);\r
-            return clip.isEmpty() ? Ptr() : Ptr (*this);\r
+            return clip.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr clipToRectangleList (const RectangleList<int>& r) override\r
         {\r
             clip.clipTo (r);\r
-            return clip.isEmpty() ? Ptr() : Ptr (*this);\r
+            return clip.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr excludeClipRectangle (Rectangle<int> r) override\r
         {\r
             clip.subtract (r);\r
-            return clip.isEmpty() ? Ptr() : Ptr (*this);\r
+            return clip.isEmpty() ? nullptr : this;\r
         }\r
 \r
         Ptr clipToPath (const Path& p, const AffineTransform& transform) override  { return toEdgeTable()->clipToPath (p, transform); }\r
@@ -2068,7 +2069,7 @@ struct ClipRegions
             JUCE_DECLARE_NON_COPYABLE (SubRectangleIteratorFloat)\r
         };\r
 \r
-        Ptr toEdgeTable() const   { return *new EdgeTableRegion (clip); }\r
+        Ptr toEdgeTable() const   { return new EdgeTableRegion (clip); }\r
 \r
         RectangleListRegion& operator= (const RectangleListRegion&);\r
     };\r
@@ -2267,7 +2268,7 @@ public:
             auto clipped = clip->getClipBounds().getIntersection (r);\r
 \r
             if (! clipped.isEmpty())\r
-                fillShape (*new RectangleListRegionType (clipped), false);\r
+                fillShape (new RectangleListRegionType (clipped), false);\r
         }\r
     }\r
 \r
@@ -2282,7 +2283,7 @@ public:
             auto clipped = clip->getClipBounds().toFloat().getIntersection (r);\r
 \r
             if (! clipped.isEmpty())\r
-                fillShape (*new EdgeTableRegionType (clipped), false);\r
+                fillShape (new EdgeTableRegionType (clipped), false);\r
         }\r
     }\r
 \r
@@ -2336,7 +2337,7 @@ public:
 \r
             if (transform.isIdentity())\r
             {\r
-                fillShape (*new EdgeTableRegionType (list), false);\r
+                fillShape (new EdgeTableRegionType (list), false);\r
             }\r
             else if (! transform.isRotated)\r
             {\r
@@ -2347,7 +2348,7 @@ public:
                 else\r
                     transformed.transformAll (transform.getTransform());\r
 \r
-                fillShape (*new EdgeTableRegionType (transformed), false);\r
+                fillShape (new EdgeTableRegionType (transformed), false);\r
             }\r
             else\r
             {\r
@@ -2364,7 +2365,7 @@ public:
             auto clipRect = clip->getClipBounds();\r
 \r
             if (path.getBoundsTransformed (trans).getSmallestIntegerContainer().intersects (clipRect))\r
-                fillShape (*new EdgeTableRegionType (clipRect, path, trans), false);\r
+                fillShape (new EdgeTableRegionType (clipRect, path, trans), false);\r
         }\r
     }\r
 \r
@@ -2383,7 +2384,7 @@ public:
                     edgeTableClip->edgeTable.multiplyLevels (1.0f + 1.6f * brightness);\r
             }\r
 \r
-            fillShape (*edgeTableClip, false);\r
+            fillShape (edgeTableClip, false);\r
         }\r
     }\r
 \r
@@ -2397,15 +2398,15 @@ public:
     void drawImage (const Image& sourceImage, const AffineTransform& trans)\r
     {\r
         if (clip != nullptr && ! fillType.colour.isTransparent())\r
-            renderImage (sourceImage, trans, {});\r
+            renderImage (sourceImage, trans, nullptr);\r
     }\r
 \r
-    static bool isOnlyTranslationAllowingError (const AffineTransform& t, float tolerance) noexcept\r
+    static bool isOnlyTranslationAllowingError (const AffineTransform& t, float tolerence) noexcept\r
     {\r
-        return std::abs (t.mat01) < tolerance\r
-            && std::abs (t.mat10) < tolerance\r
-            && std::abs (t.mat00 - 1.0f) < tolerance\r
-            && std::abs (t.mat11 - 1.0f) < tolerance;\r
+        return std::abs (t.mat01) < tolerence\r
+            && std::abs (t.mat10) < tolerence\r
+            && std::abs (t.mat00 - 1.0f) < tolerence\r
+            && std::abs (t.mat11 - 1.0f) < tolerence;\r
     }\r
 \r
     void renderImage (const Image& sourceImage, const AffineTransform& trans, const BaseRegionType* tiledFillClipRegion)\r
@@ -2434,7 +2435,7 @@ public:
                     area = area.getIntersection (getThis().getMaximumBounds());\r
 \r
                     if (! area.isEmpty())\r
-                        if (auto c = clip->applyClipTo (*new EdgeTableRegionType (area)))\r
+                        if (auto c = clip->applyClipTo (new EdgeTableRegionType (area)))\r
                             c->renderImageUntransformed (getThis(), sourceImage, alpha, tx, ty, false);\r
                 }\r
 \r
@@ -2490,7 +2491,7 @@ public:
             }\r
             else if (fillType.isTiledImage())\r
             {\r
-                renderImage (fillType.image, fillType.transform, shapeToFill.get());\r
+                renderImage (fillType.image, fillType.transform, shapeToFill);\r
             }\r
             else\r
             {\r
@@ -2609,7 +2610,7 @@ public:
                 std::unique_ptr<EdgeTable> et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight));\r
 \r
                 if (et != nullptr)\r
-                    fillShape (*new EdgeTableRegionType (*et), false);\r
+                    fillShape (new EdgeTableRegionType (*et), false);\r
             }\r
         }\r
     }\r
@@ -2640,9 +2641,9 @@ public:
 \r
         switch (destData.pixelFormat)\r
         {\r
-            case Image::ARGB:   EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelARGB*) nullptr); break;\r
-            case Image::RGB:    EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelRGB*) nullptr); break;\r
-            default:            EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelAlpha*) nullptr); break;\r
+            case Image::ARGB:   EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelARGB*) 0); break;\r
+            case Image::RGB:    EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelRGB*) 0); break;\r
+            default:            EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelAlpha*) 0); break;\r
         }\r
     }\r
 \r
@@ -2657,9 +2658,9 @@ public:
 \r
         switch (destData.pixelFormat)\r
         {\r
-            case Image::ARGB:   EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) nullptr); break;\r
-            case Image::RGB:    EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) nullptr); break;\r
-            default:            EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) nullptr); break;\r
+            case Image::ARGB:   EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) 0); break;\r
+            case Image::RGB:    EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) 0); break;\r
+            default:            EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) 0); break;\r
         }\r
     }\r
 \r
index 4e0c750d2dec511db4cab3c31233c1e5062eb753..e058f87cea0196bd56d2821885287277afbf6bc5 100644 (file)
@@ -98,7 +98,7 @@ bool TextLayout::createNativeLayout (const AttributedString&)
  STATICMETHOD (create,          "create",           "(Ljava/lang/String;I)Landroid/graphics/Typeface;") \\r
  STATICMETHOD (createFromFile,  "createFromFile",   "(Ljava/lang/String;)Landroid/graphics/Typeface;") \\r
 \r
-DECLARE_JNI_CLASS (TypefaceClass, "android/graphics/Typeface")\r
+DECLARE_JNI_CLASS (TypefaceClass, "android/graphics/Typeface");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -199,8 +199,8 @@ public:
     float getStringWidth (const String& text) override\r
     {\r
         JNIEnv* env = getEnv();\r
-        auto numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
-        jfloatArray widths = env->NewFloatArray ((int) numChars);\r
+        const int numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
+        jfloatArray widths = env->NewFloatArray (numChars);\r
 \r
         const int numDone = paint.callIntMethod (AndroidPaint.getTextWidths, javaString (text).get(), widths);\r
 \r
@@ -209,7 +209,6 @@ public:
         env->DeleteLocalRef (widths);\r
 \r
         float x = 0;\r
-\r
         for (int i = 0; i < numDone; ++i)\r
             x += localWidths[i];\r
 \r
@@ -219,8 +218,8 @@ public:
     void getGlyphPositions (const String& text, Array<int>& glyphs, Array<float>& xOffsets) override\r
     {\r
         JNIEnv* env = getEnv();\r
-        auto numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
-        jfloatArray widths = env->NewFloatArray ((int) numChars);\r
+        const int numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
+        jfloatArray widths = env->NewFloatArray (numChars);\r
 \r
         const int numDone = paint.callIntMethod (AndroidPaint.getTextWidths, javaString (text).get(), widths);\r
 \r
@@ -231,8 +230,8 @@ public:
         auto s = text.getCharPointer();\r
 \r
         xOffsets.add (0);\r
-        float x = 0;\r
 \r
+        float x = 0;\r
         for (int i = 0; i < numDone; ++i)\r
         {\r
             const float local = localWidths[i];\r
index a53a5a559e18c1d54852ec954786eba1b1f0ee0e..2b354b2921e908cd583a33048d6044d5d6ccd242 100644 (file)
@@ -41,7 +41,6 @@ namespace GraphicsHelpers
         return getEnv()->NewObject (AndroidPaint, AndroidPaint.constructor, constructorFlags);\r
     }\r
 \r
-    //\r
     const jobject createMatrix (JNIEnv* env, const AffineTransform& t)\r
     {\r
         jobject m = env->NewObject (AndroidMatrix, AndroidMatrix.constructor);\r
index a041d221facbc6d39b5a5810dc0da2741aaebd6d..367d3b26bc6049fddba34308ac90ba505af09f61 100644 (file)
 namespace juce\r
 {\r
 \r
-struct FTLibWrapper  : public ReferenceCountedObject\r
+struct FTLibWrapper     : public ReferenceCountedObject\r
 {\r
-    FTLibWrapper()\r
+    FTLibWrapper() : library (0)\r
     {\r
         if (FT_Init_FreeType (&library) != 0)\r
         {\r
-            library = {};\r
+            library = 0;\r
             DBG ("Failed to initialize FreeType");\r
         }\r
     }\r
@@ -44,7 +44,7 @@ struct FTLibWrapper  : public ReferenceCountedObject
             FT_Done_FreeType (library);\r
     }\r
 \r
-    FT_Library library = {};\r
+    FT_Library library;\r
 \r
     using Ptr = ReferenceCountedObjectPtr<FTLibWrapper>;\r
 \r
@@ -55,18 +55,18 @@ struct FTLibWrapper  : public ReferenceCountedObject
 struct FTFaceWrapper     : public ReferenceCountedObject\r
 {\r
     FTFaceWrapper (const FTLibWrapper::Ptr& ftLib, const File& file, int faceIndex)\r
-        : library (ftLib)\r
+        : face (0), library (ftLib)\r
     {\r
         if (FT_New_Face (ftLib->library, file.getFullPathName().toUTF8(), faceIndex, &face) != 0)\r
-            face = {};\r
+            face = 0;\r
     }\r
 \r
     FTFaceWrapper (const FTLibWrapper::Ptr& ftLib, const void* data, size_t dataSize, int faceIndex)\r
-        : library (ftLib), savedFaceData (data, dataSize)\r
+        : face (0), library (ftLib), savedFaceData (data, dataSize)\r
     {\r
         if (FT_New_Memory_Face (ftLib->library, (const FT_Byte*) savedFaceData.getData(),\r
                                 (FT_Long) savedFaceData.getSize(), faceIndex, &face) != 0)\r
-            face = {};\r
+            face = 0;\r
     }\r
 \r
     ~FTFaceWrapper()\r
@@ -75,7 +75,7 @@ struct FTFaceWrapper     : public ReferenceCountedObject
             FT_Done_Face (face);\r
     }\r
 \r
-    FT_Face face = {};\r
+    FT_Face face;\r
     FTLibWrapper::Ptr library;\r
     MemoryBlock savedFaceData;\r
 \r
@@ -101,7 +101,7 @@ public:
     //==============================================================================\r
     struct KnownTypeface\r
     {\r
-        KnownTypeface (const File& f, int index, const FTFaceWrapper& face)\r
+        KnownTypeface (const File& f, const int index, const FTFaceWrapper& face)\r
            : file (f),\r
              family (face.face->family_name),\r
              style (face.face->style_name),\r
@@ -141,10 +141,10 @@ public:
 \r
     FTFaceWrapper::Ptr createFace (const String& fontName, const String& fontStyle)\r
     {\r
-        auto ftFace = matchTypeface (fontName, fontStyle);\r
+        const KnownTypeface* ftFace = matchTypeface (fontName, fontStyle);\r
 \r
         if (ftFace == nullptr)  ftFace = matchTypeface (fontName, "Regular");\r
-        if (ftFace == nullptr)  ftFace = matchTypeface (fontName, {});\r
+        if (ftFace == nullptr)  ftFace = matchTypeface (fontName, String());\r
 \r
         if (ftFace != nullptr)\r
             return createFace (ftFace->file, ftFace->faceIndex);\r
@@ -157,8 +157,8 @@ public:
     {\r
         StringArray s;\r
 \r
-        for (auto* face : faces)\r
-            s.addIfNotAlreadyThere (face->family);\r
+        for (int i = 0; i < faces.size(); ++i)\r
+            s.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
 \r
         return s;\r
     }\r
@@ -167,27 +167,28 @@ public:
     {\r
         int i = styles.indexOf ("Regular", true);\r
 \r
-        if (i >= 0)\r
-            return i;\r
+        if (i < 0)\r
+            for (i = 0; i < styles.size(); ++i)\r
+                if (! (styles[i].containsIgnoreCase ("Bold") || styles[i].containsIgnoreCase ("Italic")))\r
+                    break;\r
 \r
-        for (i = 0; i < styles.size(); ++i)\r
-            if (! (styles[i].containsIgnoreCase ("Bold") || styles[i].containsIgnoreCase ("Italic")))\r
-                return i;\r
-\r
-        return -1;\r
+        return i;\r
     }\r
 \r
     StringArray findAllTypefaceStyles (const String& family) const\r
     {\r
         StringArray s;\r
 \r
-        for (auto* face : faces)\r
+        for (int i = 0; i < faces.size(); ++i)\r
+        {\r
+            const KnownTypeface* const face = faces.getUnchecked(i);\r
+\r
             if (face->family == family)\r
                 s.addIfNotAlreadyThere (face->style);\r
+        }\r
 \r
         // try to get a regular style to be first in the list\r
-        auto regular = indexOfRegularStyle (s);\r
-\r
+        const int regular = indexOfRegularStyle (s);\r
         if (regular > 0)\r
             s.strings.swap (0, regular);\r
 \r
@@ -196,9 +197,10 @@ public:
 \r
     void scanFontPaths (const StringArray& paths)\r
     {\r
-        for (auto& path : paths)\r
+        for (int i = 0; i < paths.size(); ++i)\r
         {\r
-            DirectoryIterator iter (File::getCurrentWorkingDirectory().getChildFile (path), true);\r
+            DirectoryIterator iter (File::getCurrentWorkingDirectory()\r
+                                       .getChildFile (paths[i]), true);\r
 \r
             while (iter.next())\r
                 if (iter.getFile().hasFileExtension ("ttf;pfb;pcf;otf"))\r
@@ -208,23 +210,23 @@ public:
 \r
     void getMonospacedNames (StringArray& monoSpaced) const\r
     {\r
-        for (auto* face : faces)\r
-            if (face->isMonospaced)\r
-                monoSpaced.addIfNotAlreadyThere (face->family);\r
+        for (int i = 0; i < faces.size(); ++i)\r
+            if (faces.getUnchecked(i)->isMonospaced)\r
+                monoSpaced.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
     }\r
 \r
     void getSerifNames (StringArray& serif) const\r
     {\r
-        for (auto* face : faces)\r
-            if (! (face->isSansSerif || face->isMonospaced))\r
-                serif.addIfNotAlreadyThere (face->family);\r
+        for (int i = 0; i < faces.size(); ++i)\r
+            if (! faces.getUnchecked(i)->isSansSerif)\r
+                serif.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
     }\r
 \r
     void getSansSerifNames (StringArray& sansSerif) const\r
     {\r
-        for (auto* face : faces)\r
-            if (face->isSansSerif)\r
-                sansSerif.addIfNotAlreadyThere (face->family);\r
+        for (int i = 0; i < faces.size(); ++i)\r
+            if (faces.getUnchecked(i)->isSansSerif)\r
+                sansSerif.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
     }\r
 \r
     JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL (FTTypefaceList)\r
@@ -260,10 +262,14 @@ private:
 \r
     const KnownTypeface* matchTypeface (const String& familyName, const String& style) const noexcept\r
     {\r
-        for (auto* face : faces)\r
+        for (int i = 0; i < faces.size(); ++i)\r
+        {\r
+            const KnownTypeface* const face = faces.getUnchecked(i);\r
+\r
             if (face->family == familyName\r
                   && (face->style.equalsIgnoreCase (style) || style.isEmpty()))\r
                 return face;\r
+        }\r
 \r
         return nullptr;\r
     }\r
@@ -272,8 +278,8 @@ private:
     {\r
         static const char* sansNames[] = { "Sans", "Verdana", "Arial", "Ubuntu" };\r
 \r
-        for (auto* name : sansNames)\r
-            if (family.containsIgnoreCase (name))\r
+        for (int i = 0; i < numElementsInArray (sansNames); ++i)\r
+            if (family.containsIgnoreCase (sansNames[i]))\r
                 return true;\r
 \r
         return false;\r
@@ -317,13 +323,13 @@ public:
     {\r
         if (faceWrapper != nullptr)\r
         {\r
-            auto face = faceWrapper->face;\r
-            auto glyphIndex = FT_Get_Char_Index (face, (FT_ULong) character);\r
+            FT_Face face = faceWrapper->face;\r
+            const unsigned int glyphIndex = FT_Get_Char_Index (face, (FT_ULong) character);\r
 \r
             if (FT_Load_Glyph (face, glyphIndex, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM | FT_LOAD_NO_HINTING) == 0\r
                   && face->glyph->format == ft_glyph_format_outline)\r
             {\r
-                auto scale = 1.0f / (float) (face->ascender - face->descender);\r
+                const float scale = 1.0f / (float) (face->ascender - face->descender);\r
                 Path destShape;\r
 \r
                 if (getGlyphShape (destShape, face->glyph->outline, scale))\r
@@ -344,12 +350,12 @@ public:
 private:\r
     FTFaceWrapper::Ptr faceWrapper;\r
 \r
-    bool getGlyphShape (Path& destShape, const FT_Outline& outline, float scaleX)\r
+    bool getGlyphShape (Path& destShape, const FT_Outline& outline, const float scaleX)\r
     {\r
-        auto scaleY = -scaleX;\r
-        auto* contours = outline.contours;\r
-        auto* tags = outline.tags;\r
-        auto* points = outline.points;\r
+        const float scaleY = -scaleX;\r
+        const short* const contours = outline.contours;\r
+        const char* const tags = outline.tags;\r
+        const FT_Vector* const points = outline.points;\r
 \r
         for (int c = 0; c < outline.n_contours; ++c)\r
         {\r
@@ -358,15 +364,15 @@ private:
 \r
             for (int p = startPoint; p <= endPoint; ++p)\r
             {\r
-                auto x = scaleX * points[p].x;\r
-                auto y = scaleY * points[p].y;\r
+                const float x = scaleX * points[p].x;\r
+                const float y = scaleY * points[p].y;\r
 \r
                 if (p == startPoint)\r
                 {\r
                     if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic)\r
                     {\r
-                        auto x2 = scaleX * points [endPoint].x;\r
-                        auto y2 = scaleY * points [endPoint].y;\r
+                        float x2 = scaleX * points [endPoint].x;\r
+                        float y2 = scaleY * points [endPoint].y;\r
 \r
                         if (FT_CURVE_TAG (tags[endPoint]) != FT_Curve_Tag_On)\r
                         {\r
@@ -390,8 +396,8 @@ private:
                 else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic)\r
                 {\r
                     const int nextIndex = (p == endPoint) ? startPoint : p + 1;\r
-                    auto x2 = scaleX * points [nextIndex].x;\r
-                    auto y2 = scaleY * points [nextIndex].y;\r
+                    float x2 = scaleX * points [nextIndex].x;\r
+                    float y2 = scaleY * points [nextIndex].y;\r
 \r
                     if (FT_CURVE_TAG (tags [nextIndex]) == FT_Curve_Tag_Conic)\r
                     {\r
@@ -415,10 +421,10 @@ private:
                          || FT_CURVE_TAG (tags[next2]) != FT_Curve_Tag_On)\r
                         return false;\r
 \r
-                    auto x2 = scaleX * points [next1].x;\r
-                    auto y2 = scaleY * points [next1].y;\r
-                    auto x3 = scaleX * points [next2].x;\r
-                    auto y3 = scaleY * points [next2].y;\r
+                    const float x2 = scaleX * points [next1].x;\r
+                    const float y2 = scaleY * points [next1].y;\r
+                    const float x3 = scaleX * points [next2].x;\r
+                    const float y3 = scaleY * points [next2].y;\r
 \r
                     destShape.cubicTo (x, y, x2, y2, x3, y3);\r
                     p += 2;\r
@@ -433,10 +439,10 @@ private:
 \r
     void addKerning (FT_Face face, const uint32 character, const uint32 glyphIndex)\r
     {\r
-        auto height = (float) (face->ascender - face->descender);\r
+        const float height = (float) (face->ascender - face->descender);\r
 \r
         uint32 rightGlyphIndex;\r
-        auto rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex);\r
+        FT_ULong rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex);\r
 \r
         while (rightGlyphIndex != 0)\r
         {\r
index bff6dfac10eafed6b448f040c13f7e74d1a783ed..3b356ec53e2ab9afc8da4296b2e6442d3620840f 100644 (file)
 namespace juce\r
 {\r
 \r
-static std::unique_ptr<XmlElement> findFontsConfFile()\r
+static XmlElement* findFontsConfFile()\r
 {\r
     static const char* pathsToSearch[] = { "/etc/fonts/fonts.conf",\r
                                            "/usr/share/fonts/fonts.conf" };\r
 \r
     for (auto* path : pathsToSearch)\r
-        if (auto xml = parseXML (File (path)))\r
+        if (auto* xml = XmlDocument::parse (File (path)))\r
             return xml;\r
 \r
-    return {};\r
+    return nullptr;\r
 }\r
 \r
 StringArray FTTypefaceList::getDefaultFontDirectories()\r
@@ -48,7 +48,9 @@ StringArray FTTypefaceList::getDefaultFontDirectories()
 \r
     if (fontDirs.isEmpty())\r
     {\r
-        if (auto fontsInfo = findFontsConfFile())\r
+        std::unique_ptr<XmlElement> fontsInfo (findFontsConfFile());\r
+\r
+        if (fontsInfo != nullptr)\r
         {\r
             forEachXmlChildElementWithTagName (*fontsInfo, e, "dir")\r
             {\r
index bf9a0f5b64256ea05ec0173fa2278bf357ac9e0c..acab04451c845119159954cd3ac0d63c8e47e887 100644 (file)
@@ -80,7 +80,7 @@ private:
     float targetScale;\r
     CGColorSpaceRef rgbColourSpace, greyColourSpace;\r
     mutable Rectangle<int> lastClipRect;\r
-    mutable bool lastClipRectIsValid = false;\r
+    mutable bool lastClipRectIsValid;\r
 \r
     struct SavedState\r
     {\r
@@ -92,9 +92,9 @@ private:
 \r
         FillType fillType;\r
         Font font;\r
-        CGFontRef fontRef = {};\r
+        CGFontRef fontRef;\r
         CGAffineTransform fontTransform;\r
-        CGGradientRef gradient = {};\r
+        CGGradientRef gradient;\r
     };\r
 \r
     std::unique_ptr<SavedState> state;\r
index ec9b3457eac35148e69001892b69fd23ccc9ced4..99b3a0d871b21e6e2f8a1d9359e0ccef16b65403 100644 (file)
 namespace juce\r
 {\r
 \r
-#if (JUCE_IOS && defined (__IPHONE_12_0))\r
- #define JUCE_CORE_GRAPHICS_NEEDS_DELAYED_GARBAGE_COLLECTION 1\r
-#endif\r
-\r
-#if JUCE_CORE_GRAPHICS_NEEDS_DELAYED_GARBAGE_COLLECTION\r
-class CoreGraphicsImageGarbageCollector   : public Timer,\r
-                                            public DeletedAtShutdown\r
-{\r
-public:\r
-    CoreGraphicsImageGarbageCollector()\r
-    {\r
-        // TODO: Add an assertion here telling JUCE developers to move to the\r
-        // latest SDK if/when the CoreGraphics memory handling is fixed.\r
-    }\r
-\r
-    ~CoreGraphicsImageGarbageCollector()\r
-    {\r
-        clearSingletonInstance();\r
-    }\r
-\r
-    JUCE_DECLARE_SINGLETON (CoreGraphicsImageGarbageCollector, false)\r
-\r
-    void addItem (HeapBlock<uint8>&& data)\r
-    {\r
-        ScopedLock lock (queueLock);\r
-\r
-        queue.emplace_back (Time::getApproximateMillisecondCounter(), std::move (data));\r
-\r
-        if (! isTimerRunning())\r
-            startTimer (timeDelta);\r
-    }\r
-\r
-    void timerCallback() override\r
-    {\r
-        ScopedLock lock (queueLock);\r
-\r
-        auto cutoffTime = Time::getApproximateMillisecondCounter() - timeDelta;\r
-\r
-        auto it = std::find_if (queue.begin(), queue.end(),\r
-                                [cutoffTime](const std::pair<uint32, HeapBlock<uint8>>& x) { return x.first > cutoffTime; });\r
-        queue.erase (queue.begin(), it);\r
-\r
-        queue.empty() ? stopTimer() : startTimer (timeDelta);\r
-    }\r
-\r
-private:\r
-    CriticalSection queueLock;\r
-    std::vector<std::pair<uint32, HeapBlock<uint8>>> queue;\r
-    static constexpr uint32 timeDelta = 50;\r
-};\r
-\r
-JUCE_IMPLEMENT_SINGLETON (CoreGraphicsImageGarbageCollector)\r
-#endif\r
-\r
-//==============================================================================\r
 class CoreGraphicsImage   : public ImagePixelData\r
 {\r
 public:\r
-    CoreGraphicsImage (const Image::PixelFormat format, int w, int h, bool clearImage)\r
-        : ImagePixelData (format, w, h)\r
+    CoreGraphicsImage (const Image::PixelFormat format, const int w, const int h, const bool clearImage)\r
+        : ImagePixelData (format, w, h), cachedImageRef (0)\r
     {\r
         pixelStride = format == Image::RGB ? 3 : ((format == Image::ARGB) ? 4 : 1);\r
         lineStride = (pixelStride * jmax (1, width) + 3) & ~3;\r
 \r
-        auto numComponents = (size_t) lineStride * (size_t) jmax (1, height);\r
-\r
-       # if JUCE_MAC && defined (__MAC_10_14)\r
-        // This version of the SDK intermittently requires a bit of extra space\r
-        // at the end of the image data. This feels like something has gone\r
-        // wrong in Apple's code.\r
-        numComponents += (size_t) lineStride;\r
-       #endif\r
-\r
-        imageData.allocate (numComponents, clearImage);\r
+        imageData.allocate ((size_t) lineStride * (size_t) jmax (1, height), clearImage);\r
 \r
         CGColorSpaceRef colourSpace = (format == Image::SingleChannel) ? CGColorSpaceCreateDeviceGray()\r
                                                                        : CGColorSpaceCreateDeviceRGB();\r
@@ -115,10 +51,6 @@ public:
     {\r
         freeCachedImageRef();\r
         CGContextRelease (context);\r
-\r
-       #if JUCE_CORE_GRAPHICS_NEEDS_DELAYED_GARBAGE_COLLECTION\r
-        CoreGraphicsImageGarbageCollector::getInstance()->addItem (std::move (imageData));\r
-       #endif\r
     }\r
 \r
     LowLevelGraphicsContext* createLowLevelContext() override\r
@@ -144,9 +76,9 @@ public:
 \r
     ImagePixelData::Ptr clone() override\r
     {\r
-        auto im = new CoreGraphicsImage (pixelFormat, width, height, false);\r
+        CoreGraphicsImage* im = new CoreGraphicsImage (pixelFormat, width, height, false);\r
         memcpy (im->imageData, imageData, (size_t) (lineStride * height));\r
-        return *im;\r
+        return im;\r
     }\r
 \r
     ImageType* createType() const override    { return new NativeImageType(); }\r
@@ -154,9 +86,9 @@ public:
     //==============================================================================\r
     static CGImageRef getCachedImageRef (const Image& juceImage, CGColorSpaceRef colourSpace)\r
     {\r
-        auto cgim = dynamic_cast<CoreGraphicsImage*> (juceImage.getPixelData());\r
+        CoreGraphicsImage* const cgim = dynamic_cast<CoreGraphicsImage*> (juceImage.getPixelData());\r
 \r
-        if (cgim != nullptr && cgim->cachedImageRef != nullptr)\r
+        if (cgim != nullptr && cgim->cachedImageRef != 0)\r
         {\r
             CGImageRetain (cgim->cachedImageRef);\r
             return cgim->cachedImageRef;\r
@@ -173,29 +105,28 @@ public:
         return ref;\r
     }\r
 \r
-    static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace, bool mustOutliveSource)\r
+    static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace, const bool mustOutliveSource)\r
     {\r
         const Image::BitmapData srcData (juceImage, Image::BitmapData::readOnly);\r
         CGDataProviderRef provider;\r
 \r
         if (mustOutliveSource)\r
         {\r
-            CFDataRef data = CFDataCreate (nullptr, (const UInt8*) srcData.data, (CFIndex) ((size_t) srcData.lineStride * (size_t) srcData.height));\r
+            CFDataRef data = CFDataCreate (0, (const UInt8*) srcData.data, (CFIndex) ((size_t) srcData.lineStride * (size_t) srcData.height));\r
             provider = CGDataProviderCreateWithCFData (data);\r
             CFRelease (data);\r
         }\r
         else\r
         {\r
-            provider = CGDataProviderCreateWithData (nullptr, srcData.data, (size_t) srcData.lineStride * (size_t) srcData.height, nullptr);\r
+            provider = CGDataProviderCreateWithData (0, srcData.data, (size_t) srcData.lineStride * (size_t) srcData.height, 0);\r
         }\r
 \r
         CGImageRef imageRef = CGImageCreate ((size_t) srcData.width,\r
                                              (size_t) srcData.height,\r
-                                             8,\r
-                                             (size_t) srcData.pixelStride * 8,\r
+                                             8, (size_t) srcData.pixelStride * 8,\r
                                              (size_t) srcData.lineStride,\r
                                              colourSpace, getCGImageFlags (juceImage.getFormat()), provider,\r
-                                             nullptr, true, kCGRenderingIntentDefault);\r
+                                             0, true, kCGRenderingIntentDefault);\r
 \r
         CGDataProviderRelease (provider);\r
         return imageRef;\r
@@ -203,17 +134,17 @@ public:
 \r
     //==============================================================================\r
     CGContextRef context;\r
-    CGImageRef cachedImageRef = {};\r
+    CGImageRef cachedImageRef;\r
     HeapBlock<uint8> imageData;\r
     int pixelStride, lineStride;\r
 \r
 private:\r
     void freeCachedImageRef()\r
     {\r
-        if (cachedImageRef != CGImageRef())\r
+        if (cachedImageRef != 0)\r
         {\r
             CGImageRelease (cachedImageRef);\r
-            cachedImageRef = {};\r
+            cachedImageRef = 0;\r
         }\r
     }\r
 \r
@@ -231,28 +162,21 @@ private:
 \r
 ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const\r
 {\r
-    return *new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage);\r
+    return new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage);\r
 }\r
 \r
 //==============================================================================\r
-CoreGraphicsContext::CoreGraphicsContext (CGContextRef c, float h, float scale)\r
+CoreGraphicsContext::CoreGraphicsContext (CGContextRef c, const float h, const float scale)\r
     : context (c),\r
       flipHeight (h),\r
       targetScale (scale),\r
+      lastClipRectIsValid (false),\r
       state (new SavedState())\r
 {\r
     CGContextRetain (context);\r
     CGContextSaveGState (context);\r
-\r
-    bool enableFontSmoothing\r
-            #if JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
-             = false;\r
-            #else\r
-             = true;\r
-            #endif\r
-\r
-    CGContextSetShouldSmoothFonts (context, enableFontSmoothing);\r
-    CGContextSetAllowsFontSmoothing (context, enableFontSmoothing);\r
+    CGContextSetShouldSmoothFonts (context, true);\r
+    CGContextSetAllowsFontSmoothing (context, true);\r
     CGContextSetShouldAntialias (context, true);\r
     CGContextSetBlendMode (context, kCGBlendModeNormal);\r
     rgbColourSpace = CGColorSpaceCreateDeviceRGB();\r
@@ -291,15 +215,14 @@ void CoreGraphicsContext::addTransform (const AffineTransform& transform)
 \r
 float CoreGraphicsContext::getPhysicalPixelScaleFactor()\r
 {\r
-    auto t = CGContextGetCTM (context);\r
+    const CGAffineTransform t = CGContextGetCTM (context);\r
 \r
     return targetScale * (float) (juce_hypot (t.a, t.c) + juce_hypot (t.b, t.d)) / 2.0f;\r
 }\r
 \r
 bool CoreGraphicsContext::clipToRectangle (const Rectangle<int>& r)\r
 {\r
-    CGContextClipToRect (context, CGRectMake (r.getX(), flipHeight - r.getBottom(),\r
-                                              r.getWidth(), r.getHeight()));\r
+    CGContextClipToRect (context, CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()));\r
 \r
     if (lastClipRectIsValid)\r
     {\r
@@ -372,10 +295,10 @@ void CoreGraphicsContext::clipToImageAlpha (const Image& sourceImage, const Affi
         CGImageRef image = CoreGraphicsImage::createImage (singleChannelImage, greyColourSpace, true);\r
 \r
         flip();\r
-        auto t = AffineTransform::verticalFlip (sourceImage.getHeight()).followedBy (transform);\r
+        AffineTransform t (AffineTransform::verticalFlip (sourceImage.getHeight()).followedBy (transform));\r
         applyTransform (t);\r
 \r
-        auto r = convertToCGRect (sourceImage.getBounds());\r
+        CGRect r = convertToCGRect (sourceImage.getBounds());\r
         CGContextClipToMask (context, r, image);\r
 \r
         applyTransform (t.inverted());\r
@@ -395,7 +318,7 @@ Rectangle<int> CoreGraphicsContext::getClipBounds() const
 {\r
     if (! lastClipRectIsValid)\r
     {\r
-        auto bounds = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
+        CGRect bounds = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
 \r
         lastClipRectIsValid = true;\r
         lastClipRect.setBounds (roundToInt (bounds.origin.x),\r
@@ -439,7 +362,7 @@ void CoreGraphicsContext::beginTransparencyLayer (float opacity)
 {\r
     saveState();\r
     CGContextSetAlpha (context, opacity);\r
-    CGContextBeginTransparencyLayer (context, nullptr);\r
+    CGContextBeginTransparencyLayer (context, 0);\r
 }\r
 \r
 void CoreGraphicsContext::endTransparencyLayer()\r
@@ -479,7 +402,7 @@ void CoreGraphicsContext::setInterpolationQuality (Graphics::ResamplingQuality q
 }\r
 \r
 //==============================================================================\r
-void CoreGraphicsContext::fillRect (const Rectangle<int>& r, bool replaceExistingContents)\r
+void CoreGraphicsContext::fillRect (const Rectangle<int>& r, const bool replaceExistingContents)\r
 {\r
     fillCGRect (CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()), replaceExistingContents);\r
 }\r
@@ -489,7 +412,7 @@ void CoreGraphicsContext::fillRect (const Rectangle<float>& r)
     fillCGRect (CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()), false);\r
 }\r
 \r
-void CoreGraphicsContext::fillCGRect (const CGRect& cgRect, bool replaceExistingContents)\r
+void CoreGraphicsContext::fillCGRect (const CGRect& cgRect, const bool replaceExistingContents)\r
 {\r
     if (replaceExistingContents)\r
     {\r
@@ -558,21 +481,19 @@ void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTrans
     drawImage (sourceImage, transform, false);\r
 }\r
 \r
-void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTransform& transform, bool fillEntireClipAsTiles)\r
+void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTransform& transform, const bool fillEntireClipAsTiles)\r
 {\r
-    auto iw = sourceImage.getWidth();\r
-    auto ih = sourceImage.getHeight();\r
-\r
-    auto colourSpace = sourceImage.getFormat() == Image::PixelFormat::SingleChannel ? greyColourSpace\r
-                                                                                    : rgbColourSpace;\r
-    CGImageRef image = CoreGraphicsImage::getCachedImageRef (sourceImage, colourSpace);\r
+    const int iw = sourceImage.getWidth();\r
+    const int ih = sourceImage.getHeight();\r
+    CGImageRef image = CoreGraphicsImage::getCachedImageRef (sourceImage, sourceImage.getFormat() == Image::PixelFormat::SingleChannel ? greyColourSpace\r
+                                                                                                                                       : rgbColourSpace);\r
 \r
     CGContextSaveGState (context);\r
     CGContextSetAlpha (context, state->fillType.getOpacity());\r
 \r
     flip();\r
     applyTransform (AffineTransform::verticalFlip (ih).followedBy (transform));\r
-    auto imageRect = CGRectMake (0, 0, iw, ih);\r
+    CGRect imageRect = CGRectMake (0, 0, iw, ih);\r
 \r
     if (fillEntireClipAsTiles)\r
     {\r
@@ -581,21 +502,21 @@ void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTrans
       #else\r
         // There's a bug in CGContextDrawTiledImage that makes it incredibly slow\r
         // if it's doing a transformation - it's quicker to just draw lots of images manually\r
-        if (&CGContextDrawTiledImage != nullptr && transform.isOnlyTranslation())\r
+        if (&CGContextDrawTiledImage != 0 && transform.isOnlyTranslation())\r
         {\r
             CGContextDrawTiledImage (context, imageRect, image);\r
         }\r
         else\r
         {\r
             // Fallback to manually doing a tiled fill\r
-            auto clip = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
+            CGRect clip = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
 \r
             int x = 0, y = 0;\r
             while (x > clip.origin.x)   x -= iw;\r
             while (y > clip.origin.y)   y -= ih;\r
 \r
-            auto right  = (int) (clip.origin.x + clip.size.width);\r
-            auto bottom = (int) (clip.origin.y + clip.size.height);\r
+            const int right  = (int) (clip.origin.x + clip.size.width);\r
+            const int bottom = (int) (clip.origin.y + clip.size.height);\r
 \r
             while (y < bottom)\r
             {\r
@@ -619,9 +540,25 @@ void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTrans
 //==============================================================================\r
 void CoreGraphicsContext::drawLine (const Line<float>& line)\r
 {\r
-    Path p;\r
-    p.addLineSegment (line, 1.0f);\r
-    fillPath (p, {});\r
+    if (state->fillType.isColour())\r
+    {\r
+        CGContextSetLineCap (context, kCGLineCapSquare);\r
+        CGContextSetLineWidth (context, 1.0f);\r
+        CGContextSetRGBStrokeColor (context,\r
+                                    state->fillType.colour.getFloatRed(), state->fillType.colour.getFloatGreen(),\r
+                                    state->fillType.colour.getFloatBlue(), state->fillType.colour.getFloatAlpha());\r
+\r
+        CGPoint cgLine[] = { { (CGFloat) line.getStartX(), flipHeight - (CGFloat) line.getStartY() },\r
+                             { (CGFloat) line.getEndX(),   flipHeight - (CGFloat) line.getEndY()   } };\r
+\r
+        CGContextStrokeLineSegments (context, cgLine, 1);\r
+    }\r
+    else\r
+    {\r
+        Path p;\r
+        p.addLineSegment (line, 1.0f);\r
+        fillPath (p, AffineTransform());\r
+    }\r
 }\r
 \r
 void CoreGraphicsContext::fillRectList (const RectangleList<float>& list)\r
@@ -657,10 +594,10 @@ void CoreGraphicsContext::setFont (const Font& newFont)
 {\r
     if (state->font != newFont)\r
     {\r
-        state->fontRef = nullptr;\r
+        state->fontRef = 0;\r
         state->font = newFont;\r
 \r
-        if (auto osxTypeface = dynamic_cast<OSXTypeface*> (state->font.getTypeface()))\r
+        if (OSXTypeface* osxTypeface = dynamic_cast<OSXTypeface*> (state->font.getTypeface()))\r
         {\r
             state->fontRef = osxTypeface->fontRef;\r
             CGContextSetFont (context, state->fontRef);\r
@@ -680,7 +617,7 @@ const Font& CoreGraphicsContext::getFont()
 \r
 void CoreGraphicsContext::drawGlyph (int glyphNumber, const AffineTransform& transform)\r
 {\r
-    if (state->fontRef != nullptr && state->fillType.isColour())\r
+    if (state->fontRef != 0 && state->fillType.isColour())\r
     {\r
        #if JUCE_CLANG\r
         #pragma clang diagnostic push\r
@@ -691,7 +628,7 @@ void CoreGraphicsContext::drawGlyph (int glyphNumber, const AffineTransform& tra
         {\r
             CGContextSetTextMatrix (context, state->fontTransform); // have to set this each time, as it's not saved as part of the state\r
 \r
-            auto g = (CGGlyph) glyphNumber;\r
+            CGGlyph g = (CGGlyph) glyphNumber;\r
             CGContextShowGlyphsAtPoint (context, transform.getTranslationX(),\r
                                         flipHeight - roundToInt (transform.getTranslationY()), &g, 1);\r
         }\r
@@ -701,11 +638,11 @@ void CoreGraphicsContext::drawGlyph (int glyphNumber, const AffineTransform& tra
             flip();\r
             applyTransform (transform);\r
 \r
-            auto t = state->fontTransform;\r
+            CGAffineTransform t = state->fontTransform;\r
             t.d = -t.d;\r
             CGContextSetTextMatrix (context, t);\r
 \r
-            auto g = (CGGlyph) glyphNumber;\r
+            CGGlyph g = (CGGlyph) glyphNumber;\r
             CGContextShowGlyphsAtPoint (context, 0, 0, &g, 1);\r
 \r
             CGContextRestoreGState (context);\r
@@ -718,7 +655,7 @@ void CoreGraphicsContext::drawGlyph (int glyphNumber, const AffineTransform& tra
     else\r
     {\r
         Path p;\r
-        auto& f = state->font;\r
+        Font& f = state->font;\r
         f.getTypeface()->getOutlineForGlyph (glyphNumber, p);\r
 \r
         fillPath (p, AffineTransform::scale (f.getHeight() * f.getHorizontalScale(), f.getHeight())\r
@@ -733,7 +670,7 @@ bool CoreGraphicsContext::drawTextLayout (const AttributedString& text, const Re
 }\r
 \r
 CoreGraphicsContext::SavedState::SavedState()\r
-    : font (1.0f), fontTransform (CGAffineTransformIdentity)\r
+    : font (1.0f), fontRef (0), fontTransform (CGAffineTransformIdentity), gradient (0)\r
 {\r
 }\r
 \r
@@ -741,13 +678,13 @@ CoreGraphicsContext::SavedState::SavedState (const SavedState& other)
     : fillType (other.fillType), font (other.font), fontRef (other.fontRef),\r
       fontTransform (other.fontTransform), gradient (other.gradient)\r
 {\r
-    if (gradient != nullptr)\r
+    if (gradient != 0)\r
         CGGradientRetain (gradient);\r
 }\r
 \r
 CoreGraphicsContext::SavedState::~SavedState()\r
 {\r
-    if (gradient != nullptr)\r
+    if (gradient != 0)\r
         CGGradientRelease (gradient);\r
 }\r
 \r
@@ -755,24 +692,24 @@ void CoreGraphicsContext::SavedState::setFill (const FillType& newFill)
 {\r
     fillType = newFill;\r
 \r
-    if (gradient != nullptr)\r
+    if (gradient != 0)\r
     {\r
         CGGradientRelease (gradient);\r
-        gradient = nullptr;\r
+        gradient = 0;\r
     }\r
 }\r
 \r
 static CGGradientRef createGradient (const ColourGradient& g, CGColorSpaceRef colourSpace)\r
 {\r
-    auto numColours = g.getNumColours();\r
-    auto data = (CGFloat*) alloca ((size_t) numColours * 5 * sizeof (CGFloat));\r
-    auto locations = data;\r
-    auto components = data + numColours;\r
-    auto comps = components;\r
+    const int numColours = g.getNumColours();\r
+    CGFloat* const data = (CGFloat*) alloca ((size_t) numColours * 5 * sizeof (CGFloat));\r
+    CGFloat* const locations = data;\r
+    CGFloat* const components = data + numColours;\r
+    CGFloat* comps = components;\r
 \r
     for (int i = 0; i < numColours; ++i)\r
     {\r
-        auto colour = g.getColour (i);\r
+        const Colour colour (g.getColour (i));\r
         *comps++ = (CGFloat) colour.getFloatRed();\r
         *comps++ = (CGFloat) colour.getFloatGreen();\r
         *comps++ = (CGFloat) colour.getFloatBlue();\r
@@ -793,14 +730,14 @@ void CoreGraphicsContext::drawGradient()
     applyTransform (state->fillType.transform);\r
     CGContextSetAlpha (context, state->fillType.getOpacity());\r
 \r
-    auto& g = *state->fillType.gradient;\r
+    const ColourGradient& g = *state->fillType.gradient;\r
 \r
-    auto p1 = convertToCGPoint (g.point1);\r
-    auto p2 = convertToCGPoint (g.point2);\r
+    CGPoint p1 (convertToCGPoint (g.point1));\r
+    CGPoint p2 (convertToCGPoint (g.point2));\r
 \r
     state->fillType.transform.transformPoints (p1.x, p1.y, p2.x, p2.y);\r
 \r
-    if (state->gradient == nullptr)\r
+    if (state->gradient == 0)\r
         state->gradient = createGradient (g, rgbColourSpace);\r
 \r
     if (g.isRadial)\r
@@ -898,19 +835,19 @@ Image juce_loadWithCoreImage (InputStream& input)
             CGImageRef loadedImage = uiImage.CGImage;\r
 \r
       #else\r
-        auto provider = CGDataProviderCreateWithData (nullptr, data.getData(), data.getSize(), nullptr);\r
-        auto imageSource = CGImageSourceCreateWithDataProvider (provider, nullptr);\r
+        CGDataProviderRef provider = CGDataProviderCreateWithData (0, data.getData(), data.getSize(), 0);\r
+        CGImageSourceRef imageSource = CGImageSourceCreateWithDataProvider (provider, 0);\r
         CGDataProviderRelease (provider);\r
 \r
-        if (imageSource != nullptr)\r
+        if (imageSource != 0)\r
         {\r
-            auto loadedImage = CGImageSourceCreateImageAtIndex (imageSource, 0, nullptr);\r
+            CGImageRef loadedImage = CGImageSourceCreateImageAtIndex (imageSource, 0, 0);\r
             CFRelease (imageSource);\r
       #endif\r
 \r
-            if (loadedImage != nullptr)\r
+            if (loadedImage != 0)\r
             {\r
-                auto alphaInfo = CGImageGetAlphaInfo (loadedImage);\r
+                CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo (loadedImage);\r
                 const bool hasAlphaChan = (alphaInfo != kCGImageAlphaNone\r
                                              && alphaInfo != kCGImageAlphaNoneSkipLast\r
                                              && alphaInfo != kCGImageAlphaNoneSkipFirst);\r
@@ -920,7 +857,7 @@ Image juce_loadWithCoreImage (InputStream& input)
                                                        (int) CGImageGetHeight (loadedImage),\r
                                                        hasAlphaChan));\r
 \r
-                auto cgImage = dynamic_cast<CoreGraphicsImage*> (image.getPixelData());\r
+                CoreGraphicsImage* const cgImage = dynamic_cast<CoreGraphicsImage*> (image.getPixelData());\r
                 jassert (cgImage != nullptr); // if USE_COREGRAPHICS_RENDERING is set, the CoreGraphicsImage class should have been used.\r
 \r
                 CGContextDrawImage (cgImage->context, convertToCGRect (image.getBounds()), loadedImage);\r
@@ -938,20 +875,20 @@ Image juce_loadWithCoreImage (InputStream& input)
         }\r
     }\r
 \r
-    return {};\r
+    return Image();\r
 }\r
 #endif\r
 \r
 Image juce_createImageFromCIImage (CIImage*, int, int);\r
 Image juce_createImageFromCIImage (CIImage* im, int w, int h)\r
 {\r
-    auto cgImage = new CoreGraphicsImage (Image::ARGB, w, h, false);\r
+    CoreGraphicsImage* cgImage = new CoreGraphicsImage (Image::ARGB, w, h, false);\r
 \r
     CIContext* cic = [CIContext contextWithCGContext: cgImage->context options: nil];\r
     [cic drawImage: im inRect: CGRectMake (0, 0, w, h) fromRect: CGRectMake (0, 0, w, h)];\r
     CGContextFlush (cgImage->context);\r
 \r
-    return Image (*cgImage);\r
+    return Image (cgImage);\r
 }\r
 \r
 CGImageRef juce_createCoreGraphicsImage (const Image& juceImage, CGColorSpaceRef colourSpace,\r
@@ -962,11 +899,11 @@ CGImageRef juce_createCoreGraphicsImage (const Image& juceImage, CGColorSpaceRef
 \r
 CGContextRef juce_getImageContext (const Image& image)\r
 {\r
-    if (auto cgi = dynamic_cast<CoreGraphicsImage*> (image.getPixelData()))\r
+    if (CoreGraphicsImage* const cgi = dynamic_cast<CoreGraphicsImage*> (image.getPixelData()))\r
         return cgi->context;\r
 \r
     jassertfalse;\r
-    return {};\r
+    return 0;\r
 }\r
 \r
 #if JUCE_IOS\r
@@ -992,8 +929,8 @@ CGContextRef juce_getImageContext (const Image& image)
          auto requiredSize = NSMakeSize (image.getWidth() / scaleFactor, image.getHeight() / scaleFactor);\r
 \r
          [im setSize: requiredSize];\r
-         auto colourSpace = CGColorSpaceCreateDeviceRGB();\r
-         auto imageRef = juce_createCoreGraphicsImage (image, colourSpace, true);\r
+         CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();\r
+         CGImageRef imageRef = juce_createCoreGraphicsImage (image, colourSpace, true);\r
          CGColorSpaceRelease (colourSpace);\r
 \r
          NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithCGImage: imageRef];\r
index 0780c33fef6337e81de2c803a3b44eaa9ec4ef90..3fccb40cb89ce064c77e687110e0bec0deb409ba 100644 (file)
@@ -239,7 +239,7 @@ namespace CoreTextTypeLayout
                 {\r
                     extraKerning *= attr.font.getHeight();\r
 \r
-                    auto numberRef = CFNumberCreate (nullptr, kCFNumberFloatType, &extraKerning);\r
+                    auto numberRef = CFNumberCreate (0, kCFNumberFloatType, &extraKerning);\r
                     CFAttributedStringSetAttribute (attribString, range, kCTKernAttributeName, numberRef);\r
                     CFRelease (numberRef);\r
                 }\r
@@ -540,7 +540,7 @@ public:
         fontHeightToPointsFactor = referenceFontSize / ctTotalHeight;\r
 \r
         const short zero = 0;\r
-        auto numberRef = CFNumberCreate (nullptr, kCFNumberShortType, &zero);\r
+        auto numberRef = CFNumberCreate (0, kCFNumberShortType, &zero);\r
 \r
         CFStringRef keys[] = { kCTFontAttributeName, kCTLigatureAttributeName };\r
         CFTypeRef values[] = { ctFontRef, numberRef };\r
@@ -788,8 +788,8 @@ StringArray Font::findAllTypefaceStyles (const String& family)
 \r
 \r
 //==============================================================================\r
-Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font)                  { return *new OSXTypeface (font); }\r
-Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size)     { return *new OSXTypeface (data, size); }\r
+Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font)                  { return new OSXTypeface (font); }\r
+Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size)     { return new OSXTypeface (data, size); }\r
 \r
 void Typeface::scanFolderForFonts (const File&)\r
 {\r
index 75a58b90d8b885456a6c18d8f71eaa7c7d731809..b9f7d592ffb4d49ddf06938c698afbfa787b66a6 100644 (file)
@@ -761,7 +761,7 @@ void Direct2DLowLevelGraphicsContext::drawImage (const Image& image, const Affin
     pimpl->renderingTarget->SetTransform (D2D1::IdentityMatrix());\r
 }\r
 \r
-void Direct2DLowLevelGraphicsContext::drawLine (const Line<float>& line)\r
+void Direct2DLowLevelGraphicsContext::drawLine (const Line <float>& line)\r
 {\r
     // xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour\r
     pimpl->renderingTarget->SetTransform (transformToMatrix (currentState->transform));\r
index ff39e0642b46712ecda1260d50b46085a6516835..473ca1703b35d010fc1f868cff8816ba91051586 100644 (file)
@@ -96,6 +96,8 @@ private:
     Rectangle<int> bounds;\r
 \r
     struct Pimpl;\r
+    friend struct Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Direct2DLowLevelGraphicsContext)\r
index ae2e284fc10afdd1890db571a5d0e49864f5b7ef..d007ebb6bc01cb3cac551befa7087b7a83fabca1 100644 (file)
@@ -36,7 +36,9 @@ namespace DirectWriteTypeLayout
         CustomDirectWriteTextRenderer (IDWriteFontCollection& fonts, const AttributedString& as)\r
             : ComBaseClassHelper<IDWriteTextRenderer> (0),\r
               attributedString (as),\r
-              fontCollection (fonts)\r
+              fontCollection (fonts),\r
+              currentLine (-1),\r
+              lastOriginY (-10000.0f)\r
         {\r
         }\r
 \r
@@ -87,7 +89,7 @@ namespace DirectWriteTypeLayout
                                      DWRITE_GLYPH_RUN const* glyphRun, DWRITE_GLYPH_RUN_DESCRIPTION const* runDescription,\r
                                      IUnknown* clientDrawingEffect) override\r
         {\r
-            auto layout = static_cast<TextLayout*> (clientDrawingContext);\r
+            TextLayout* const layout = static_cast<TextLayout*> (clientDrawingContext);\r
 \r
             if (! (baselineOriginY >= -1.0e10f && baselineOriginY <= 1.0e10f))\r
                 baselineOriginY = 0; // DirectWrite sometimes sends NaNs in this parameter\r
@@ -100,14 +102,14 @@ namespace DirectWriteTypeLayout
                 if (currentLine >= layout->getNumLines())\r
                 {\r
                     jassert (currentLine == layout->getNumLines());\r
-                    auto line = new TextLayout::Line();\r
+                    TextLayout::Line* const line = new TextLayout::Line();\r
                     layout->addLine (line);\r
 \r
                     line->lineOrigin = Point<float> (baselineOriginX, baselineOriginY);\r
                 }\r
             }\r
 \r
-            auto& glyphLine = layout->getLine (currentLine);\r
+            TextLayout::Line& glyphLine = layout->getLine (currentLine);\r
 \r
             DWRITE_FONT_METRICS dwFontMetrics;\r
             glyphRun->fontFace->GetMetrics (&dwFontMetrics);\r
@@ -115,27 +117,27 @@ namespace DirectWriteTypeLayout
             glyphLine.ascent  = jmax (glyphLine.ascent,  scaledFontSize (dwFontMetrics.ascent,  dwFontMetrics, *glyphRun));\r
             glyphLine.descent = jmax (glyphLine.descent, scaledFontSize (dwFontMetrics.descent, dwFontMetrics, *glyphRun));\r
 \r
-            auto glyphRunLayout = new TextLayout::Run (Range<int> (runDescription->textPosition,\r
-                                                                   runDescription->textPosition + runDescription->stringLength),\r
-                                                       glyphRun->glyphCount);\r
+            TextLayout::Run* const glyphRunLayout = new TextLayout::Run (Range<int> (runDescription->textPosition,\r
+                                                                                     runDescription->textPosition + runDescription->stringLength),\r
+                                                                         glyphRun->glyphCount);\r
             glyphLine.runs.add (glyphRunLayout);\r
 \r
             glyphRun->fontFace->GetMetrics (&dwFontMetrics);\r
-            auto totalHeight = std::abs ((float) dwFontMetrics.ascent) + std::abs ((float) dwFontMetrics.descent);\r
-            auto fontHeightToEmSizeFactor = (float) dwFontMetrics.designUnitsPerEm / totalHeight;\r
+            const float totalHeight = std::abs ((float) dwFontMetrics.ascent) + std::abs ((float) dwFontMetrics.descent);\r
+            const float fontHeightToEmSizeFactor = (float) dwFontMetrics.designUnitsPerEm / totalHeight;\r
 \r
             glyphRunLayout->font = getFontForRun (*glyphRun, glyphRun->fontEmSize / fontHeightToEmSizeFactor);\r
             glyphRunLayout->colour = getColourOf (static_cast<ID2D1SolidColorBrush*> (clientDrawingEffect));\r
 \r
-            auto lineOrigin = layout->getLine (currentLine).lineOrigin;\r
-            auto x = baselineOriginX - lineOrigin.x;\r
+            const Point<float> lineOrigin (layout->getLine (currentLine).lineOrigin);\r
+            float x = baselineOriginX - lineOrigin.x;\r
 \r
-            auto extraKerning = glyphRunLayout->font.getExtraKerningFactor()\r
-                                   * glyphRunLayout->font.getHeight();\r
+            const float extraKerning = glyphRunLayout->font.getExtraKerningFactor()\r
+                                          * glyphRunLayout->font.getHeight();\r
 \r
             for (UINT32 i = 0; i < glyphRun->glyphCount; ++i)\r
             {\r
-                auto advance = glyphRun->glyphAdvances[i];\r
+                const float advance = glyphRun->glyphAdvances[i];\r
 \r
                 if ((glyphRun->bidiLevel & 1) != 0)\r
                     x -= advance + extraKerning;  // RTL text\r
@@ -154,8 +156,8 @@ namespace DirectWriteTypeLayout
     private:\r
         const AttributedString& attributedString;\r
         IDWriteFontCollection& fontCollection;\r
-        int currentLine = -1;\r
-        float lastOriginY = -10000.0f;\r
+        int currentLine;\r
+        float lastOriginY;\r
 \r
         static float scaledFontSize (int n, const DWRITE_FONT_METRICS& metrics, const DWRITE_GLYPH_RUN& glyphRun) noexcept\r
         {\r
@@ -175,15 +177,15 @@ namespace DirectWriteTypeLayout
         {\r
             for (int i = 0; i < attributedString.getNumAttributes(); ++i)\r
             {\r
-                auto& font = attributedString.getAttribute(i).font;\r
+                const Font& font = attributedString.getAttribute(i).font;\r
 \r
-                if (auto* wt = dynamic_cast<WindowsDirectWriteTypeface*> (font.getTypeface()))\r
+                if (WindowsDirectWriteTypeface* wt = dynamic_cast<WindowsDirectWriteTypeface*> (font.getTypeface()))\r
                     if (wt->getIDWriteFontFace() == glyphRun.fontFace)\r
                         return font.withHeight (fontHeight);\r
             }\r
 \r
             ComSmartPtr<IDWriteFont> dwFont;\r
-            auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
+            HRESULT hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
             jassert (dwFont != nullptr);\r
 \r
             ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
@@ -259,7 +261,7 @@ namespace DirectWriteTypeLayout
         range.length = jmin (attr.range.getLength(), textLen - attr.range.getStart());\r
 \r
         {\r
-            auto familyName = FontStyleHelpers::getConcreteFamilyName (attr.font);\r
+            const String familyName (FontStyleHelpers::getConcreteFamilyName (attr.font));\r
 \r
             BOOL fontFound = false;\r
             uint32 fontIndex;\r
@@ -269,7 +271,7 @@ namespace DirectWriteTypeLayout
                 fontIndex = 0;\r
 \r
             ComSmartPtr<IDWriteFontFamily> fontFamily;\r
-            auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
+            HRESULT hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
 \r
             ComSmartPtr<IDWriteFont> dwFont;\r
             uint32 fontFacesCount = 0;\r
@@ -288,12 +290,12 @@ namespace DirectWriteTypeLayout
             textLayout.SetFontStretch (dwFont->GetStretch(), range);\r
             textLayout.SetFontStyle (dwFont->GetStyle(), range);\r
 \r
-            auto fontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
+            const float fontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
             textLayout.SetFontSize (attr.font.getHeight() * fontHeightToEmSizeFactor, range);\r
         }\r
 \r
         {\r
-            auto col = attr.colour;\r
+            const Colour col (attr.colour);\r
             ComSmartPtr<ID2D1SolidColorBrush> d2dBrush;\r
             renderTarget.CreateSolidColorBrush (D2D1::ColorF (col.getFloatRed(),\r
                                                               col.getFloatGreen(),\r
@@ -306,7 +308,7 @@ namespace DirectWriteTypeLayout
         }\r
     }\r
 \r
-    bool setupLayout (const AttributedString& text, float maxWidth, float maxHeight,\r
+    bool setupLayout (const AttributedString& text, const float maxWidth, const float maxHeight,\r
                       ID2D1RenderTarget& renderTarget, IDWriteFactory& directWriteFactory,\r
                       IDWriteFontCollection& fontCollection, ComSmartPtr<IDWriteTextLayout>& textLayout)\r
     {\r
@@ -322,14 +324,14 @@ namespace DirectWriteTypeLayout
             fontIndex = 0;\r
 \r
         ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
-        auto hr = fontCollection.GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress());\r
+        HRESULT hr = fontCollection.GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress());\r
 \r
         ComSmartPtr<IDWriteFont> dwFont;\r
         hr = dwFontFamily->GetFirstMatchingFont (DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL,\r
                                                  dwFont.resetAndGetPointerAddress());\r
         jassert (dwFont != nullptr);\r
 \r
-        auto defaultFontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
+        const float defaultFontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
 \r
         ComSmartPtr<IDWriteTextFormat> dwTextFormat;\r
         hr = directWriteFactory.CreateTextFormat (defaultFont.getTypefaceName().toWideCharPointer(), &fontCollection,\r
@@ -346,7 +348,7 @@ namespace DirectWriteTypeLayout
             hr = dwTextFormat->SetTrimming (&trimming, trimmingSign);\r
         }\r
 \r
-        auto textLen = text.getText().length();\r
+        const int textLen = text.getText().length();\r
 \r
         hr = directWriteFactory.CreateTextLayout (text.getText().toWideCharPointer(), textLen, dwTextFormat,\r
                                                   maxWidth, maxHeight, textLayout.resetAndGetPointerAddress());\r
@@ -354,7 +356,7 @@ namespace DirectWriteTypeLayout
         if (FAILED (hr) || textLayout == nullptr)\r
             return false;\r
 \r
-        auto numAttributes = text.getNumAttributes();\r
+        const int numAttributes = text.getNumAttributes();\r
 \r
         for (int i = 0; i < numAttributes; ++i)\r
             addAttributedRange (text.getAttribute (i), *textLayout, textLen, renderTarget, fontCollection);\r
@@ -374,7 +376,7 @@ namespace DirectWriteTypeLayout
             return;\r
 \r
         UINT32 actualLineCount = 0;\r
-        auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
+        HRESULT hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
 \r
         layout.ensureStorageAllocated (actualLineCount);\r
 \r
@@ -386,13 +388,13 @@ namespace DirectWriteTypeLayout
         HeapBlock<DWRITE_LINE_METRICS> dwLineMetrics (actualLineCount);\r
         hr = dwTextLayout->GetLineMetrics (dwLineMetrics, actualLineCount, &actualLineCount);\r
         int lastLocation = 0;\r
-        auto numLines = jmin ((int) actualLineCount, layout.getNumLines());\r
+        const int numLines = jmin ((int) actualLineCount, layout.getNumLines());\r
         float yAdjustment = 0;\r
-        auto extraLineSpacing = text.getLineSpacing();\r
+        const float extraLineSpacing = text.getLineSpacing();\r
 \r
         for (int i = 0; i < numLines; ++i)\r
         {\r
-            auto& line = layout.getLine (i);\r
+            TextLayout::Line& line = layout.getLine (i);\r
             line.stringRange = Range<int> (lastLocation, (int) lastLocation + dwLineMetrics[i].length);\r
             line.lineOrigin.y += yAdjustment;\r
             yAdjustment += extraLineSpacing;\r
@@ -420,7 +422,7 @@ namespace DirectWriteTypeLayout
 \r
 static bool canAllTypefacesBeUsedInLayout (const AttributedString& text)\r
 {\r
-    auto numCharacterAttributes = text.getNumAttributes();\r
+    const int numCharacterAttributes = text.getNumAttributes();\r
 \r
     for (int i = 0; i < numCharacterAttributes; ++i)\r
         if (dynamic_cast<WindowsDirectWriteTypeface*> (text.getAttribute(i).font.getTypeface()) == nullptr)\r
index b4d53b44b3cc03bcf193061a5e7a7cf9742fbd93..2643d1a169bc14fc99581e4028e895b85407ff3b 100644 (file)
@@ -36,8 +36,7 @@ namespace
 \r
         uint32 index = 0;\r
         BOOL exists = false;\r
-        auto hr = names->FindLocaleName (L"en-us", &index, &exists);\r
-\r
+        HRESULT hr = names->FindLocaleName (L"en-us", &index, &exists);\r
         if (! exists)\r
             index = 0;\r
 \r
@@ -54,7 +53,7 @@ namespace
     {\r
         jassert (family != nullptr);\r
         ComSmartPtr<IDWriteLocalizedStrings> familyNames;\r
-        auto hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress());\r
+        HRESULT hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress());\r
         jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
         return getLocalisedName (familyNames);\r
     }\r
@@ -63,7 +62,7 @@ namespace
     {\r
         jassert (font != nullptr);\r
         ComSmartPtr<IDWriteLocalizedStrings> faceNames;\r
-        auto hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress());\r
+        HRESULT hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress());\r
         jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
         return getLocalisedName (faceNames);\r
     }\r
@@ -107,12 +106,12 @@ public:
 \r
             if (d2dFactory != nullptr)\r
             {\r
-                auto d2dRTProp = D2D1::RenderTargetProperties (D2D1_RENDER_TARGET_TYPE_SOFTWARE,\r
-                                                               D2D1::PixelFormat (DXGI_FORMAT_B8G8R8A8_UNORM,\r
-                                                                                  D2D1_ALPHA_MODE_IGNORE),\r
-                                                               0, 0,\r
-                                                               D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE,\r
-                                                               D2D1_FEATURE_LEVEL_DEFAULT);\r
+                D2D1_RENDER_TARGET_PROPERTIES d2dRTProp = D2D1::RenderTargetProperties (D2D1_RENDER_TARGET_TYPE_SOFTWARE,\r
+                                                                                        D2D1::PixelFormat (DXGI_FORMAT_B8G8R8A8_UNORM,\r
+                                                                                                           D2D1_ALPHA_MODE_IGNORE),\r
+                                                                                        0, 0,\r
+                                                                                        D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE,\r
+                                                                                        D2D1_FEATURE_LEVEL_DEFAULT);\r
 \r
                 d2dFactory->CreateDCRenderTarget (&d2dRTProp, directWriteRenderTarget.resetAndGetPointerAddress());\r
             }\r
@@ -143,14 +142,14 @@ class WindowsDirectWriteTypeface  : public Typeface
 {\r
 public:\r
     WindowsDirectWriteTypeface (const Font& font, IDWriteFontCollection* fontCollection)\r
-        : Typeface (font.getTypefaceName(), font.getTypefaceStyle())\r
+        : Typeface (font.getTypefaceName(), font.getTypefaceStyle()),\r
+          unitsToHeightScaleFactor (1.0f), heightToPointsFactor (1.0f), ascent (0.0f)\r
     {\r
         jassert (fontCollection != nullptr);\r
 \r
         BOOL fontFound = false;\r
         uint32 fontIndex = 0;\r
-        auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
-\r
+        HRESULT hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
         if (! fontFound)\r
             fontIndex = 0;\r
 \r
@@ -191,18 +190,18 @@ public:
             designUnitsPerEm = dwFontMetrics.designUnitsPerEm;\r
 \r
             ascent = std::abs ((float) dwFontMetrics.ascent);\r
-            auto totalSize = ascent + std::abs ((float) dwFontMetrics.descent);\r
+            const float totalSize = ascent + std::abs ((float) dwFontMetrics.descent);\r
             ascent /= totalSize;\r
             unitsToHeightScaleFactor = designUnitsPerEm / totalSize;\r
 \r
-            auto tempDC = GetDC (0);\r
-            auto dpi = (GetDeviceCaps (tempDC, LOGPIXELSX) + GetDeviceCaps (tempDC, LOGPIXELSY)) / 2.0f;\r
+            HDC tempDC = GetDC (0);\r
+            float dpi = (GetDeviceCaps (tempDC, LOGPIXELSX) + GetDeviceCaps (tempDC, LOGPIXELSY)) / 2.0f;\r
             heightToPointsFactor = (dpi / GetDeviceCaps (tempDC, LOGPIXELSY)) * unitsToHeightScaleFactor;\r
             ReleaseDC (0, tempDC);\r
 \r
-            auto pathAscent  = (1024.0f * dwFontMetrics.ascent)  / designUnitsPerEm;\r
-            auto pathDescent = (1024.0f * dwFontMetrics.descent) / designUnitsPerEm;\r
-            auto pathScale   = 1.0f / (std::abs (pathAscent) + std::abs (pathDescent));\r
+            const float pathAscent  = (1024.0f * dwFontMetrics.ascent)  / designUnitsPerEm;\r
+            const float pathDescent = (1024.0f * dwFontMetrics.descent) / designUnitsPerEm;\r
+            const float pathScale   = 1.0f / (std::abs (pathAscent) + std::abs (pathDescent));\r
             pathTransform = AffineTransform::scale (pathScale);\r
         }\r
     }\r
@@ -215,8 +214,8 @@ public:
 \r
     float getStringWidth (const String& text)\r
     {\r
-        auto textUTF32 = text.toUTF32();\r
-        auto len = textUTF32.length();\r
+        const CharPointer_UTF32 textUTF32 (text.toUTF32());\r
+        const size_t len = textUTF32.length();\r
 \r
         HeapBlock<UINT16> glyphIndices (len);\r
         dwFontFace->GetGlyphIndices (textUTF32, (UINT32) len, glyphIndices);\r
@@ -225,7 +224,6 @@ public:
         dwFontFace->GetDesignGlyphMetrics (glyphIndices, (UINT32) len, dwGlyphMetrics, false);\r
 \r
         float x = 0;\r
-\r
         for (size_t i = 0; i < len; ++i)\r
             x += (float) dwGlyphMetrics[i].advanceWidth / designUnitsPerEm;\r
 \r
@@ -236,8 +234,8 @@ public:
     {\r
         xOffsets.add (0);\r
 \r
-        auto textUTF32 = text.toUTF32();\r
-        auto len = textUTF32.length();\r
+        const CharPointer_UTF32 textUTF32 (text.toUTF32());\r
+        const size_t len = textUTF32.length();\r
 \r
         HeapBlock<UINT16> glyphIndices (len);\r
         dwFontFace->GetGlyphIndices (textUTF32, (UINT32) len, glyphIndices);\r
@@ -245,7 +243,6 @@ public:
         dwFontFace->GetDesignGlyphMetrics (glyphIndices, (UINT32) len, dwGlyphMetrics, false);\r
 \r
         float x = 0;\r
-\r
         for (size_t i = 0; i < len; ++i)\r
         {\r
             x += (float) dwGlyphMetrics[i].advanceWidth / designUnitsPerEm;\r
@@ -257,11 +254,10 @@ public:
     bool getOutlineForGlyph (int glyphNumber, Path& path)\r
     {\r
         jassert (path.isEmpty());  // we might need to apply a transform to the path, so this must be empty\r
-        auto glyphIndex = (UINT16) glyphNumber;\r
+        UINT16 glyphIndex = (UINT16) glyphNumber;\r
         ComSmartPtr<PathGeometrySink> pathGeometrySink (new PathGeometrySink());\r
 \r
-        dwFontFace->GetGlyphRunOutline (1024.0f, &glyphIndex, nullptr, nullptr,\r
-                                        1, false, false, pathGeometrySink);\r
+        dwFontFace->GetGlyphRunOutline (1024.0f, &glyphIndex, nullptr, nullptr, 1, false, false, pathGeometrySink);\r
         path = pathGeometrySink->path;\r
 \r
         if (! pathTransform.isIdentity())\r
@@ -277,8 +273,8 @@ public:
 private:\r
     SharedResourcePointer<Direct2DFactories> factories;\r
     ComSmartPtr<IDWriteFontFace> dwFontFace;\r
-    float unitsToHeightScaleFactor = 1.0f, heightToPointsFactor = 1.0f, ascent = 0;\r
-    int designUnitsPerEm = 0;\r
+    float unitsToHeightScaleFactor, heightToPointsFactor, ascent;\r
+    int designUnitsPerEm;\r
     AffineTransform pathTransform;\r
 \r
     struct PathGeometrySink  : public ComBaseClassHelper<IDWriteGeometrySink>\r
index a210824992c31c640134033782c144e8c2125ebd..a62151c3d5085f355add6191c91cc1e44537eca5 100644 (file)
@@ -63,14 +63,14 @@ namespace TTFNameExtractor
                                    const int64 directoryOffset, const int64 offsetOfStringStorage)\r
     {\r
         String result;\r
-        auto oldPos = input.getPosition();\r
+        const int64 oldPos = input.getPosition();\r
         input.setPosition (directoryOffset + offsetOfStringStorage + ByteOrder::swapIfLittleEndian (nameRecord.offsetFromStorageArea));\r
-        auto stringLength = (int) ByteOrder::swapIfLittleEndian (nameRecord.stringLength);\r
-        auto platformID = ByteOrder::swapIfLittleEndian (nameRecord.platformID);\r
+        const int stringLength = (int) ByteOrder::swapIfLittleEndian (nameRecord.stringLength);\r
+        const int platformID = ByteOrder::swapIfLittleEndian (nameRecord.platformID);\r
 \r
         if (platformID == 0 || platformID == 3)\r
         {\r
-            auto numChars = stringLength / 2 + 1;\r
+            const int numChars = stringLength / 2 + 1;\r
             HeapBlock<uint16> buffer;\r
             buffer.calloc (numChars + 1);\r
             input.read (buffer, stringLength);\r
@@ -165,8 +165,10 @@ namespace FontEnumerators
             const String fontName (lpelfe->elfLogFont.lfFaceName);\r
             fontName.copyToUTF16 (lf.lfFaceName, sizeof (lf.lfFaceName));\r
 \r
-            auto dc = CreateCompatibleDC (0);\r
-            EnumFontFamiliesEx (dc, &lf, (FONTENUMPROCW) &fontEnum2, lParam, 0);\r
+            HDC dc = CreateCompatibleDC (0);\r
+            EnumFontFamiliesEx (dc, &lf,\r
+                                (FONTENUMPROCW) &fontEnum2,\r
+                                lParam, 0);\r
             DeleteDC (dc);\r
         }\r
 \r
@@ -189,7 +191,7 @@ StringArray Font::findAllTypefaceNames()
 \r
         for (uint32 i = 0; i < fontFamilyCount; ++i)\r
         {\r
-            auto hr = factories->systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress());\r
+            HRESULT hr = factories->systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress());\r
 \r
             if (SUCCEEDED (hr))\r
                 results.addIfNotAlreadyThere (getFontFamilyName (fontFamily));\r
@@ -198,7 +200,7 @@ StringArray Font::findAllTypefaceNames()
     else\r
    #endif\r
     {\r
-        auto dc = CreateCompatibleDC (0);\r
+        HDC dc = CreateCompatibleDC (0);\r
 \r
         {\r
             LOGFONTW lf = { 0 };\r
@@ -235,8 +237,7 @@ StringArray Font::findAllTypefaceStyles (const String& family)
     {\r
         BOOL fontFound = false;\r
         uint32 fontIndex = 0;\r
-        auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
-\r
+        HRESULT hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
         if (! fontFound)\r
             fontIndex = 0;\r
 \r
@@ -301,7 +302,7 @@ Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font)
     static DefaultFontNames defaultNames;\r
 \r
     Font newFont (font);\r
-    auto& faceName = font.getTypefaceName();\r
+    const String& faceName = font.getTypefaceName();\r
 \r
     if (faceName == getDefaultSansSerifFontName())       newFont.setTypefaceName (defaultNames.defaultSans);\r
     else if (faceName == getDefaultSerifFontName())      newFont.setTypefaceName (defaultNames.defaultSerif);\r
@@ -317,14 +318,22 @@ Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font)
 class WindowsTypeface   : public Typeface\r
 {\r
 public:\r
-    WindowsTypeface (const Font& font)  : Typeface (font.getTypefaceName(),\r
-                                                    font.getTypefaceStyle())\r
+    WindowsTypeface (const Font& font)\r
+        : Typeface (font.getTypefaceName(), font.getTypefaceStyle()),\r
+          fontH (0), previousFontH (0),\r
+          dc (CreateCompatibleDC (0)), memoryFont (0),\r
+          ascent (1.0f), heightToPointsFactor (1.0f),\r
+          defaultGlyph (-1)\r
     {\r
         loadFont();\r
     }\r
 \r
     WindowsTypeface (const void* data, size_t dataSize)\r
-        : Typeface (String(), String())\r
+        : Typeface (String(), String()),\r
+          fontH (0), previousFontH (0),\r
+          dc (CreateCompatibleDC (0)), memoryFont (0),\r
+          ascent (1.0f), heightToPointsFactor (1.0f),\r
+          defaultGlyph (-1)\r
     {\r
         DWORD numInstalled = 0;\r
         memoryFont = AddFontMemResourceEx (const_cast<void*> (data), (DWORD) dataSize,\r
@@ -353,8 +362,8 @@ public:
 \r
     float getStringWidth (const String& text)\r
     {\r
-        auto utf16 = text.toUTF16();\r
-        auto numChars = utf16.length();\r
+        const CharPointer_UTF16 utf16 (text.toUTF16());\r
+        const size_t numChars = utf16.length();\r
         HeapBlock<uint16> results (numChars);\r
         float x = 0;\r
 \r
@@ -368,10 +377,10 @@ public:
         return x;\r
     }\r
 \r
-    void getGlyphPositions (const String& text, Array<int>& resultGlyphs, Array<float>& xOffsets)\r
+    void getGlyphPositions (const String& text, Array <int>& resultGlyphs, Array <float>& xOffsets)\r
     {\r
-        auto utf16 = text.toUTF16();\r
-        auto numChars = utf16.length();\r
+        const CharPointer_UTF16 utf16 (text.toUTF16());\r
+        const size_t numChars = utf16.length();\r
         HeapBlock<uint16> results (numChars);\r
         float x = 0;\r
 \r
@@ -399,8 +408,8 @@ public:
 \r
         GLYPHMETRICS gm;\r
         // (although GetGlyphOutline returns a DWORD, it may be -1 on failure, so treat it as signed int..)\r
-        auto bufSize = (int) GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX,\r
-                                              &gm, 0, 0, &identityMatrix);\r
+        const int bufSize = (int) GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX,\r
+                                                   &gm, 0, 0, &identityMatrix);\r
 \r
         if (bufSize > 0)\r
         {\r
@@ -408,18 +417,18 @@ public:
             GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX, &gm,\r
                              bufSize, data, &identityMatrix);\r
 \r
-            auto pheader = reinterpret_cast<const TTPOLYGONHEADER*> (data.getData());\r
+            const TTPOLYGONHEADER* pheader = reinterpret_cast<TTPOLYGONHEADER*> (data.getData());\r
 \r
-            auto scaleX = 1.0f / tm.tmHeight;\r
-            auto scaleY = -scaleX;\r
+            const float scaleX = 1.0f / tm.tmHeight;\r
+            const float scaleY = -scaleX;\r
 \r
             while ((char*) pheader < data + bufSize)\r
             {\r
                 glyphPath.startNewSubPath (scaleX * pheader->pfxStart.x.value,\r
                                            scaleY * pheader->pfxStart.y.value);\r
 \r
-                auto curve = (const TTPOLYCURVE*) ((const char*) pheader + sizeof (TTPOLYGONHEADER));\r
-                auto curveEnd = ((const char*) pheader) + pheader->cb;\r
+                const TTPOLYCURVE* curve = (const TTPOLYCURVE*) ((const char*) pheader + sizeof (TTPOLYGONHEADER));\r
+                const char* const curveEnd = ((const char*) pheader) + pheader->cb;\r
 \r
                 while ((const char*) curve < curveEnd)\r
                 {\r
@@ -433,10 +442,10 @@ public:
                     {\r
                         for (int i = 0; i < curve->cpfx - 1; ++i)\r
                         {\r
-                            auto x2 = scaleX * curve->apfx[i].x.value;\r
-                            auto y2 = scaleY * curve->apfx[i].y.value;\r
-                            auto x3 = scaleX * curve->apfx[i + 1].x.value;\r
-                            auto y3 = scaleY * curve->apfx[i + 1].y.value;\r
+                            const float x2 = scaleX * curve->apfx[i].x.value;\r
+                            const float y2 = scaleY * curve->apfx[i].y.value;\r
+                            float x3       = scaleX * curve->apfx[i + 1].x.value;\r
+                            float y3       = scaleY * curve->apfx[i + 1].y.value;\r
 \r
                             if (i < curve->cpfx - 2)\r
                             {\r
@@ -462,19 +471,32 @@ public:
 \r
 private:\r
     static const MAT2 identityMatrix;\r
-    HFONT fontH = {};\r
-    HGDIOBJ previousFontH = {};\r
-    HDC dc { CreateCompatibleDC (0) };\r
+    HFONT fontH;\r
+    HGDIOBJ previousFontH;\r
+    HDC dc;\r
     TEXTMETRIC tm;\r
-    HANDLE memoryFont = {};\r
-    float ascent = 1.0f, heightToPointsFactor = 1.0f;\r
-    int defaultGlyph = -1, heightInPoints = 0;\r
-    std::unordered_map<uint64, float> kerningPairs;\r
+    HANDLE memoryFont;\r
+    float ascent, heightToPointsFactor;\r
+    int defaultGlyph, heightInPoints;\r
 \r
-    static uint64 kerningPairIndex (int glyph1, int glyph2)\r
+    struct KerningPair\r
     {\r
-        return (((uint64) (uint32) glyph1) << 32) | (uint64) (uint32) glyph2;\r
-    }\r
+        int glyph1, glyph2;\r
+        float kerning;\r
+\r
+        bool operator== (const KerningPair& other) const noexcept\r
+        {\r
+            return glyph1 == other.glyph1 && glyph2 == other.glyph2;\r
+        }\r
+\r
+        bool operator< (const KerningPair& other) const noexcept\r
+        {\r
+            return glyph1 < other.glyph1\r
+                    || (glyph1 == other.glyph1 && glyph2 < other.glyph2);\r
+        }\r
+    };\r
+\r
+    SortedSet<KerningPair> kerningPairs;\r
 \r
     void loadFont()\r
     {\r
@@ -492,15 +514,15 @@ private:
         lf.lfHeight = -256;\r
         name.copyToUTF16 (lf.lfFaceName, sizeof (lf.lfFaceName));\r
 \r
-        auto standardSizedFont = CreateFontIndirect (&lf);\r
+        HFONT standardSizedFont = CreateFontIndirect (&lf);\r
 \r
         if (standardSizedFont != 0)\r
         {\r
             if ((previousFontH = SelectObject (dc, standardSizedFont)) != 0)\r
             {\r
                 fontH = standardSizedFont;\r
-                OUTLINETEXTMETRIC otm;\r
 \r
+                OUTLINETEXTMETRIC otm;\r
                 if (GetOutlineTextMetrics (dc, sizeof (otm), &otm) != 0)\r
                 {\r
                     heightInPoints = otm.otmEMSquare;\r
@@ -515,42 +537,41 @@ private:
 \r
         if (GetTextMetrics (dc, &tm))\r
         {\r
-            auto dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0f;\r
+            float dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0f;\r
             heightToPointsFactor = (dpi / GetDeviceCaps (dc, LOGPIXELSY)) * heightInPoints / (float) tm.tmHeight;\r
             ascent = tm.tmAscent / (float) tm.tmHeight;\r
-            std::unordered_map<int, int> glyphsForChars;\r
-            defaultGlyph = getGlyphForChar (dc, glyphsForChars, tm.tmDefaultChar);\r
-            createKerningPairs (dc, glyphsForChars, (float) tm.tmHeight);\r
+            defaultGlyph = getGlyphForChar (dc, tm.tmDefaultChar);\r
+            createKerningPairs (dc, (float) tm.tmHeight);\r
         }\r
     }\r
 \r
-    void createKerningPairs (HDC hdc, std::unordered_map<int, int>& glyphsForChars, float height)\r
+    void createKerningPairs (HDC hdc, const float height)\r
     {\r
         HeapBlock<KERNINGPAIR> rawKerning;\r
-        auto numKPs = GetKerningPairs (hdc, 0, 0);\r
+        const DWORD numKPs = GetKerningPairs (hdc, 0, 0);\r
         rawKerning.calloc (numKPs);\r
         GetKerningPairs (hdc, numKPs, rawKerning);\r
 \r
-        std::unordered_map<int, int> widthsForGlyphs;\r
+        kerningPairs.ensureStorageAllocated ((int) numKPs);\r
 \r
         for (DWORD i = 0; i < numKPs; ++i)\r
         {\r
-            auto glyph1 = getGlyphForChar (hdc, glyphsForChars, rawKerning[i].wFirst);\r
-            auto glyph2 = getGlyphForChar (hdc, glyphsForChars, rawKerning[i].wSecond);\r
-            auto standardWidth = getGlyphWidth (hdc, widthsForGlyphs, glyph1);\r
+            KerningPair kp;\r
+            kp.glyph1 = getGlyphForChar (hdc, rawKerning[i].wFirst);\r
+            kp.glyph2 = getGlyphForChar (hdc, rawKerning[i].wSecond);\r
 \r
-            kerningPairs[kerningPairIndex (glyph1, glyph2)] = (standardWidth + rawKerning[i].iKernAmount) / height;\r
-            kerningPairs[kerningPairIndex (glyph1, -1)]     = standardWidth / height;\r
+            const int standardWidth = getGlyphWidth (hdc, kp.glyph1);\r
+            kp.kerning = (standardWidth + rawKerning[i].iKernAmount) / height;\r
+            kerningPairs.add (kp);\r
+\r
+            kp.glyph2 = -1;  // add another entry for the standard width version..\r
+            kp.kerning = standardWidth / height;\r
+            kerningPairs.add (kp);\r
         }\r
     }\r
 \r
-    static int getGlyphForChar (HDC dc, std::unordered_map<int, int>& cache, juce_wchar character)\r
+    static int getGlyphForChar (HDC dc, juce_wchar character)\r
     {\r
-        auto existing = cache.find ((int) character);\r
-\r
-        if (existing != cache.end())\r
-            return existing->second;\r
-\r
         const WCHAR charToTest[] = { (WCHAR) character, 0 };\r
         WORD index = 0;\r
 \r
@@ -558,22 +579,9 @@ private:
               || index == 0xffff)\r
             return -1;\r
 \r
-        cache[(int) character] = index;\r
         return index;\r
     }\r
 \r
-    static int getGlyphWidth (HDC dc, std::unordered_map<int, int>& cache, int glyphNumber)\r
-    {\r
-        auto existing = cache.find (glyphNumber);\r
-\r
-        if (existing != cache.end())\r
-            return existing->second;\r
-\r
-        auto width = getGlyphWidth (dc, glyphNumber);\r
-        cache[glyphNumber] = width;\r
-        return width;\r
-    }\r
-\r
     static int getGlyphWidth (HDC dc, int glyphNumber)\r
     {\r
         GLYPHMETRICS gm;\r
@@ -582,21 +590,28 @@ private:
         return gm.gmCellIncX;\r
     }\r
 \r
-    float getKerning (HDC hdc, int glyph1, int glyph2)\r
+    float getKerning (HDC hdc, const int glyph1, const int glyph2)\r
     {\r
-        auto pair = kerningPairs.find (kerningPairIndex (glyph1, glyph2));\r
-\r
-        if (pair != kerningPairs.end())\r
-            return pair->second;\r
+        KerningPair kp;\r
+        kp.glyph1 = glyph1;\r
+        kp.glyph2 = glyph2;\r
+        int index = kerningPairs.indexOf (kp);\r
 \r
-        auto single = kerningPairs.find (kerningPairIndex (glyph1, -1));\r
+        if (index < 0)\r
+        {\r
+            kp.glyph2 = -1;\r
+            index = kerningPairs.indexOf (kp);\r
 \r
-        if (single != kerningPairs.end())\r
-            return single->second;\r
+            if (index < 0)\r
+            {\r
+                kp.glyph2 = -1;\r
+                kp.kerning = getGlyphWidth (hdc, kp.glyph1) / (float) tm.tmHeight;\r
+                kerningPairs.add (kp);\r
+                return kp.kerning;\r
+            }\r
+        }\r
 \r
-        auto width = getGlyphWidth (hdc, glyph1) / (float) tm.tmHeight;\r
-        kerningPairs[kerningPairIndex (glyph1, -1)] = width;\r
-        return width;\r
+        return kerningPairs.getReference (index).kerning;\r
     }\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowsTypeface)\r
index cd4a143d6ccf70ce0ad7671f85cbf2b678aae4a6..2da66ea4922649e4fef0272df0256566d4832edd 100644 (file)
@@ -46,10 +46,14 @@ public:
     Justification (int justificationFlags) noexcept   : flags (justificationFlags) {}\r
 \r
     /** Creates a copy of another Justification object. */\r
-    Justification (const Justification&) = default;\r
+    Justification (const Justification& other) noexcept   : flags (other.flags) {}\r
 \r
     /** Copies another Justification object. */\r
-    Justification& operator= (const Justification&) = default;\r
+    Justification& operator= (const Justification& other) noexcept\r
+    {\r
+        flags = other.flags;\r
+        return *this;\r
+    }\r
 \r
     bool operator== (const Justification& other) const noexcept     { return flags == other.flags; }\r
     bool operator!= (const Justification& other) const noexcept     { return flags != other.flags; }\r
index 05bcc8066a899370ca65d36d48a3cefb01902297..6f718c0948f42d5d93e02b9b64695e3876cc8176 100644 (file)
 namespace juce\r
 {\r
 \r
+RectanglePlacement::RectanglePlacement (const RectanglePlacement& other) noexcept\r
+    : flags (other.flags)\r
+{\r
+}\r
+\r
+RectanglePlacement& RectanglePlacement::operator= (const RectanglePlacement& other) noexcept\r
+{\r
+    flags = other.flags;\r
+    return *this;\r
+}\r
+\r
 bool RectanglePlacement::operator== (const RectanglePlacement& other) const noexcept\r
 {\r
     return flags == other.flags;\r
index 16ab8f303f0df44f74b0d66ae1ac2d84b9b9ad6d..b6803d20d87f38cb2d9ecbd2b0cf277f1ec8e5b1 100644 (file)
@@ -45,13 +45,13 @@ public:
     inline RectanglePlacement (int placementFlags) noexcept  : flags (placementFlags) {}\r
 \r
     /** Creates a default RectanglePlacement object, which is equivalent to using the 'centred' flag. */\r
-    inline RectanglePlacement() = default;\r
+    inline RectanglePlacement() noexcept                     : flags (centred) {}\r
 \r
     /** Creates a copy of another RectanglePlacement object. */\r
-    RectanglePlacement (const RectanglePlacement&) = default;\r
+    RectanglePlacement (const RectanglePlacement&) noexcept;\r
 \r
     /** Copies another RectanglePlacement object. */\r
-    RectanglePlacement& operator= (const RectanglePlacement&) = default;\r
+    RectanglePlacement& operator= (const RectanglePlacement&) noexcept;\r
 \r
     bool operator== (const RectanglePlacement&) const noexcept;\r
     bool operator!= (const RectanglePlacement&) const noexcept;\r
@@ -169,7 +169,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
-    int flags { centred };\r
+    int flags;\r
 };\r
 \r
 } // namespace juce\r
index cbf720368c5bc1aff6b70c9cfb68ccf496835796..a5abb5264b2c650b7d4dc5cce7faa78c47f13bdc 100644 (file)
@@ -36,14 +36,14 @@ ArrowButton::ArrowButton (const String& name, float arrowDirectionInRadians, Col
 \r
 ArrowButton::~ArrowButton() {}\r
 \r
-void ArrowButton::paintButton (Graphics& g, bool /*shouldDrawButtonAsHighlighted*/, bool shouldDrawButtonAsDown)\r
+void ArrowButton::paintButton (Graphics& g, bool /*isMouseOverButton*/, bool isButtonDown)\r
 {\r
     Path p (path);\r
 \r
-    const float offset = shouldDrawButtonAsDown ? 1.0f : 0.0f;\r
+    const float offset = isButtonDown ? 1.0f : 0.0f;\r
     p.applyTransform (path.getTransformToScaleToFit (offset, offset, getWidth() - 3.0f, getHeight() - 3.0f, false));\r
 \r
-    DropShadow (Colours::black.withAlpha (0.3f), shouldDrawButtonAsDown ? 2 : 4, Point<int>()).drawForPath (g, p);\r
+    DropShadow (Colours::black.withAlpha (0.3f), isButtonDown ? 2 : 4, Point<int>()).drawForPath (g, p);\r
 \r
     g.setColour (colour);\r
     g.fillPath (p);\r
index 9c60b93d97f8568c3fb4bfc2e3229efbfbbaef64..600f82459c8ab4b2c42659c10a1c02fefc273809 100644 (file)
@@ -54,7 +54,7 @@ public:
     ~ArrowButton();\r
 \r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
 private:\r
     Colour colour;\r
index e6eb39bd0fd61ce9c450d906ce7566bf724b3d01..edea4b7a02d6af75eeefa483399c79dc5caeff5d 100644 (file)
@@ -370,27 +370,23 @@ public:
         virtual ~LookAndFeelMethods() {}\r
 \r
         virtual void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
-                                           bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+                                           bool isMouseOverButton, bool isButtonDown) = 0;\r
 \r
         virtual Font getTextButtonFont (TextButton&, int buttonHeight) = 0;\r
         virtual int getTextButtonWidthToFitText (TextButton&, int buttonHeight) = 0;\r
 \r
         /** Draws the text for a TextButton. */\r
-        virtual void drawButtonText (Graphics&, TextButton&,\r
-                                     bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+        virtual void drawButtonText (Graphics&, TextButton&, bool isMouseOverButton, bool isButtonDown) = 0;\r
 \r
         /** Draws the contents of a standard ToggleButton. */\r
-        virtual void drawToggleButton (Graphics&, ToggleButton&,\r
-                                       bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+        virtual void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) = 0;\r
 \r
         virtual void changeToggleButtonWidthToFitText (ToggleButton&) = 0;\r
 \r
         virtual void drawTickBox (Graphics&, Component&, float x, float y, float w, float h,\r
-                                  bool ticked, bool isEnabled,\r
-                                  bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+                                  bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) = 0;\r
 \r
-        virtual void drawDrawableButton (Graphics&, DrawableButton&,\r
-                                         bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+        virtual void drawDrawableButton (Graphics&, DrawableButton&, bool isMouseOverButton, bool isButtonDown) = 0;\r
 \r
     private:\r
        #if JUCE_CATCH_DEPRECATED_CODE_MISUSE\r
@@ -428,13 +424,14 @@ protected:
         It's better to use this than the paint method, because it gives you information\r
         about the over/down state of the button.\r
 \r
-        @param g                                the graphics context to use\r
-        @param shouldDrawButtonAsHighlighted    true if the button is either in the 'over' or 'down' state\r
-        @param shouldDrawButtonAsDown           true if the button should be drawn in the 'down' position\r
+        @param g                    the graphics context to use\r
+        @param isMouseOverButton    true if the button is either in the 'over' or\r
+                                    'down' state\r
+        @param isButtonDown         true if the button should be drawn in the 'down' position\r
     */\r
     virtual void paintButton (Graphics& g,\r
-                              bool shouldDrawButtonAsHighlighted,\r
-                              bool shouldDrawButtonAsDown) = 0;\r
+                              bool isMouseOverButton,\r
+                              bool isButtonDown) = 0;\r
 \r
     /** Called when the button's up/down/over state changes.\r
 \r
@@ -485,6 +482,8 @@ private:
     ListenerList<Listener> buttonListeners;\r
 \r
     struct CallbackHelper;\r
+    friend struct CallbackHelper;\r
+    friend struct ContainerDeletePolicy<CallbackHelper>;\r
     std::unique_ptr<CallbackHelper> callbackHelper;\r
     uint32 buttonPressTime = 0, lastRepeatTime = 0;\r
     ApplicationCommandManager* commandManagerToUse = nullptr;\r
index b1bdf973a159b8705805c5fbf45ff3560cd4fe59..a429db48002093b2d6ed6e025609ec2901d5b2cd 100644 (file)
@@ -176,8 +176,8 @@ void DrawableButton::colourChanged()
 }\r
 \r
 void DrawableButton::paintButton (Graphics& g,\r
-                                  const bool shouldDrawButtonAsHighlighted,\r
-                                  const bool shouldDrawButtonAsDown)\r
+                                  const bool isMouseOverButton,\r
+                                  const bool isButtonDown)\r
 {\r
     auto& lf = getLookAndFeel();\r
 \r
@@ -185,9 +185,9 @@ void DrawableButton::paintButton (Graphics& g,
         lf.drawButtonBackground (g, *this,\r
                                  findColour (getToggleState() ? TextButton::buttonOnColourId\r
                                                               : TextButton::buttonColourId),\r
-                                 shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+                                 isMouseOverButton, isButtonDown);\r
     else\r
-        lf.drawDrawableButton (g, *this, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+        lf.drawDrawableButton (g, *this, isMouseOverButton, isButtonDown);\r
 }\r
 \r
 //==============================================================================\r
index cd614371d0c6d6564216142d1ec34f696d68a8aa..1cf9acbf882d95a96d105fc16ce964d8e1c6bf49 100644 (file)
@@ -169,7 +169,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
     /** @internal */\r
     void buttonStateChanged() override;\r
     /** @internal */\r
index 562bbb5fffcd4985b7a75e852a524e42b004780a..1cf6085b83f7103c718fbcf27414a120e7568e63 100644 (file)
@@ -104,13 +104,13 @@ void HyperlinkButton::clicked()
 }\r
 \r
 void HyperlinkButton::paintButton (Graphics& g,\r
-                                   bool shouldDrawButtonAsHighlighted,\r
-                                   bool shouldDrawButtonAsDown)\r
+                                   bool isMouseOverButton,\r
+                                   bool isButtonDown)\r
 {\r
     const Colour textColour (findColour (textColourId));\r
 \r
     if (isEnabled())\r
-        g.setColour ((shouldDrawButtonAsHighlighted) ? textColour.darker ((shouldDrawButtonAsDown) ? 1.3f : 0.4f)\r
+        g.setColour ((isMouseOverButton) ? textColour.darker ((isButtonDown) ? 1.3f : 0.4f)\r
                                          : textColour);\r
     else\r
         g.setColour (textColour.withMultipliedAlpha (0.4f));\r
index 3bc9ba552631d459809f76b4da64148ae8759eed..7ef418ad117847b67dd1746001c9316343eca539 100644 (file)
@@ -44,7 +44,7 @@ public:
 \r
         @param linkText     the text that will be displayed in the button - this is\r
                             also set as the Component's name, but the text can be\r
-                            changed later with the Button::setButtonText() method\r
+                            changed later with the Button::getButtonText() method\r
         @param linkURL      the URL to launch when the user clicks the button\r
     */\r
     HyperlinkButton (const String& linkText,\r
@@ -109,7 +109,7 @@ protected:
     /** @internal */\r
     void colourChanged() override;\r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOver, bool isButtonDown) override;\r
 \r
 private:\r
     //==============================================================================\r
index 46e47c4b4e499355d3beb51ec9b0e42bf70fa0af..e89f5736d53a380e16aad8c626654fcae8a176ce 100644 (file)
@@ -109,13 +109,13 @@ Image ImageButton::getDownImage() const
 }\r
 \r
 void ImageButton::paintButton (Graphics& g,\r
-                               bool shouldDrawButtonAsHighlighted,\r
-                               bool shouldDrawButtonAsDown)\r
+                               bool isMouseOverButton,\r
+                               bool isButtonDown)\r
 {\r
     if (! isEnabled())\r
     {\r
-        shouldDrawButtonAsHighlighted = false;\r
-        shouldDrawButtonAsDown = false;\r
+        isMouseOverButton = false;\r
+        isButtonDown = false;\r
     }\r
 \r
     Image im (getCurrentImage());\r
@@ -168,14 +168,14 @@ void ImageButton::paintButton (Graphics& g,
 \r
         imageBounds.setBounds (x, y, w, h);\r
 \r
-        const bool useDownImage = shouldDrawButtonAsDown || getToggleState();\r
+        const bool useDownImage = isButtonDown || getToggleState();\r
 \r
         getLookAndFeel().drawImageButton (g, &im, x, y, w, h,\r
                                           useDownImage ? downOverlay\r
-                                                       : (shouldDrawButtonAsHighlighted ? overOverlay\r
+                                                       : (isMouseOverButton ? overOverlay\r
                                                                             : normalOverlay),\r
                                           useDownImage ? downOpacity\r
-                                                       : (shouldDrawButtonAsHighlighted ? overOpacity\r
+                                                       : (isMouseOverButton ? overOpacity\r
                                                                             : normalOpacity),\r
                                           *this);\r
     }\r
index 95fc89cc7449fb8e9b539ce5cfaeac8f3b91d5b6..d7f90c5aa369c53c5722984ac40b809affd3c273 100644 (file)
@@ -143,7 +143,7 @@ protected:
     /** @internal */\r
     bool hitTest (int x, int y) override;\r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOver, bool isButtonDown) override;\r
 \r
 private:\r
     //==============================================================================\r
index 115d3d0ada453ea331b9879e5e8e1b433aa6e8d8..3e7f91a59de42431d0599cc021a259bd19c60d09 100644 (file)
@@ -82,7 +82,7 @@ void ShapeButton::setShape (const Path& newShape,
 \r
     if (resizeNowToFitThisShape)\r
     {\r
-        auto newBounds = shape.getBounds();\r
+        Rectangle<float> newBounds (shape.getBounds());\r
 \r
         if (hasShadow)\r
             newBounds = newBounds.expanded (4.0f);\r
@@ -97,22 +97,20 @@ void ShapeButton::setShape (const Path& newShape,
     repaint();\r
 }\r
 \r
-void ShapeButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void ShapeButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)\r
 {\r
     if (! isEnabled())\r
     {\r
-        shouldDrawButtonAsHighlighted = false;\r
-        shouldDrawButtonAsDown = false;\r
+        isMouseOverButton = false;\r
+        isButtonDown = false;\r
     }\r
 \r
-    auto r = border.subtractedFrom (getLocalBounds())\r
-                   .toFloat()\r
-                   .reduced (outlineWidth * 0.5f);\r
+    Rectangle<float> r (border.subtractedFrom (getLocalBounds()).toFloat().reduced (outlineWidth * 0.5f));\r
 \r
     if (getComponentEffect() != nullptr)\r
         r = r.reduced (2.0f);\r
 \r
-    if (shouldDrawButtonAsDown)\r
+    if (isButtonDown)\r
     {\r
         const float sizeReductionWhenPressed = 0.04f;\r
 \r
@@ -120,11 +118,11 @@ void ShapeButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted,
                        sizeReductionWhenPressed * r.getHeight());\r
     }\r
 \r
-    auto trans = shape.getTransformToScaleToFit (r, maintainShapeProportions);\r
+    const AffineTransform trans (shape.getTransformToScaleToFit (r, maintainShapeProportions));\r
 \r
-    if      (shouldDrawButtonAsDown)        g.setColour (getToggleState() && useOnColours ? downColourOn   : downColour);\r
-    else if (shouldDrawButtonAsHighlighted) g.setColour (getToggleState() && useOnColours ? overColourOn   : overColour);\r
-    else                                    g.setColour (getToggleState() && useOnColours ? normalColourOn : normalColour);\r
+    if      (isButtonDown)      g.setColour (getToggleState() && useOnColours ? downColourOn   : downColour);\r
+    else if (isMouseOverButton) g.setColour (getToggleState() && useOnColours ? overColourOn   : overColour);\r
+    else                        g.setColour (getToggleState() && useOnColours ? normalColourOn : normalColour);\r
 \r
     g.fillPath (shape, trans);\r
 \r
index 13a024743107f69e69b539a0ae018eb66d4f2326..052bf95927ceb2687461cab51563576f7347232e 100644 (file)
@@ -108,7 +108,7 @@ public:
     void setBorderSize (BorderSize<int> border);\r
 \r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
 private:\r
     //==============================================================================\r
index 79de98e8d823bf3c5f21d30e6398e4734a993ea4..d7d4fb46cd3abd9892de40f9b419b050fc35bba2 100644 (file)
@@ -44,15 +44,15 @@ TextButton::~TextButton()
 {\r
 }\r
 \r
-void TextButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void TextButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)\r
 {\r
-    auto& lf = getLookAndFeel();\r
+    LookAndFeel& lf = getLookAndFeel();\r
 \r
     lf.drawButtonBackground (g, *this,\r
                              findColour (getToggleState() ? buttonOnColourId : buttonColourId),\r
-                             shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+                             isMouseOverButton, isButtonDown);\r
 \r
-    lf.drawButtonText (g, *this, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+    lf.drawButtonText (g, *this, isMouseOverButton, isButtonDown);\r
 }\r
 \r
 void TextButton::colourChanged()\r
index 12186a8040d0f5896eab4ae313ba118771eca0af..27de41991579fd27996c0f1623b140674aa045ee 100644 (file)
@@ -99,7 +99,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
     /** @internal */\r
     void colourChanged() override;\r
 \r
index 35052031cbbd12d4a9e266557bedbfbae95c56d6..a43e45d1e793ab0b4df84b4576f6bd229767f51e 100644 (file)
@@ -43,9 +43,9 @@ ToggleButton::~ToggleButton()
 {\r
 }\r
 \r
-void ToggleButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void ToggleButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)\r
 {\r
-    getLookAndFeel().drawToggleButton (g, *this, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+    getLookAndFeel().drawToggleButton (g, *this, isMouseOverButton, isButtonDown);\r
 }\r
 \r
 void ToggleButton::changeWidthToFitText()\r
index b7c502e6f3f20a74fedd65239f6571c54c99a705..a1d6e2db5d4a46dd8b3a61e71a1552979cfa5f3b 100644 (file)
@@ -74,13 +74,13 @@ public:
     {\r
         textColourId            = 0x1006501,  /**< The colour to use for the button's text. */\r
         tickColourId            = 0x1006502,  /**< The colour to use for the tick mark. */\r
-        tickDisabledColourId    = 0x1006503   /**< The colour to use for the disabled tick mark and/or outline. */\r
+        tickDisabledColourId    = 0x1006503   /**< The colour to use for the disabled tick mark. */\r
     };\r
 \r
 protected:\r
     //==============================================================================\r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
     /** @internal */\r
     void colourChanged() override;\r
 \r
index 50674ea33705f03d0b17b227ea47c9037bc95c96..0723261782e061de83397fe9c70893d36ce5ff38 100644 (file)
@@ -185,7 +185,7 @@ bool ApplicationCommandManager::invoke (const ApplicationCommandTarget::Invocati
 {\r
     // This call isn't thread-safe for use from a non-UI thread without locking the message\r
     // manager first..\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
     bool ok = false;\r
     ApplicationCommandInfo commandInfo (0);\r
index c0daeb417ffd97a66270f0445fbb74fbb41b1a3d..501ec4dbbf5db2fc024b7aaf45bf91594f8570ab 100644 (file)
@@ -456,7 +456,7 @@ void Component::setName (const String& name)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
     if (componentName != name)\r
     {\r
@@ -482,7 +482,7 @@ void Component::setVisible (bool shouldBeVisible)
     {\r
         // if component methods are being called from threads other than the message\r
         // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+        ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
         const WeakReference<Component> safePointer (this);\r
         flags.visibleFlag = shouldBeVisible;\r
@@ -562,7 +562,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     if (isOpaque())\r
         styleWanted &= ~ComponentPeer::windowIsSemiTransparent;\r
@@ -663,7 +663,7 @@ void Component::removeFromDesktop()
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
     if (flags.hasHeavyweightPeerFlag)\r
     {\r
@@ -839,7 +839,7 @@ void Component::toFront (bool setAsForeground)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
     if (flags.hasHeavyweightPeerFlag)\r
     {\r
@@ -1009,7 +1009,7 @@ int Component::getParentHeight() const noexcept
 \r
 Rectangle<int> Component::getParentMonitorArea() const\r
 {\r
-    return Desktop::getInstance().getDisplays().findDisplayForRect (getScreenBounds()).userArea;\r
+    return Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre()).userArea;\r
 }\r
 \r
 int Component::getScreenX() const                       { return getScreenPosition().x; }\r
@@ -1030,7 +1030,7 @@ void Component::setBounds (int x, int y, int w, int h)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
     if (w < 0) w = 0;\r
     if (h < 0) h = 0;\r
@@ -1344,9 +1344,7 @@ void Component::addChildComponent (Component& child, int zOrder)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
-\r
-    jassert (this != &child); // adding a component to itself!?\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
     if (child.parentComponent != this)\r
     {\r
@@ -1422,7 +1420,7 @@ Component* Component::removeChildComponent (int index, bool sendParentEvents, bo
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
 \r
     auto* child = childComponentList [index];\r
 \r
@@ -1609,7 +1607,7 @@ void Component::enterModalState (bool shouldTakeKeyboardFocus,
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     if (! isCurrentlyModal (false))\r
     {\r
@@ -1786,7 +1784,7 @@ void Component::internalRepaintUnchecked (Rectangle<int> area, bool isEntireComp
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     if (flags.visibleFlag)\r
     {\r
@@ -2015,8 +2013,8 @@ void Component::setComponentEffect (ImageEffectFilter* newEffect)
 LookAndFeel& Component::getLookAndFeel() const noexcept\r
 {\r
     for (auto* c = this; c != nullptr; c = c->parentComponent)\r
-        if (auto lf = c->lookAndFeel.get())\r
-            return *lf;\r
+        if (c->lookAndFeel != nullptr)\r
+            return *(c->lookAndFeel);\r
 \r
     return LookAndFeel::getDefaultLookAndFeel();\r
 }\r
@@ -2166,12 +2164,10 @@ void Component::addComponentListener (ComponentListener* newListener)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-   #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS\r
+    #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS\r
     if (getParentComponent() != nullptr)\r
-    {\r
-        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-    }\r
-   #endif\r
+        ASSERT_MESSAGE_MANAGER_IS_LOCKED;\r
+    #endif\r
 \r
     componentListeners.add (newListener);\r
 }\r
@@ -2222,7 +2218,7 @@ void Component::addMouseListener (MouseListener* newListener,
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     // If you register a component as a mouselistener for itself, it'll receive all the events\r
     // twice - once via the direct callback that all components get anyway, and then again as a listener!\r
@@ -2238,7 +2234,7 @@ void Component::removeMouseListener (MouseListener* listenerToRemove)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     if (mouseListeners != nullptr)\r
         mouseListeners->removeListener (listenerToRemove);\r
@@ -2738,7 +2734,7 @@ void Component::grabKeyboardFocus()
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     grabFocusInternal (focusChangedDirectly, true);\r
 \r
@@ -2753,7 +2749,7 @@ void Component::moveKeyboardFocusToSibling (bool moveToNext)
 {\r
     // if component methods are being called from threads other than the message\r
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
 \r
     if (parentComponent != nullptr)\r
     {\r
index d711d94428973ecd0db7788fe95b814fa1eb5398..5265b94a78cd75fb22af1cc787e88ac0c9445dde 100644 (file)
@@ -2123,7 +2123,7 @@ public:
         and you can test whether it's null before using it to see if something has deleted\r
         it.\r
 \r
-        The ComponentType template parameter must be Component, or some subclass of Component.\r
+        The ComponentType typedef must be Component, or some subclass of Component.\r
 \r
         You may also want to use a WeakReference<Component> object for the same purpose.\r
     */\r
@@ -2280,6 +2280,8 @@ private:
     std::unique_ptr<CachedComponentImage> cachedImage;\r
 \r
     class MouseListenerList;\r
+    friend class MouseListenerList;\r
+    friend struct ContainerDeletePolicy<MouseListenerList>;\r
     std::unique_ptr<MouseListenerList> mouseListeners;\r
     std::unique_ptr<Array<KeyListener*>> keyListeners;\r
     ListenerList<ComponentListener> componentListeners;\r
diff --git a/modules/juce_gui_basics/components/juce_Desktop.cpp b/modules/juce_gui_basics/components/juce_Desktop.cpp
new file mode 100644 (file)
index 0000000..bfa3564
--- /dev/null
@@ -0,0 +1,423 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2017 - ROLI Ltd.\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+   27th April 2017).\r
+\r
+   End User License Agreement: www.juce.com/juce-5-licence\r
+   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+Desktop::Desktop()\r
+    : mouseSources (new MouseInputSource::SourceList()),\r
+      masterScaleFactor ((float) getDefaultMasterScale())\r
+{\r
+    displays.reset (new Displays (*this));\r
+}\r
+\r
+Desktop::~Desktop()\r
+{\r
+    setScreenSaverEnabled (true);\r
+    animator.cancelAllAnimations (false);\r
+\r
+    jassert (instance == this);\r
+    instance = nullptr;\r
+\r
+    // doh! If you don't delete all your windows before exiting, you're going to\r
+    // be leaking memory!\r
+    jassert (desktopComponents.size() == 0);\r
+}\r
+\r
+Desktop& JUCE_CALLTYPE Desktop::getInstance()\r
+{\r
+    if (instance == nullptr)\r
+        instance = new Desktop();\r
+\r
+    return *instance;\r
+}\r
+\r
+Desktop* Desktop::instance = nullptr;\r
+\r
+//==============================================================================\r
+int Desktop::getNumComponents() const noexcept\r
+{\r
+    return desktopComponents.size();\r
+}\r
+\r
+Component* Desktop::getComponent (int index) const noexcept\r
+{\r
+    return desktopComponents [index];\r
+}\r
+\r
+Component* Desktop::findComponentAt (Point<int> screenPosition) const\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
+    for (int i = desktopComponents.size(); --i >= 0;)\r
+    {\r
+        auto* c = desktopComponents.getUnchecked(i);\r
+\r
+        if (c->isVisible())\r
+        {\r
+            auto relative = c->getLocalPoint (nullptr, screenPosition);\r
+\r
+            if (c->contains (relative))\r
+                return c->getComponentAt (relative);\r
+        }\r
+    }\r
+\r
+    return nullptr;\r
+}\r
+\r
+//==============================================================================\r
+LookAndFeel& Desktop::getDefaultLookAndFeel() noexcept\r
+{\r
+    if (currentLookAndFeel == nullptr)\r
+    {\r
+        if (defaultLookAndFeel == nullptr)\r
+            defaultLookAndFeel.reset (new LookAndFeel_V4());\r
+\r
+        currentLookAndFeel = defaultLookAndFeel.get();\r
+    }\r
+\r
+    return *currentLookAndFeel;\r
+}\r
+\r
+void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel)\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    currentLookAndFeel = newDefaultLookAndFeel;\r
+\r
+    for (int i = getNumComponents(); --i >= 0;)\r
+        if (auto* c = getComponent (i))\r
+            c->sendLookAndFeelChange();\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::addDesktopComponent (Component* c)\r
+{\r
+    jassert (c != nullptr);\r
+    jassert (! desktopComponents.contains (c));\r
+    desktopComponents.addIfNotAlreadyThere (c);\r
+}\r
+\r
+void Desktop::removeDesktopComponent (Component* c)\r
+{\r
+    desktopComponents.removeFirstMatchingValue (c);\r
+}\r
+\r
+void Desktop::componentBroughtToFront (Component* c)\r
+{\r
+    auto index = desktopComponents.indexOf (c);\r
+    jassert (index >= 0);\r
+\r
+    if (index >= 0)\r
+    {\r
+        int newIndex = -1;\r
+\r
+        if (! c->isAlwaysOnTop())\r
+        {\r
+            newIndex = desktopComponents.size();\r
+\r
+            while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop())\r
+                --newIndex;\r
+\r
+            --newIndex;\r
+        }\r
+\r
+        desktopComponents.move (index, newIndex);\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+Point<int> Desktop::getMousePosition()\r
+{\r
+    return getMousePositionFloat().roundToInt();\r
+}\r
+\r
+Point<float> Desktop::getMousePositionFloat()\r
+{\r
+    return getInstance().getMainMouseSource().getScreenPosition();\r
+}\r
+\r
+void Desktop::setMousePosition (Point<int> newPosition)\r
+{\r
+    getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat());\r
+}\r
+\r
+Point<int> Desktop::getLastMouseDownPosition()\r
+{\r
+    return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt();\r
+}\r
+\r
+int Desktop::getMouseButtonClickCounter() const noexcept    { return mouseClickCounter; }\r
+int Desktop::getMouseWheelMoveCounter() const noexcept      { return mouseWheelCounter; }\r
+\r
+void Desktop::incrementMouseClickCounter() noexcept         { ++mouseClickCounter; }\r
+void Desktop::incrementMouseWheelCounter() noexcept         { ++mouseWheelCounter; }\r
+\r
+const Array<MouseInputSource>& Desktop::getMouseSources() const noexcept        { return mouseSources->sourceArray; }\r
+int Desktop::getNumMouseSources() const noexcept                                { return mouseSources->sources.size(); }\r
+int Desktop::getNumDraggingMouseSources() const noexcept                        { return mouseSources->getNumDraggingMouseSources(); }\r
+MouseInputSource* Desktop::getMouseSource (int index) const noexcept            { return mouseSources->getMouseSource (index); }\r
+MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept    { return mouseSources->getDraggingMouseSource (index); }\r
+MouseInputSource Desktop::getMainMouseSource() const noexcept                   { return MouseInputSource (mouseSources->sources.getUnchecked(0)); }\r
+void Desktop::beginDragAutoRepeat (int interval)                                { mouseSources->beginDragAutoRepeat (interval); }\r
+\r
+//==============================================================================\r
+void Desktop::addFocusChangeListener    (FocusChangeListener* l)   { focusListeners.add (l); }\r
+void Desktop::removeFocusChangeListener (FocusChangeListener* l)   { focusListeners.remove (l); }\r
+void Desktop::triggerFocusCallback()                               { triggerAsyncUpdate(); }\r
+\r
+void Desktop::handleAsyncUpdate()\r
+{\r
+    // The component may be deleted during this operation, but we'll use a SafePointer rather than a\r
+    // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer).\r
+    WeakReference<Component> currentFocus (Component::getCurrentlyFocusedComponent());\r
+    focusListeners.call ([&] (FocusChangeListener& l) { l.globalFocusChanged (currentFocus); });\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::resetTimer()\r
+{\r
+    if (mouseListeners.size() == 0)\r
+        stopTimer();\r
+    else\r
+        startTimer (100);\r
+\r
+    lastFakeMouseMove = getMousePositionFloat();\r
+}\r
+\r
+ListenerList<MouseListener>& Desktop::getMouseListeners()\r
+{\r
+    resetTimer();\r
+    return mouseListeners;\r
+}\r
+\r
+void Desktop::addGlobalMouseListener (MouseListener* listener)\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    mouseListeners.add (listener);\r
+    resetTimer();\r
+}\r
+\r
+void Desktop::removeGlobalMouseListener (MouseListener* listener)\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    mouseListeners.remove (listener);\r
+    resetTimer();\r
+}\r
+\r
+void Desktop::timerCallback()\r
+{\r
+    if (lastFakeMouseMove != getMousePositionFloat())\r
+        sendMouseMove();\r
+}\r
+\r
+void Desktop::sendMouseMove()\r
+{\r
+    if (! mouseListeners.isEmpty())\r
+    {\r
+        startTimer (20);\r
+\r
+        lastFakeMouseMove = getMousePositionFloat();\r
+\r
+        if (auto* target = findComponentAt (lastFakeMouseMove.roundToInt()))\r
+        {\r
+            Component::BailOutChecker checker (target);\r
+            auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);\r
+            auto now = Time::getCurrentTime();\r
+\r
+            const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
+                                 MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
+                                 MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+                                 target, target, now, pos, now, 0, false);\r
+\r
+            if (me.mods.isAnyMouseButtonDown())\r
+                mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });\r
+            else\r
+                mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });\r
+        }\r
+    }\r
+}\r
+\r
+\r
+//==============================================================================\r
+Desktop::Displays::Displays (Desktop& desktop)   { init (desktop); }\r
+Desktop::Displays::~Displays()  {}\r
+\r
+const Desktop::Displays::Display& Desktop::Displays::getMainDisplay() const noexcept\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    jassert (displays.getReference(0).isMain);\r
+    return displays.getReference(0);\r
+}\r
+\r
+const Desktop::Displays::Display& Desktop::Displays::getDisplayContaining (Point<int> position) const noexcept\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    auto* best = &displays.getReference(0);\r
+    double bestDistance = 1.0e10;\r
+\r
+    for (auto& d : displays)\r
+    {\r
+        if (d.totalArea.contains (position))\r
+        {\r
+            best = &d;\r
+            break;\r
+        }\r
+\r
+        auto distance = d.totalArea.getCentre().getDistanceFrom (position);\r
+\r
+        if (distance < bestDistance)\r
+        {\r
+            bestDistance = distance;\r
+            best = &d;\r
+        }\r
+    }\r
+\r
+    return *best;\r
+}\r
+\r
+RectangleList<int> Desktop::Displays::getRectangleList (bool userAreasOnly) const\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+    RectangleList<int> rl;\r
+\r
+    for (auto& d : displays)\r
+        rl.addWithoutMerging (userAreasOnly ? d.userArea : d.totalArea);\r
+\r
+    return rl;\r
+}\r
+\r
+Rectangle<int> Desktop::Displays::getTotalBounds (bool userAreasOnly) const\r
+{\r
+    return getRectangleList (userAreasOnly).getBounds();\r
+}\r
+\r
+bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept;\r
+bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept\r
+{\r
+    return d1.userArea == d2.userArea\r
+        && d1.totalArea == d2.totalArea\r
+        && d1.scale == d2.scale\r
+        && d1.isMain == d2.isMain;\r
+}\r
+\r
+bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept;\r
+bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept\r
+{\r
+    return ! (d1 == d2);\r
+}\r
+\r
+void Desktop::Displays::init (Desktop& desktop)\r
+{\r
+    findDisplays (desktop.getGlobalScaleFactor());\r
+}\r
+\r
+void Desktop::Displays::refresh()\r
+{\r
+    Array<Display> oldDisplays;\r
+    oldDisplays.swapWith (displays);\r
+\r
+    init (Desktop::getInstance());\r
+\r
+    if (oldDisplays != displays)\r
+    {\r
+        for (int i = ComponentPeer::getNumPeers(); --i >= 0;)\r
+            if (auto* peer = ComponentPeer::getPeer (i))\r
+                peer->handleScreenSizeChange();\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::setKioskModeComponent (Component* componentToUse, bool allowMenusAndBars)\r
+{\r
+    if (kioskModeReentrant)\r
+        return;\r
+\r
+    const ScopedValueSetter<bool> setter (kioskModeReentrant, true, false);\r
+\r
+    if (kioskModeComponent != componentToUse)\r
+    {\r
+        // agh! Don't delete or remove a component from the desktop while it's still the kiosk component!\r
+        jassert (kioskModeComponent == nullptr || ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
+\r
+        if (auto* oldKioskComp = kioskModeComponent)\r
+        {\r
+            kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one)\r
+            setKioskComponent (oldKioskComp, false, allowMenusAndBars);\r
+            oldKioskComp->setBounds (kioskComponentOriginalBounds);\r
+        }\r
+\r
+        kioskModeComponent = componentToUse;\r
+\r
+        if (kioskModeComponent != nullptr)\r
+        {\r
+            // Only components that are already on the desktop can be put into kiosk mode!\r
+            jassert (ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
+\r
+            kioskComponentOriginalBounds = kioskModeComponent->getBounds();\r
+            setKioskComponent (kioskModeComponent, true, allowMenusAndBars);\r
+        }\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::setOrientationsEnabled (int newOrientations)\r
+{\r
+    if (allowedOrientations != newOrientations)\r
+    {\r
+        // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation.\r
+        jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0);\r
+\r
+        allowedOrientations = newOrientations;\r
+        allowedOrientationsChanged();\r
+    }\r
+}\r
+\r
+int Desktop::getOrientationsEnabled() const noexcept\r
+{\r
+    return allowedOrientations;\r
+}\r
+\r
+bool Desktop::isOrientationEnabled (DisplayOrientation orientation) const noexcept\r
+{\r
+    // Make sure you only pass one valid flag in here...\r
+    jassert (orientation == upright || orientation == upsideDown\r
+              || orientation == rotatedClockwise || orientation == rotatedAntiClockwise);\r
+\r
+    return (allowedOrientations & orientation) != 0;\r
+}\r
+\r
+void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept\r
+{\r
+    ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
+    if (masterScaleFactor != newScaleFactor)\r
+    {\r
+        masterScaleFactor = newScaleFactor;\r
+        displays->refresh();\r
+    }\r
+}\r
+\r
+} // namespace juce\r
diff --git a/modules/juce_gui_basics/components/juce_Desktop.h b/modules/juce_gui_basics/components/juce_Desktop.h
new file mode 100644 (file)
index 0000000..e8a72f8
--- /dev/null
@@ -0,0 +1,479 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2017 - ROLI Ltd.\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+   27th April 2017).\r
+\r
+   End User License Agreement: www.juce.com/juce-5-licence\r
+   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+/**\r
+    Classes can implement this interface and register themselves with the Desktop class\r
+    to receive callbacks when the currently focused component changes.\r
+\r
+    @see Desktop::addFocusChangeListener, Desktop::removeFocusChangeListener\r
+\r
+    @tags{GUI}\r
+*/\r
+class JUCE_API  FocusChangeListener\r
+{\r
+public:\r
+    /** Destructor. */\r
+    virtual ~FocusChangeListener()  {}\r
+\r
+    /** Callback to indicate that the currently focused component has changed. */\r
+    virtual void globalFocusChanged (Component* focusedComponent) = 0;\r
+};\r
+\r
+\r
+//==============================================================================\r
+/**\r
+    Describes and controls aspects of the computer's desktop.\r
+\r
+\r
+    @tags{GUI}\r
+*/\r
+class JUCE_API  Desktop  : private DeletedAtShutdown,\r
+                           private Timer,\r
+                           private AsyncUpdater\r
+{\r
+public:\r
+    //==============================================================================\r
+    /** There's only one desktop object, and this method will return it. */\r
+    static Desktop& JUCE_CALLTYPE getInstance();\r
+\r
+    //==============================================================================\r
+    /** Returns the mouse position.\r
+\r
+        The coordinates are relative to the top-left of the main monitor.\r
+\r
+        Note that this is just a shortcut for calling getMainMouseSource().getScreenPosition(), and\r
+        you should only resort to grabbing the global mouse position if there's really no\r
+        way to get the coordinates via a mouse event callback instead.\r
+    */\r
+    static Point<int> getMousePosition();\r
+\r
+    /** Makes the mouse pointer jump to a given location.\r
+        The coordinates are relative to the top-left of the main monitor.\r
+        Note that this is a pretty old method, kept around mainly for backwards-compatibility,\r
+        and you should use the MouseInputSource class directly in new code.\r
+    */\r
+    static void setMousePosition (Point<int> newPosition);\r
+\r
+    /** Returns the last position at which a mouse button was pressed.\r
+\r
+        Note that this is just a shortcut for calling getMainMouseSource().getLastMouseDownPosition(),\r
+        and in a multi-touch environment, it doesn't make much sense. ALWAYS prefer to\r
+        get this information via other means, such as MouseEvent::getMouseDownScreenPosition()\r
+        if possible, and only ever call this as a last resort.\r
+    */\r
+    static Point<int> getLastMouseDownPosition();\r
+\r
+    /** Returns the number of times the mouse button has been clicked since the app started.\r
+        Each mouse-down event increments this number by 1.\r
+        @see getMouseWheelMoveCounter\r
+    */\r
+    int getMouseButtonClickCounter() const noexcept;\r
+\r
+    /** Returns the number of times the mouse wheel has been moved since the app started.\r
+        Each mouse-wheel event increments this number by 1.\r
+        @see getMouseButtonClickCounter\r
+    */\r
+    int getMouseWheelMoveCounter() const noexcept;\r
+\r
+    //==============================================================================\r
+    /** This lets you prevent the screensaver from becoming active.\r
+\r
+        Handy if you're running some sort of presentation app where having a screensaver\r
+        appear would be annoying.\r
+\r
+        Pass false to disable the screensaver, and true to re-enable it. (Note that this\r
+        won't enable a screensaver unless the user has actually set one up).\r
+\r
+        The disablement will only happen while the JUCE application is the foreground\r
+        process - if another task is running in front of it, then the screensaver will\r
+        be unaffected.\r
+\r
+        @see isScreenSaverEnabled\r
+    */\r
+    static void setScreenSaverEnabled (bool isEnabled);\r
+\r
+    /** Returns true if the screensaver has not been turned off.\r
+\r
+        This will return the last value passed into setScreenSaverEnabled(). Note that\r
+        it won't tell you whether the user is actually using a screen saver, just\r
+        whether this app is deliberately preventing one from running.\r
+\r
+        @see setScreenSaverEnabled\r
+    */\r
+    static bool isScreenSaverEnabled();\r
+\r
+    //==============================================================================\r
+    /** Registers a MouseListener that will receive all mouse events that occur on\r
+        any component.\r
+\r
+        @see removeGlobalMouseListener\r
+    */\r
+    void addGlobalMouseListener (MouseListener* listener);\r
+\r
+    /** Unregisters a MouseListener that was added with the addGlobalMouseListener()\r
+        method.\r
+\r
+        @see addGlobalMouseListener\r
+    */\r
+    void removeGlobalMouseListener (MouseListener* listener);\r
+\r
+    //==============================================================================\r
+    /** Registers a MouseListener that will receive a callback whenever the focused\r
+        component changes.\r
+    */\r
+    void addFocusChangeListener (FocusChangeListener* listener);\r
+\r
+    /** Unregisters a listener that was added with addFocusChangeListener(). */\r
+    void removeFocusChangeListener (FocusChangeListener* listener);\r
+\r
+    //==============================================================================\r
+    /** Takes a component and makes it full-screen, removing the taskbar, dock, etc.\r
+\r
+        The component must already be on the desktop for this method to work. It will\r
+        be resized to completely fill the screen and any extraneous taskbars, menu bars,\r
+        etc will be hidden.\r
+\r
+        To exit kiosk mode, just call setKioskModeComponent (nullptr). When this is called,\r
+        the component that's currently being used will be resized back to the size\r
+        and position it was in before being put into this mode.\r
+\r
+        If allowMenusAndBars is true, things like the menu and dock (on mac) are still\r
+        allowed to pop up when the mouse moves onto them. If this is false, it'll try\r
+        to hide as much on-screen paraphernalia as possible.\r
+    */\r
+    void setKioskModeComponent (Component* componentToUse,\r
+                                bool allowMenusAndBars = true);\r
+\r
+    /** Returns the component that is currently being used in kiosk-mode.\r
+\r
+        This is the component that was last set by setKioskModeComponent(). If none\r
+        has been set, this returns nullptr.\r
+    */\r
+    Component* getKioskModeComponent() const noexcept               { return kioskModeComponent; }\r
+\r
+    //==============================================================================\r
+    /** Returns the number of components that are currently active as top-level\r
+        desktop windows.\r
+\r
+        @see getComponent, Component::addToDesktop\r
+    */\r
+    int getNumComponents() const noexcept;\r
+\r
+    /** Returns one of the top-level desktop window components.\r
+\r
+        The index is from 0 to getNumComponents() - 1. This could return 0 if the\r
+        index is out-of-range.\r
+\r
+        @see getNumComponents, Component::addToDesktop\r
+    */\r
+    Component* getComponent (int index) const noexcept;\r
+\r
+    /** Finds the component at a given screen location.\r
+\r
+        This will drill down into top-level windows to find the child component at\r
+        the given position.\r
+\r
+        Returns nullptr if the coordinates are inside a non-JUCE window.\r
+    */\r
+    Component* findComponentAt (Point<int> screenPosition) const;\r
+\r
+    /** The Desktop object has a ComponentAnimator instance which can be used for performing\r
+        your animations.\r
+\r
+        Having a single shared ComponentAnimator object makes it more efficient when multiple\r
+        components are being moved around simultaneously. It's also more convenient than having\r
+        to manage your own instance of one.\r
+\r
+        @see ComponentAnimator\r
+    */\r
+    ComponentAnimator& getAnimator() noexcept                       { return animator; }\r
+\r
+    //==============================================================================\r
+    /** Returns the current default look-and-feel for components which don't have one\r
+        explicitly set.\r
+        @see setDefaultLookAndFeel\r
+    */\r
+    LookAndFeel& getDefaultLookAndFeel() noexcept;\r
+\r
+    /** Changes the default look-and-feel.\r
+        @param newDefaultLookAndFeel    the new look-and-feel object to use - if this is\r
+                                        set to nullptr, it will revert to using the system's\r
+                                        default one. The object passed-in must be deleted by the\r
+                                        caller when it's no longer needed.\r
+        @see getDefaultLookAndFeel\r
+    */\r
+    void setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel);\r
+\r
+    //==============================================================================\r
+    /** Provides access to the array of mouse sources, for iteration.\r
+        In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
+        multi-touch system, there could be one input source per potential finger. The number\r
+        of mouse sources returned here may increase dynamically as the program runs.\r
+        To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
+    */\r
+    const Array<MouseInputSource>& getMouseSources() const noexcept;\r
+\r
+    /** Returns the number of MouseInputSource objects the system has at its disposal.\r
+        In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
+        multi-touch system, there could be one input source per potential finger. The number\r
+        of mouse sources returned here may increase dynamically as the program runs.\r
+        To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
+        @see getMouseSource\r
+    */\r
+    int getNumMouseSources() const noexcept;\r
+\r
+    /** Returns one of the system's MouseInputSource objects.\r
+        The index should be from 0 to getNumMouseSources() - 1. Out-of-range indexes will return\r
+        a null pointer.\r
+        In a traditional single-mouse system, there might be only one object. On a multi-touch\r
+        system, there could be one input source per potential finger.\r
+    */\r
+    MouseInputSource* getMouseSource (int index) const noexcept;\r
+\r
+    /** Returns the main mouse input device that the system is using.\r
+        @see getNumMouseSources()\r
+    */\r
+    MouseInputSource getMainMouseSource() const noexcept;\r
+\r
+    /** Returns the number of mouse-sources that are currently being dragged.\r
+        In a traditional single-mouse system, this will be 0 or 1, depending on whether a\r
+        JUCE component has the button down on it. In a multi-touch system, this could\r
+        be any number from 0 to the number of simultaneous touches that can be detected.\r
+    */\r
+    int getNumDraggingMouseSources() const noexcept;\r
+\r
+    /** Returns one of the mouse sources that's currently being dragged.\r
+        The index should be between 0 and getNumDraggingMouseSources() - 1. If the index is\r
+        out of range, or if no mice or fingers are down, this will return a null pointer.\r
+    */\r
+    MouseInputSource* getDraggingMouseSource (int index) const noexcept;\r
+\r
+    /** Ensures that a non-stop stream of mouse-drag events will be sent during the\r
+        current mouse-drag operation.\r
+\r
+        This allows you to make sure that mouseDrag() events are sent continuously, even\r
+        when the mouse isn't moving. This can be useful for things like auto-scrolling\r
+        components when the mouse is near an edge.\r
+\r
+        Call this method during a mouseDown() or mouseDrag() callback, specifying the\r
+        minimum interval between consecutive mouse drag callbacks. The callbacks\r
+        will continue until the mouse is released, and then the interval will be reset,\r
+        so you need to make sure it's called every time you begin a drag event.\r
+        Passing an interval of 0 or less will cancel the auto-repeat.\r
+\r
+        @see mouseDrag\r
+    */\r
+    void beginDragAutoRepeat (int millisecondsBetweenCallbacks);\r
+\r
+    //==============================================================================\r
+    /** In a tablet/mobile device which can be turned around, this is used to indicate the orientation. */\r
+    enum DisplayOrientation\r
+    {\r
+        upright                 = 1,  /**< Indicates that the device is the normal way up. */\r
+        upsideDown              = 2,  /**< Indicates that the device is upside-down. */\r
+        rotatedClockwise        = 4,  /**< Indicates that the device is turned 90 degrees clockwise from its upright position. */\r
+        rotatedAntiClockwise    = 8,  /**< Indicates that the device is turned 90 degrees anti-clockwise from its upright position. */\r
+\r
+        allOrientations         = 1 + 2 + 4 + 8   /**< A combination of all the orientation values */\r
+    };\r
+\r
+    /** In a tablet device which can be turned around, this returns the current orientation. */\r
+    DisplayOrientation getCurrentOrientation() const;\r
+\r
+    /** Sets which orientations the display is allowed to auto-rotate to.\r
+\r
+        For devices that support rotating desktops, this lets you specify which of the orientations your app can use.\r
+\r
+        The parameter is a bitwise or-ed combination of the values in DisplayOrientation, and must contain at least one\r
+        set bit.\r
+    */\r
+    void setOrientationsEnabled (int allowedOrientations);\r
+\r
+    /** Returns the set of orientations the display is allowed to rotate to.\r
+        @see setOrientationsEnabled\r
+    */\r
+    int getOrientationsEnabled() const noexcept;\r
+\r
+    /** Returns whether the display is allowed to auto-rotate to the given orientation.\r
+        Each orientation can be enabled using setOrientationEnabled(). By default, all orientations are allowed.\r
+    */\r
+    bool isOrientationEnabled (DisplayOrientation orientation) const noexcept;\r
+\r
+    //==============================================================================\r
+    /** Manages details about connected display devices */\r
+    class JUCE_API  Displays\r
+    {\r
+    public:\r
+        /** Contains details about a display device. */\r
+        struct Display\r
+        {\r
+            /** This is the bounds of the area of this display which isn't covered by\r
+                OS-dependent objects like the taskbar, menu bar, etc. */\r
+            Rectangle<int> userArea;\r
+\r
+            /** This is the total physical area of this display, including any taskbars, etc */\r
+            Rectangle<int> totalArea;\r
+\r
+            /** This is the scale-factor of this display.\r
+                If you create a component with size 1x1, this scale factor indicates the actual\r
+                size of the component in terms of physical pixels.\r
+                For higher-resolution displays, it may be a value greater than 1.0\r
+            */\r
+            double scale;\r
+\r
+            /** The DPI of the display.\r
+                This is the number of physical pixels per inch. To get the number of logical\r
+                pixels per inch, divide this by the Display::scale value.\r
+            */\r
+            double dpi;\r
+\r
+            /** This will be true if this is the user's main screen. */\r
+            bool isMain;\r
+        };\r
+\r
+        /** Returns the display which acts as user's main screen. */\r
+        const Display& getMainDisplay() const noexcept;\r
+\r
+        /** Returns the display which contains a particular point.\r
+            If the point lies outside all the displays, the nearest one will be returned.\r
+        */\r
+        const Display& getDisplayContaining (Point<int> position) const noexcept;\r
+\r
+        /** Returns a RectangleList made up of all the displays. */\r
+        RectangleList<int> getRectangleList (bool userAreasOnly) const;\r
+\r
+        /** Returns the smallest bounding box which contains all the displays. */\r
+        Rectangle<int> getTotalBounds (bool userAreasOnly) const;\r
+\r
+        /** The list of displays. */\r
+        Array<Display> displays;\r
+\r
+       #ifndef DOXYGEN\r
+        /** @internal */\r
+        void refresh();\r
+        /** @internal */\r
+        ~Displays();\r
+       #endif\r
+\r
+    private:\r
+        friend class Desktop;\r
+        Displays (Desktop&);\r
+\r
+        void init (Desktop&);\r
+        void findDisplays (float masterScale);\r
+    };\r
+\r
+    const Displays& getDisplays() const noexcept        { return *displays; }\r
+\r
+    //==============================================================================\r
+    /** Sets a global scale factor to be used for all desktop windows.\r
+        Setting this will also scale the monitor sizes that are returned by getDisplays().\r
+    */\r
+    void setGlobalScaleFactor (float newScaleFactor) noexcept;\r
+\r
+    /** Returns the current global scale factor, as set by setGlobalScaleFactor().\r
+        @see setGlobalScaleFactor\r
+    */\r
+    float getGlobalScaleFactor() const noexcept         { return masterScaleFactor; }\r
+\r
+    //==============================================================================\r
+    /** True if the OS supports semitransparent windows */\r
+    static bool canUseSemiTransparentWindows() noexcept;\r
+\r
+   #if JUCE_MAC\r
+    /** OSX-specific function to check for the "dark" title-bar and menu mode. */\r
+    static bool isOSXDarkModeActive();\r
+   #endif\r
+\r
+private:\r
+    //==============================================================================\r
+    static Desktop* instance;\r
+\r
+    friend class Component;\r
+    friend class ComponentPeer;\r
+    friend class MouseInputSourceInternal;\r
+    friend class DeletedAtShutdown;\r
+    friend class TopLevelWindowManager;\r
+\r
+    std::unique_ptr<MouseInputSource::SourceList> mouseSources;\r
+\r
+    ListenerList<MouseListener> mouseListeners;\r
+    ListenerList<FocusChangeListener> focusListeners;\r
+\r
+    Array<Component*> desktopComponents;\r
+    Array<ComponentPeer*> peers;\r
+\r
+    std::unique_ptr<Displays> displays;\r
+\r
+    Point<float> lastFakeMouseMove;\r
+    void sendMouseMove();\r
+\r
+    int mouseClickCounter = 0, mouseWheelCounter = 0;\r
+    void incrementMouseClickCounter() noexcept;\r
+    void incrementMouseWheelCounter() noexcept;\r
+\r
+    std::unique_ptr<LookAndFeel> defaultLookAndFeel;\r
+    WeakReference<LookAndFeel> currentLookAndFeel;\r
+\r
+    Component* kioskModeComponent = nullptr;\r
+    Rectangle<int> kioskComponentOriginalBounds;\r
+    bool kioskModeReentrant = false;\r
+\r
+    int allowedOrientations = allOrientations;\r
+    void allowedOrientationsChanged();\r
+\r
+    float masterScaleFactor;\r
+\r
+    ComponentAnimator animator;\r
+\r
+    void timerCallback() override;\r
+    void resetTimer();\r
+    ListenerList<MouseListener>& getMouseListeners();\r
+\r
+    void addDesktopComponent (Component*);\r
+    void removeDesktopComponent (Component*);\r
+    void componentBroughtToFront (Component*);\r
+\r
+    void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);\r
+\r
+    void triggerFocusCallback();\r
+    void handleAsyncUpdate() override;\r
+\r
+    static Point<float> getMousePositionFloat();\r
+\r
+    static double getDefaultMasterScale();\r
+\r
+    Desktop();\r
+    ~Desktop();\r
+\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop)\r
+};\r
+\r
+} // namespace juce\r
index 94865c3b96ea5a5d064833151eecb177527f21bf..ce5e1ac71ea8f606afa7628f65e8a60763a0fcca 100644 (file)
@@ -254,7 +254,7 @@ bool ModalComponentManager::cancelAllModalComponents()
 int ModalComponentManager::runEventLoopForCurrentComponent()\r
 {\r
     // This can only be run from the message thread!\r
-    JUCE_ASSERT_MESSAGE_THREAD\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
     int returnValue = 0;\r
 \r
index 631bc803fad38fdecb5dd86f4219c72b865bc217..b0f9315ff9867685919b89d53d7c2e6c9cabc2c8 100644 (file)
@@ -141,9 +141,10 @@ protected:
 \r
 private:\r
     //==============================================================================\r
-    friend class Component;\r
-\r
     struct ModalItem;\r
+\r
+    friend class Component;\r
+    friend struct ContainerDeletePolicy<ModalItem>;\r
     OwnedArray<ModalItem> stack;\r
 \r
     void startModal (Component*, bool autoDelete);\r
@@ -160,7 +161,7 @@ private:
 \r
     @tags{GUI}\r
 */\r
-class JUCE_API ModalCallbackFunction\r
+class ModalCallbackFunction\r
 {\r
 public:\r
     /** This is a utility function to create a ModalComponentManager::Callback that will\r
diff --git a/modules/juce_gui_basics/desktop/juce_Desktop.cpp b/modules/juce_gui_basics/desktop/juce_Desktop.cpp
deleted file mode 100644 (file)
index 3cfb54e..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-Desktop::Desktop()\r
-    : mouseSources (new MouseInputSource::SourceList()),\r
-      masterScaleFactor ((float) getDefaultMasterScale())\r
-{\r
-    displays.reset (new Displays (*this));\r
-}\r
-\r
-Desktop::~Desktop()\r
-{\r
-    setScreenSaverEnabled (true);\r
-    animator.cancelAllAnimations (false);\r
-\r
-    jassert (instance == this);\r
-    instance = nullptr;\r
-\r
-    // doh! If you don't delete all your windows before exiting, you're going to\r
-    // be leaking memory!\r
-    jassert (desktopComponents.size() == 0);\r
-}\r
-\r
-Desktop& JUCE_CALLTYPE Desktop::getInstance()\r
-{\r
-    if (instance == nullptr)\r
-        instance = new Desktop();\r
-\r
-    return *instance;\r
-}\r
-\r
-Desktop* Desktop::instance = nullptr;\r
-\r
-//==============================================================================\r
-int Desktop::getNumComponents() const noexcept\r
-{\r
-    return desktopComponents.size();\r
-}\r
-\r
-Component* Desktop::getComponent (int index) const noexcept\r
-{\r
-    return desktopComponents [index];\r
-}\r
-\r
-Component* Desktop::findComponentAt (Point<int> screenPosition) const\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
-    for (int i = desktopComponents.size(); --i >= 0;)\r
-    {\r
-        auto* c = desktopComponents.getUnchecked(i);\r
-\r
-        if (c->isVisible())\r
-        {\r
-            auto relative = c->getLocalPoint (nullptr, screenPosition);\r
-\r
-            if (c->contains (relative))\r
-                return c->getComponentAt (relative);\r
-        }\r
-    }\r
-\r
-    return nullptr;\r
-}\r
-\r
-//==============================================================================\r
-LookAndFeel& Desktop::getDefaultLookAndFeel() noexcept\r
-{\r
-    if (auto lf = currentLookAndFeel.get())\r
-        return *lf;\r
-\r
-    if (defaultLookAndFeel == nullptr)\r
-        defaultLookAndFeel.reset (new LookAndFeel_V4());\r
-\r
-    auto lf = defaultLookAndFeel.get();\r
-    jassert (lf != nullptr);\r
-    currentLookAndFeel = lf;\r
-    return *lf;\r
-}\r
-\r
-void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel)\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-    currentLookAndFeel = newDefaultLookAndFeel;\r
-\r
-    for (int i = getNumComponents(); --i >= 0;)\r
-        if (auto* c = getComponent (i))\r
-            c->sendLookAndFeelChange();\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::addDesktopComponent (Component* c)\r
-{\r
-    jassert (c != nullptr);\r
-    jassert (! desktopComponents.contains (c));\r
-    desktopComponents.addIfNotAlreadyThere (c);\r
-}\r
-\r
-void Desktop::removeDesktopComponent (Component* c)\r
-{\r
-    desktopComponents.removeFirstMatchingValue (c);\r
-}\r
-\r
-void Desktop::componentBroughtToFront (Component* c)\r
-{\r
-    auto index = desktopComponents.indexOf (c);\r
-    jassert (index >= 0);\r
-\r
-    if (index >= 0)\r
-    {\r
-        int newIndex = -1;\r
-\r
-        if (! c->isAlwaysOnTop())\r
-        {\r
-            newIndex = desktopComponents.size();\r
-\r
-            while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop())\r
-                --newIndex;\r
-\r
-            --newIndex;\r
-        }\r
-\r
-        desktopComponents.move (index, newIndex);\r
-    }\r
-}\r
-\r
-//==============================================================================\r
-Point<int> Desktop::getMousePosition()\r
-{\r
-    return getMousePositionFloat().roundToInt();\r
-}\r
-\r
-Point<float> Desktop::getMousePositionFloat()\r
-{\r
-    return getInstance().getMainMouseSource().getScreenPosition();\r
-}\r
-\r
-void Desktop::setMousePosition (Point<int> newPosition)\r
-{\r
-    getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat());\r
-}\r
-\r
-Point<int> Desktop::getLastMouseDownPosition()\r
-{\r
-    return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt();\r
-}\r
-\r
-int Desktop::getMouseButtonClickCounter() const noexcept    { return mouseClickCounter; }\r
-int Desktop::getMouseWheelMoveCounter() const noexcept      { return mouseWheelCounter; }\r
-\r
-void Desktop::incrementMouseClickCounter() noexcept         { ++mouseClickCounter; }\r
-void Desktop::incrementMouseWheelCounter() noexcept         { ++mouseWheelCounter; }\r
-\r
-const Array<MouseInputSource>& Desktop::getMouseSources() const noexcept        { return mouseSources->sourceArray; }\r
-int Desktop::getNumMouseSources() const noexcept                                { return mouseSources->sources.size(); }\r
-int Desktop::getNumDraggingMouseSources() const noexcept                        { return mouseSources->getNumDraggingMouseSources(); }\r
-MouseInputSource* Desktop::getMouseSource (int index) const noexcept            { return mouseSources->getMouseSource (index); }\r
-MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept    { return mouseSources->getDraggingMouseSource (index); }\r
-MouseInputSource Desktop::getMainMouseSource() const noexcept                   { return MouseInputSource (mouseSources->sources.getUnchecked(0)); }\r
-void Desktop::beginDragAutoRepeat (int interval)                                { mouseSources->beginDragAutoRepeat (interval); }\r
-\r
-//==============================================================================\r
-void Desktop::addFocusChangeListener    (FocusChangeListener* l)   { focusListeners.add (l); }\r
-void Desktop::removeFocusChangeListener (FocusChangeListener* l)   { focusListeners.remove (l); }\r
-void Desktop::triggerFocusCallback()                               { triggerAsyncUpdate(); }\r
-\r
-void Desktop::handleAsyncUpdate()\r
-{\r
-    // The component may be deleted during this operation, but we'll use a SafePointer rather than a\r
-    // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer).\r
-    WeakReference<Component> currentFocus (Component::getCurrentlyFocusedComponent());\r
-    focusListeners.call ([&] (FocusChangeListener& l) { l.globalFocusChanged (currentFocus.get()); });\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::resetTimer()\r
-{\r
-    if (mouseListeners.size() == 0)\r
-        stopTimer();\r
-    else\r
-        startTimer (100);\r
-\r
-    lastFakeMouseMove = getMousePositionFloat();\r
-}\r
-\r
-ListenerList<MouseListener>& Desktop::getMouseListeners()\r
-{\r
-    resetTimer();\r
-    return mouseListeners;\r
-}\r
-\r
-void Desktop::addGlobalMouseListener (MouseListener* listener)\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-    mouseListeners.add (listener);\r
-    resetTimer();\r
-}\r
-\r
-void Desktop::removeGlobalMouseListener (MouseListener* listener)\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-    mouseListeners.remove (listener);\r
-    resetTimer();\r
-}\r
-\r
-void Desktop::timerCallback()\r
-{\r
-    if (lastFakeMouseMove != getMousePositionFloat())\r
-        sendMouseMove();\r
-}\r
-\r
-void Desktop::sendMouseMove()\r
-{\r
-    if (! mouseListeners.isEmpty())\r
-    {\r
-        startTimer (20);\r
-\r
-        lastFakeMouseMove = getMousePositionFloat();\r
-\r
-        if (auto* target = findComponentAt (lastFakeMouseMove.roundToInt()))\r
-        {\r
-            Component::BailOutChecker checker (target);\r
-            auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);\r
-            auto now = Time::getCurrentTime();\r
-\r
-            const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
-                                 MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
-                                 MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
-                                 target, target, now, pos, now, 0, false);\r
-\r
-            if (me.mods.isAnyMouseButtonDown())\r
-                mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });\r
-            else\r
-                mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });\r
-        }\r
-    }\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::setKioskModeComponent (Component* componentToUse, bool allowMenusAndBars)\r
-{\r
-    if (kioskModeReentrant)\r
-        return;\r
-\r
-    const ScopedValueSetter<bool> setter (kioskModeReentrant, true, false);\r
-\r
-    if (kioskModeComponent != componentToUse)\r
-    {\r
-        // agh! Don't delete or remove a component from the desktop while it's still the kiosk component!\r
-        jassert (kioskModeComponent == nullptr || ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
-\r
-        if (auto* oldKioskComp = kioskModeComponent)\r
-        {\r
-            kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one)\r
-            setKioskComponent (oldKioskComp, false, allowMenusAndBars);\r
-            oldKioskComp->setBounds (kioskComponentOriginalBounds);\r
-        }\r
-\r
-        kioskModeComponent = componentToUse;\r
-\r
-        if (kioskModeComponent != nullptr)\r
-        {\r
-            // Only components that are already on the desktop can be put into kiosk mode!\r
-            jassert (ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
-\r
-            kioskComponentOriginalBounds = kioskModeComponent->getBounds();\r
-            setKioskComponent (kioskModeComponent, true, allowMenusAndBars);\r
-        }\r
-    }\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::setOrientationsEnabled (int newOrientations)\r
-{\r
-    if (allowedOrientations != newOrientations)\r
-    {\r
-        // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation.\r
-        jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0);\r
-\r
-        allowedOrientations = newOrientations;\r
-        allowedOrientationsChanged();\r
-    }\r
-}\r
-\r
-int Desktop::getOrientationsEnabled() const noexcept\r
-{\r
-    return allowedOrientations;\r
-}\r
-\r
-bool Desktop::isOrientationEnabled (DisplayOrientation orientation) const noexcept\r
-{\r
-    // Make sure you only pass one valid flag in here...\r
-    jassert (orientation == upright || orientation == upsideDown\r
-              || orientation == rotatedClockwise || orientation == rotatedAntiClockwise);\r
-\r
-    return (allowedOrientations & orientation) != 0;\r
-}\r
-\r
-void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
-    if (masterScaleFactor != newScaleFactor)\r
-    {\r
-        masterScaleFactor = newScaleFactor;\r
-        displays->refresh();\r
-    }\r
-}\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_gui_basics/desktop/juce_Desktop.h b/modules/juce_gui_basics/desktop/juce_Desktop.h
deleted file mode 100644 (file)
index 1b66a67..0000000
+++ /dev/null
@@ -1,416 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
-    Classes can implement this interface and register themselves with the Desktop class\r
-    to receive callbacks when the currently focused component changes.\r
-\r
-    @see Desktop::addFocusChangeListener, Desktop::removeFocusChangeListener\r
-\r
-    @tags{GUI}\r
-*/\r
-class JUCE_API  FocusChangeListener\r
-{\r
-public:\r
-    /** Destructor. */\r
-    virtual ~FocusChangeListener()  {}\r
-\r
-    /** Callback to indicate that the currently focused component has changed. */\r
-    virtual void globalFocusChanged (Component* focusedComponent) = 0;\r
-};\r
-\r
-\r
-//==============================================================================\r
-/**\r
-    Describes and controls aspects of the computer's desktop.\r
-\r
-    @tags{GUI}\r
-*/\r
-class JUCE_API  Desktop  : private DeletedAtShutdown,\r
-                           private Timer,\r
-                           private AsyncUpdater\r
-{\r
-public:\r
-    //==============================================================================\r
-    /** There's only one desktop object, and this method will return it. */\r
-    static Desktop& JUCE_CALLTYPE getInstance();\r
-\r
-    //==============================================================================\r
-    /** Returns the mouse position.\r
-\r
-        The coordinates are relative to the top-left of the main monitor.\r
-\r
-        Note that this is just a shortcut for calling getMainMouseSource().getScreenPosition(), and\r
-        you should only resort to grabbing the global mouse position if there's really no\r
-        way to get the coordinates via a mouse event callback instead.\r
-    */\r
-    static Point<int> getMousePosition();\r
-\r
-    /** Makes the mouse pointer jump to a given location.\r
-        The coordinates are relative to the top-left of the main monitor.\r
-        Note that this is a pretty old method, kept around mainly for backwards-compatibility,\r
-        and you should use the MouseInputSource class directly in new code.\r
-    */\r
-    static void setMousePosition (Point<int> newPosition);\r
-\r
-    /** Returns the last position at which a mouse button was pressed.\r
-\r
-        Note that this is just a shortcut for calling getMainMouseSource().getLastMouseDownPosition(),\r
-        and in a multi-touch environment, it doesn't make much sense. ALWAYS prefer to\r
-        get this information via other means, such as MouseEvent::getMouseDownScreenPosition()\r
-        if possible, and only ever call this as a last resort.\r
-    */\r
-    static Point<int> getLastMouseDownPosition();\r
-\r
-    /** Returns the number of times the mouse button has been clicked since the app started.\r
-        Each mouse-down event increments this number by 1.\r
-        @see getMouseWheelMoveCounter\r
-    */\r
-    int getMouseButtonClickCounter() const noexcept;\r
-\r
-    /** Returns the number of times the mouse wheel has been moved since the app started.\r
-        Each mouse-wheel event increments this number by 1.\r
-        @see getMouseButtonClickCounter\r
-    */\r
-    int getMouseWheelMoveCounter() const noexcept;\r
-\r
-    //==============================================================================\r
-    /** This lets you prevent the screensaver from becoming active.\r
-\r
-        Handy if you're running some sort of presentation app where having a screensaver\r
-        appear would be annoying.\r
-\r
-        Pass false to disable the screensaver, and true to re-enable it. (Note that this\r
-        won't enable a screensaver unless the user has actually set one up).\r
-\r
-        The disablement will only happen while the JUCE application is the foreground\r
-        process - if another task is running in front of it, then the screensaver will\r
-        be unaffected.\r
-\r
-        @see isScreenSaverEnabled\r
-    */\r
-    static void setScreenSaverEnabled (bool isEnabled);\r
-\r
-    /** Returns true if the screensaver has not been turned off.\r
-\r
-        This will return the last value passed into setScreenSaverEnabled(). Note that\r
-        it won't tell you whether the user is actually using a screen saver, just\r
-        whether this app is deliberately preventing one from running.\r
-\r
-        @see setScreenSaverEnabled\r
-    */\r
-    static bool isScreenSaverEnabled();\r
-\r
-    //==============================================================================\r
-    /** Registers a MouseListener that will receive all mouse events that occur on\r
-        any component.\r
-\r
-        @see removeGlobalMouseListener\r
-    */\r
-    void addGlobalMouseListener (MouseListener* listener);\r
-\r
-    /** Unregisters a MouseListener that was added with the addGlobalMouseListener()\r
-        method.\r
-\r
-        @see addGlobalMouseListener\r
-    */\r
-    void removeGlobalMouseListener (MouseListener* listener);\r
-\r
-    //==============================================================================\r
-    /** Registers a MouseListener that will receive a callback whenever the focused\r
-        component changes.\r
-    */\r
-    void addFocusChangeListener (FocusChangeListener* listener);\r
-\r
-    /** Unregisters a listener that was added with addFocusChangeListener(). */\r
-    void removeFocusChangeListener (FocusChangeListener* listener);\r
-\r
-    //==============================================================================\r
-    /** Takes a component and makes it full-screen, removing the taskbar, dock, etc.\r
-\r
-        The component must already be on the desktop for this method to work. It will\r
-        be resized to completely fill the screen and any extraneous taskbars, menu bars,\r
-        etc will be hidden.\r
-\r
-        To exit kiosk mode, just call setKioskModeComponent (nullptr). When this is called,\r
-        the component that's currently being used will be resized back to the size\r
-        and position it was in before being put into this mode.\r
-\r
-        If allowMenusAndBars is true, things like the menu and dock (on mac) are still\r
-        allowed to pop up when the mouse moves onto them. If this is false, it'll try\r
-        to hide as much on-screen paraphernalia as possible.\r
-    */\r
-    void setKioskModeComponent (Component* componentToUse,\r
-                                bool allowMenusAndBars = true);\r
-\r
-    /** Returns the component that is currently being used in kiosk-mode.\r
-\r
-        This is the component that was last set by setKioskModeComponent(). If none\r
-        has been set, this returns nullptr.\r
-    */\r
-    Component* getKioskModeComponent() const noexcept               { return kioskModeComponent; }\r
-\r
-    //==============================================================================\r
-    /** Returns the number of components that are currently active as top-level\r
-        desktop windows.\r
-\r
-        @see getComponent, Component::addToDesktop\r
-    */\r
-    int getNumComponents() const noexcept;\r
-\r
-    /** Returns one of the top-level desktop window components.\r
-\r
-        The index is from 0 to getNumComponents() - 1. This could return 0 if the\r
-        index is out-of-range.\r
-\r
-        @see getNumComponents, Component::addToDesktop\r
-    */\r
-    Component* getComponent (int index) const noexcept;\r
-\r
-    /** Finds the component at a given screen location.\r
-\r
-        This will drill down into top-level windows to find the child component at\r
-        the given position.\r
-\r
-        Returns nullptr if the coordinates are inside a non-JUCE window.\r
-    */\r
-    Component* findComponentAt (Point<int> screenPosition) const;\r
-\r
-    /** The Desktop object has a ComponentAnimator instance which can be used for performing\r
-        your animations.\r
-\r
-        Having a single shared ComponentAnimator object makes it more efficient when multiple\r
-        components are being moved around simultaneously. It's also more convenient than having\r
-        to manage your own instance of one.\r
-\r
-        @see ComponentAnimator\r
-    */\r
-    ComponentAnimator& getAnimator() noexcept                       { return animator; }\r
-\r
-    //==============================================================================\r
-    /** Returns the current default look-and-feel for components which don't have one\r
-        explicitly set.\r
-        @see setDefaultLookAndFeel\r
-    */\r
-    LookAndFeel& getDefaultLookAndFeel() noexcept;\r
-\r
-    /** Changes the default look-and-feel.\r
-        @param newDefaultLookAndFeel    the new look-and-feel object to use - if this is\r
-                                        set to nullptr, it will revert to using the system's\r
-                                        default one. The object passed-in must be deleted by the\r
-                                        caller when it's no longer needed.\r
-        @see getDefaultLookAndFeel\r
-    */\r
-    void setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel);\r
-\r
-    //==============================================================================\r
-    /** Provides access to the array of mouse sources, for iteration.\r
-        In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
-        multi-touch system, there could be one input source per potential finger. The number\r
-        of mouse sources returned here may increase dynamically as the program runs.\r
-        To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
-    */\r
-    const Array<MouseInputSource>& getMouseSources() const noexcept;\r
-\r
-    /** Returns the number of MouseInputSource objects the system has at its disposal.\r
-        In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
-        multi-touch system, there could be one input source per potential finger. The number\r
-        of mouse sources returned here may increase dynamically as the program runs.\r
-        To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
-        @see getMouseSource\r
-    */\r
-    int getNumMouseSources() const noexcept;\r
-\r
-    /** Returns one of the system's MouseInputSource objects.\r
-        The index should be from 0 to getNumMouseSources() - 1. Out-of-range indexes will return\r
-        a null pointer.\r
-        In a traditional single-mouse system, there might be only one object. On a multi-touch\r
-        system, there could be one input source per potential finger.\r
-    */\r
-    MouseInputSource* getMouseSource (int index) const noexcept;\r
-\r
-    /** Returns the main mouse input device that the system is using.\r
-        @see getNumMouseSources()\r
-    */\r
-    MouseInputSource getMainMouseSource() const noexcept;\r
-\r
-    /** Returns the number of mouse-sources that are currently being dragged.\r
-        In a traditional single-mouse system, this will be 0 or 1, depending on whether a\r
-        JUCE component has the button down on it. In a multi-touch system, this could\r
-        be any number from 0 to the number of simultaneous touches that can be detected.\r
-    */\r
-    int getNumDraggingMouseSources() const noexcept;\r
-\r
-    /** Returns one of the mouse sources that's currently being dragged.\r
-        The index should be between 0 and getNumDraggingMouseSources() - 1. If the index is\r
-        out of range, or if no mice or fingers are down, this will return a null pointer.\r
-    */\r
-    MouseInputSource* getDraggingMouseSource (int index) const noexcept;\r
-\r
-    /** Ensures that a non-stop stream of mouse-drag events will be sent during the\r
-        current mouse-drag operation.\r
-\r
-        This allows you to make sure that mouseDrag() events are sent continuously, even\r
-        when the mouse isn't moving. This can be useful for things like auto-scrolling\r
-        components when the mouse is near an edge.\r
-\r
-        Call this method during a mouseDown() or mouseDrag() callback, specifying the\r
-        minimum interval between consecutive mouse drag callbacks. The callbacks\r
-        will continue until the mouse is released, and then the interval will be reset,\r
-        so you need to make sure it's called every time you begin a drag event.\r
-        Passing an interval of 0 or less will cancel the auto-repeat.\r
-\r
-        @see mouseDrag\r
-    */\r
-    void beginDragAutoRepeat (int millisecondsBetweenCallbacks);\r
-\r
-    //==============================================================================\r
-    /** In a tablet/mobile device which can be turned around, this is used to indicate the orientation. */\r
-    enum DisplayOrientation\r
-    {\r
-        upright                 = 1,  /**< Indicates that the device is the normal way up. */\r
-        upsideDown              = 2,  /**< Indicates that the device is upside-down. */\r
-        rotatedClockwise        = 4,  /**< Indicates that the device is turned 90 degrees clockwise from its upright position. */\r
-        rotatedAntiClockwise    = 8,  /**< Indicates that the device is turned 90 degrees anti-clockwise from its upright position. */\r
-\r
-        allOrientations         = 1 + 2 + 4 + 8   /**< A combination of all the orientation values */\r
-    };\r
-\r
-    /** In a tablet device which can be turned around, this returns the current orientation. */\r
-    DisplayOrientation getCurrentOrientation() const;\r
-\r
-    /** Sets which orientations the display is allowed to auto-rotate to.\r
-\r
-        For devices that support rotating desktops, this lets you specify which of the orientations your app can use.\r
-\r
-        The parameter is a bitwise or-ed combination of the values in DisplayOrientation, and must contain at least one\r
-        set bit.\r
-    */\r
-    void setOrientationsEnabled (int allowedOrientations);\r
-\r
-    /** Returns the set of orientations the display is allowed to rotate to.\r
-        @see setOrientationsEnabled\r
-    */\r
-    int getOrientationsEnabled() const noexcept;\r
-\r
-    /** Returns whether the display is allowed to auto-rotate to the given orientation.\r
-        Each orientation can be enabled using setOrientationEnabled(). By default, all orientations are allowed.\r
-    */\r
-    bool isOrientationEnabled (DisplayOrientation orientation) const noexcept;\r
-\r
-    //==============================================================================\r
-    const Displays& getDisplays() const noexcept        { return *displays; }\r
-\r
-    //==============================================================================\r
-    /** Sets a global scale factor to be used for all desktop windows.\r
-        Setting this will also scale the monitor sizes that are returned by getDisplays().\r
-    */\r
-    void setGlobalScaleFactor (float newScaleFactor) noexcept;\r
-\r
-    /** Returns the current global scale factor, as set by setGlobalScaleFactor().\r
-        @see setGlobalScaleFactor\r
-    */\r
-    float getGlobalScaleFactor() const noexcept         { return masterScaleFactor; }\r
-\r
-    //==============================================================================\r
-    /** True if the OS supports semitransparent windows */\r
-    static bool canUseSemiTransparentWindows() noexcept;\r
-\r
-   #if JUCE_MAC\r
-    /** OSX-specific function to check for the "dark" title-bar and menu mode. */\r
-    static bool isOSXDarkModeActive();\r
-   #endif\r
-\r
-private:\r
-    //==============================================================================\r
-    static Desktop* instance;\r
-\r
-    friend class Component;\r
-    friend class ComponentPeer;\r
-    friend class MouseInputSourceInternal;\r
-    friend class DeletedAtShutdown;\r
-    friend class TopLevelWindowManager;\r
-    friend class Displays;\r
-\r
-    std::unique_ptr<MouseInputSource::SourceList> mouseSources;\r
-\r
-    ListenerList<MouseListener> mouseListeners;\r
-    ListenerList<FocusChangeListener> focusListeners;\r
-\r
-    Array<Component*> desktopComponents;\r
-    Array<ComponentPeer*> peers;\r
-\r
-    std::unique_ptr<Displays> displays;\r
-\r
-    Point<float> lastFakeMouseMove;\r
-    void sendMouseMove();\r
-\r
-    int mouseClickCounter = 0, mouseWheelCounter = 0;\r
-    void incrementMouseClickCounter() noexcept;\r
-    void incrementMouseWheelCounter() noexcept;\r
-\r
-    std::unique_ptr<LookAndFeel> defaultLookAndFeel;\r
-    WeakReference<LookAndFeel> currentLookAndFeel;\r
-\r
-    Component* kioskModeComponent = nullptr;\r
-    Rectangle<int> kioskComponentOriginalBounds;\r
-    bool kioskModeReentrant = false;\r
-\r
-    int allowedOrientations = allOrientations;\r
-    void allowedOrientationsChanged();\r
-\r
-    float masterScaleFactor;\r
-\r
-    ComponentAnimator animator;\r
-\r
-    void timerCallback() override;\r
-    void resetTimer();\r
-    ListenerList<MouseListener>& getMouseListeners();\r
-\r
-    void addDesktopComponent (Component*);\r
-    void removeDesktopComponent (Component*);\r
-    void componentBroughtToFront (Component*);\r
-\r
-    void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);\r
-\r
-    void triggerFocusCallback();\r
-    void handleAsyncUpdate() override;\r
-\r
-    static Point<float> getMousePositionFloat();\r
-\r
-    static double getDefaultMasterScale();\r
-\r
-    Desktop();\r
-    ~Desktop();\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop)\r
-};\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_gui_basics/desktop/juce_Displays.cpp b/modules/juce_gui_basics/desktop/juce_Displays.cpp
deleted file mode 100644 (file)
index 7ef4a32..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-Displays::Displays (Desktop& desktop)\r
-{\r
-    init (desktop);\r
-}\r
-\r
-void Displays::init (Desktop& desktop)\r
-{\r
-    findDisplays (desktop.getGlobalScaleFactor());\r
-}\r
-\r
-const Displays::Display& Displays::findDisplayForRect (Rectangle<int> rect, bool isPhysical) const noexcept\r
-{\r
-    int maxArea = -1;\r
-    Display* retVal = nullptr;\r
-\r
-    for (auto& display : displays)\r
-    {\r
-        auto displayArea = display.totalArea;\r
-\r
-        if (isPhysical)\r
-            displayArea = (displayArea.withZeroOrigin() * display.scale) + display.topLeftPhysical;\r
-\r
-        displayArea = displayArea.getIntersection (rect);\r
-        auto area = displayArea.getWidth() * displayArea.getHeight();\r
-\r
-        if (area >= maxArea)\r
-        {\r
-            maxArea = area;\r
-            retVal = &display;\r
-        }\r
-    }\r
-\r
-    return *retVal;\r
-}\r
-\r
-const Displays::Display& Displays::findDisplayForPoint (Point<int> point, bool isPhysical) const noexcept\r
-{\r
-    auto minDistance = std::numeric_limits<int>::max();\r
-    Display* retVal = nullptr;\r
-\r
-    for (auto& display : displays)\r
-    {\r
-        auto displayArea = display.totalArea;\r
-\r
-        if (isPhysical)\r
-            displayArea = (displayArea.withZeroOrigin() * display.scale) + display.topLeftPhysical;\r
-\r
-        if (displayArea.contains (point))\r
-            return display;\r
-\r
-        auto distance = displayArea.getCentre().getDistanceFrom (point);\r
-        if (distance <= minDistance)\r
-        {\r
-            minDistance = distance;\r
-            retVal = &display;\r
-        }\r
-    }\r
-\r
-    return *retVal;\r
-}\r
-\r
-Rectangle<int> Displays::physicalToLogical (Rectangle<int> rect, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
-    auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
-                                                       : findDisplayForRect (rect, true);\r
-\r
-    auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
-    return ((rect.toFloat() - display.topLeftPhysical.toFloat()) / (display.scale / globalScale)).toNearestInt() + (display.totalArea.getTopLeft() * globalScale);\r
-}\r
-\r
-Rectangle<int> Displays::logicalToPhysical (Rectangle<int> rect, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
-    auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
-                                                       : findDisplayForRect (rect, false);\r
-\r
-    auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
-    return ((rect.toFloat() - (display.totalArea.getTopLeft().toFloat() * globalScale)) * (display.scale / globalScale)).toNearestInt() + display.topLeftPhysical;\r
-}\r
-\r
-template <typename ValueType>\r
-Point<ValueType> Displays::physicalToLogical (Point<ValueType> point, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
-    auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
-                                                       : findDisplayForPoint (point.roundToInt(), true);\r
-\r
-    auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
-    Point<ValueType> logicalTopLeft  (display.totalArea.getX(),       display.totalArea.getY());\r
-    Point<ValueType> physicalTopLeft (display.topLeftPhysical.getX(), display.topLeftPhysical.getY());\r
-\r
-    return ((point - physicalTopLeft) / (display.scale / globalScale)) + (logicalTopLeft * globalScale);\r
-}\r
-\r
-template <typename ValueType>\r
-Point<ValueType> Displays::logicalToPhysical (Point<ValueType> point, const Display* useScaleFactorOfDisplay)  const noexcept\r
-{\r
-    auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
-                                                       : findDisplayForPoint (point.roundToInt(), false);\r
-\r
-    auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
-    Point<ValueType> logicalTopLeft  (display.totalArea.getX(),       display.totalArea.getY());\r
-    Point<ValueType> physicalTopLeft (display.topLeftPhysical.getX(), display.topLeftPhysical.getY());\r
-\r
-    return ((point - (logicalTopLeft * globalScale)) * (display.scale / globalScale)) + physicalTopLeft;\r
-}\r
-\r
-const Displays::Display& Displays::getMainDisplay() const noexcept\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
-    for (auto& d : displays)\r
-        if (d.isMain)\r
-            return d;\r
-\r
-    // no main display!\r
-    jassertfalse;\r
-    return displays.getReference (0);\r
-}\r
-\r
-RectangleList<int> Displays::getRectangleList (bool userAreasOnly) const\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-    RectangleList<int> rl;\r
-\r
-    for (auto& d : displays)\r
-        rl.addWithoutMerging (userAreasOnly ? d.userArea : d.totalArea);\r
-\r
-    return rl;\r
-}\r
-\r
-Rectangle<int> Displays::getTotalBounds (bool userAreasOnly) const\r
-{\r
-    return getRectangleList (userAreasOnly).getBounds();\r
-}\r
-\r
-void Displays::refresh()\r
-{\r
-    Array<Display> oldDisplays;\r
-    oldDisplays.swapWith (displays);\r
-\r
-    init (Desktop::getInstance());\r
-\r
-    if (oldDisplays != displays)\r
-    {\r
-        for (auto i = ComponentPeer::getNumPeers(); --i >= 0;)\r
-            if (auto* peer = ComponentPeer::getPeer (i))\r
-                peer->handleScreenSizeChange();\r
-    }\r
-}\r
-\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept\r
-{\r
-    return d1.isMain          == d2.isMain\r
-        && d1.totalArea       == d2.totalArea\r
-        && d1.userArea        == d2.userArea\r
-        && d1.topLeftPhysical == d2.topLeftPhysical\r
-        && d1.scale           == d2.scale\r
-        && d1.dpi             == d2.dpi;\r
-}\r
-\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept    { return ! (d1 == d2); }\r
-\r
-// Deprecated method\r
-const Displays::Display& Displays::getDisplayContaining (Point<int> position) const noexcept\r
-{\r
-    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-    auto* best = &displays.getReference (0);\r
-    auto bestDistance = std::numeric_limits<int>::max();\r
-\r
-    for (auto& d : displays)\r
-    {\r
-        if (d.totalArea.contains (position))\r
-        {\r
-            best = &d;\r
-            break;\r
-        }\r
-\r
-        auto distance = d.totalArea.getCentre().getDistanceFrom (position);\r
-\r
-        if (distance < bestDistance)\r
-        {\r
-            bestDistance = distance;\r
-            best = &d;\r
-        }\r
-    }\r
-\r
-    return *best;\r
-}\r
-\r
-//==============================================================================\r
-// These methods are used for converting the totalArea and userArea Rectangles in Display from physical to logical\r
-// pixels. We do this by constructing a graph of connected displays where the root node has position (0, 0); this can be\r
-// safely converted to logical pixels using its scale factor and we can then traverse the graph and work out the logical pixels\r
-// for all the other connected displays. We need to do this as the logical bounds of a display depend not only on its scale\r
-// factor but also the scale factor of the displays connected to it.\r
-\r
-/**\r
-    Represents a node in our graph of displays.\r
-*/\r
-struct DisplayNode\r
-{\r
-    /** The Display object that this represents. */\r
-    Displays::Display* display;\r
-\r
-    /** True if this represents the 'root' display with position (0, 0). */\r
-    bool isRoot = false;\r
-\r
-    /** The parent node of this node in our display graph. This will have a correct logicalArea. */\r
-    DisplayNode* parent = nullptr;\r
-\r
-    /** The logical area to be calculated. This will be valid after processDisplay() has\r
-        been called on this node.\r
-    */\r
-    Rectangle<double> logicalArea;\r
-};\r
-\r
-/** Recursive - will calculate and set the logicalArea member of current. */\r
-static void processDisplay (DisplayNode* currentNode, const Array<DisplayNode>& allNodes)\r
-{\r
-    const auto physicalArea = currentNode->display->totalArea.toDouble();\r
-    const auto scale = currentNode->display->scale;\r
-\r
-    if (! currentNode->isRoot)\r
-    {\r
-        const auto logicalWidth  = physicalArea.getWidth() / scale;\r
-        const auto logicalHeight = physicalArea.getHeight() / scale;\r
-\r
-        const auto physicalParentArea = currentNode->parent->display->totalArea.toDouble();\r
-        const auto logicalParentArea  = currentNode->parent->logicalArea; // logical area of parent has already been calculated\r
-        const auto parentScale        = currentNode->parent->display->scale;\r
-\r
-        Rectangle<double> logicalArea (0.0, 0.0, logicalWidth, logicalHeight);\r
-\r
-        if      (physicalArea.getRight() == physicalParentArea.getX())     logicalArea.setPosition ({ logicalParentArea.getX() - logicalWidth, physicalArea.getY() / parentScale });  // on left\r
-        else if (physicalArea.getX() == physicalParentArea.getRight())     logicalArea.setPosition ({ logicalParentArea.getRight(),  physicalArea.getY() / parentScale });            // on right\r
-        else if (physicalArea.getBottom() == physicalParentArea.getY())    logicalArea.setPosition ({ physicalArea.getX() / parentScale, logicalParentArea.getY() - logicalHeight }); // on top\r
-        else if (physicalArea.getY() == physicalParentArea.getBottom())    logicalArea.setPosition ({ physicalArea.getX() / parentScale, logicalParentArea.getBottom() });            // on bottom\r
-        else                                                               jassertfalse;\r
-\r
-        currentNode->logicalArea = logicalArea;\r
-    }\r
-    else\r
-    {\r
-        // If currentNode is the root (position (0, 0)) then we can just scale the physical area\r
-        currentNode->logicalArea = physicalArea / scale;\r
-        currentNode->parent = currentNode;\r
-    }\r
-\r
-    // Find child nodes\r
-    Array<DisplayNode*> children;\r
-    for (auto& node : allNodes)\r
-    {\r
-        // Already calculated\r
-        if (node.parent != nullptr)\r
-            continue;\r
-\r
-        const auto otherPhysicalArea = node.display->totalArea.toDouble();\r
-\r
-        // If the displays are touching on any side\r
-        if (otherPhysicalArea.getX() == physicalArea.getRight()  || otherPhysicalArea.getRight() == physicalArea.getX()\r
-            || otherPhysicalArea.getY() == physicalArea.getBottom() || otherPhysicalArea.getBottom() == physicalArea.getY())\r
-        {\r
-            node.parent = currentNode;\r
-            children.add (&node);\r
-        }\r
-    }\r
-\r
-    // Recursively process all child nodes\r
-    for (auto child : children)\r
-        processDisplay (child, allNodes);\r
-}\r
-\r
-/** This is called when the displays Array has been filled out with the info for all connected displays and the\r
-    totalArea and userArea Rectangles need to be converted from physical to logical coordinates.\r
-*/\r
-void Displays::updateToLogical()\r
-{\r
-    if (displays.size() == 1)\r
-    {\r
-        auto& display = displays.getReference (0);\r
-\r
-        display.totalArea = (display.totalArea.toDouble() / display.scale).toNearestInt();\r
-        display.userArea  = (display.userArea.toDouble()  / display.scale).toNearestInt();\r
-\r
-        return;\r
-    }\r
-\r
-    Array<DisplayNode> displayNodes;\r
-\r
-    for (auto& d : displays)\r
-    {\r
-        DisplayNode node;\r
-\r
-        node.display = &d;\r
-        displayNodes.add (node);\r
-    }\r
-\r
-    DisplayNode* root = nullptr;\r
-    for (auto& node : displayNodes)\r
-    {\r
-        if (node.display->totalArea.getTopLeft() == Point<int>())\r
-        {\r
-            root = &node;\r
-            root->isRoot = true;\r
-            break;\r
-        }\r
-    }\r
-\r
-    // Must have a root node!\r
-    jassert (root != nullptr);\r
-\r
-    // Recursively traverse the display graph from the root and work out logical bounds\r
-    processDisplay (root, displayNodes);\r
-\r
-    for (auto& node : displayNodes)\r
-    {\r
-        // All of the nodes should have a parent\r
-        jassert (node.parent != nullptr);\r
-\r
-        auto relativeUserArea = (node.display->userArea.toDouble() - node.display->totalArea.toDouble().getTopLeft()) / node.display->scale;\r
-\r
-        // Now set Display::totalArea and ::userArea using the logical area that we have calculated\r
-        node.display->topLeftPhysical = node.display->totalArea.getTopLeft();\r
-        node.display->totalArea       = node.logicalArea.toNearestInt();\r
-        node.display->userArea        = (relativeUserArea + node.logicalArea.getTopLeft()).toNearestInt();\r
-    }\r
-}\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_gui_basics/desktop/juce_Displays.h b/modules/juce_gui_basics/desktop/juce_Displays.h
deleted file mode 100644 (file)
index f360124..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
-    Manages details about connected display devices.\r
-\r
-    @tags{GUI}\r
-*/\r
-class JUCE_API  Displays\r
-{\r
-private:\r
-    Displays (Desktop&);\r
-\r
-public:\r
-    /** Represents a connected display device. */\r
-    struct Display\r
-    {\r
-        /** This will be true if this is the user's main display device. */\r
-        bool isMain;\r
-\r
-        /** The total area of this display in logical pixels including any OS-dependent objects\r
-            like the taskbar, menu bar, etc. */\r
-        Rectangle<int> totalArea;\r
-\r
-        /** The total area of this display in logical pixels which isn't covered by OS-dependent\r
-            objects like the taskbar, menu bar, etc.\r
-        */\r
-        Rectangle<int> userArea;\r
-\r
-        /** The top-left of this display in physical coordinates. */\r
-        Point<int> topLeftPhysical;\r
-\r
-        /** The scale factor of this display.\r
-\r
-            For higher-resolution displays, or displays with a user-defined scale factor set,\r
-            this may be a value other than 1.0.\r
-\r
-            This value is used to convert between physical and logical pixels. For example, a Component\r
-            with size 10x10 will use 20x20 physical pixels on a display with a scale factor of 2.0.\r
-        */\r
-        double scale;\r
-\r
-        /** The DPI of the display.\r
-\r
-            This is the number of physical pixels per inch. To get the number of logical\r
-            pixels per inch, divide this by the Display::scale value.\r
-        */\r
-        double dpi;\r
-    };\r
-\r
-    /** Converts a Rectangle from physical to logical pixels.\r
-\r
-        If useScaleFactorOfDisplay is not null then its scale factor will be used for the conversion\r
-        regardless of the display that the Rectangle to be converted is on.\r
-    */\r
-    Rectangle<int> physicalToLogical (Rectangle<int>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
-    /** Converts a Rectangle from logical to physical pixels.\r
-\r
-        If useScaleFactorOfDisplay is not null then its scale factor will be used for the conversion\r
-        regardless of the display that the Rectangle to be converted is on.\r
-    */\r
-    Rectangle<int> logicalToPhysical (Rectangle<int>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
-    /** Converts a Point from physical to logical pixels. */\r
-    template <typename ValueType>\r
-    Point<ValueType> physicalToLogical (Point<ValueType>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
-    /** Converts a Point from logical to physical pixels. */\r
-    template <typename ValueType>\r
-    Point<ValueType> logicalToPhysical (Point<ValueType>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
-    /** Returns the Display object representing the display containing a given Rectangle (either\r
-        in logical or physical pixels).\r
-\r
-        If the Rectangle lies outside all the displays then the nearest one will be returned.\r
-    */\r
-    const Display& findDisplayForRect (Rectangle<int>, bool isPhysical = false)  const noexcept;\r
-\r
-    /** Returns the Display object representing the display containing a given Point (either\r
-        in logical or physical pixels).\r
-\r
-        If the Point lies outside all the displays then the nearest one will be returned.\r
-    */\r
-    const Display& findDisplayForPoint (Point<int>, bool isPhysical = false)  const noexcept;\r
-\r
-    /** Returns the Display object representing the display acting as the user's main screen. */\r
-    const Display& getMainDisplay() const noexcept;\r
-\r
-    /** Returns a RectangleList made up of all the displays in LOGICAL pixels. */\r
-    RectangleList<int> getRectangleList (bool userAreasOnly) const;\r
-\r
-    /** Returns the smallest bounding box which contains all the displays in LOGICAL pixels. */\r
-    Rectangle<int> getTotalBounds (bool userAreasOnly) const;\r
-\r
-    /** An Array containing the Display objects for all of the connected displays. */\r
-    Array<Display> displays;\r
-\r
-   #ifndef DOXYGEN\r
-    /** @internal */\r
-    void refresh();\r
-    /** @internal */\r
-    ~Displays() {}\r
-    // This method has been deprecated - use the findDisplayForPoint() or findDisplayForRect() methods instead\r
-    // as they can deal with converting between logical and physical pixels\r
-    JUCE_DEPRECATED (const Display& getDisplayContaining (Point<int> position) const noexcept);\r
-   #endif\r
-\r
-private:\r
-    friend class Desktop;\r
-\r
-    void init (Desktop&);\r
-    void findDisplays (float masterScale);\r
-\r
-    void updateToLogical();\r
-};\r
-\r
-} // namespace juce\r
index 575e5c99134df006cafbbc075dd895d9e3fdc0f4..ff540732826ecb900e35e789e19247fa88898f17 100644 (file)
@@ -67,7 +67,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    Drawable* createCopy() const override;\r
+    Drawable* createCopy() const;\r
 \r
 private:\r
     //==============================================================================\r
index d3eae4f7a87b4ce877ec7517175f16ecb0e7da4f..a53d9b55198cf4177d24254cff1d29a84d85be7f 100644 (file)
@@ -62,7 +62,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    Drawable* createCopy() const override;\r
+    Drawable* createCopy() const;\r
 \r
 private:\r
     Parallelogram<float> bounds;\r
index 657bd12cb651de334f1c31f71c7f37610f3d4430..c26db225e5c0cb181d5f5e8f483ccc5296a44c41 100644 (file)
@@ -937,7 +937,8 @@ private:
 \r
         FillType type (gradient);\r
 \r
-        auto gradientTransform = parseTransform (fillXml->getStringAttribute ("gradientTransform"));\r
+        auto gradientTransform = parseTransform (fillXml->getStringAttribute ("gradientTransform"))\r
+                                   .followedBy (transform);\r
 \r
         if (gradient.isRadial)\r
         {\r
@@ -1201,18 +1202,12 @@ private:
                 auto* di = new DrawableImage();\r
 \r
                 setCommonAttributes (*di, xml);\r
-\r
-                Rectangle<float> imageBounds ((float) xml->getDoubleAttribute ("x", 0.0),                  (float) xml->getDoubleAttribute ("y", 0.0),\r
-                                              (float) xml->getDoubleAttribute ("width", image.getWidth()), (float) xml->getDoubleAttribute ("height", image.getHeight()));\r
-\r
-                di->setImage (image.rescaled ((int) imageBounds.getWidth(), (int) imageBounds.getHeight()));\r
-\r
-                di->setTransformToFit (imageBounds, RectanglePlacement (parsePlacementFlags (xml->getStringAttribute ("preserveAspectRatio").trim())));\r
+                di->setImage (image);\r
 \r
                 if (additionalTransform != nullptr)\r
-                    di->setTransform (di->getTransform().followedBy (transform).followedBy (*additionalTransform));\r
+                    di->setTransform (transform.followedBy (*additionalTransform));\r
                 else\r
-                    di->setTransform (di->getTransform().followedBy (transform));\r
+                    di->setTransform (transform);\r
 \r
                 return di;\r
             }\r
index 9759956dacffd2e1ccdeddd4d72d55a6d6e57e84..dcd368b7de8ee828dd01da49174e1a07d4a6f061 100644 (file)
@@ -111,7 +111,9 @@ private:
 \r
         if (tempFile.create().wasOk())\r
         {\r
-            if (auto outputStream = std::unique_ptr<FileOutputStream> (tempFile.createOutputStream()))\r
+            std::unique_ptr<FileOutputStream> outputStream (tempFile.createOutputStream());\r
+\r
+            if (outputStream != nullptr)\r
             {\r
                 size_t pos = 0;\r
                 size_t totalSize = data.getSize();\r
index 67a8043972de71276fee9ff0d14c3961b13640fc..28a38ba76db98a081171fa0e6584f7778f7dc18a 100644 (file)
@@ -29,7 +29,8 @@ namespace juce
 \r
 DirectoryContentsList::DirectoryContentsList (const FileFilter* f, TimeSliceThread& t)\r
    : fileFilter (f), thread (t),\r
-     fileTypeFlags (File::ignoreHiddenFiles | File::findFiles)\r
+     fileTypeFlags (File::ignoreHiddenFiles | File::findFiles),\r
+     shouldStop (true)\r
 {\r
 }\r
 \r
@@ -102,8 +103,7 @@ void DirectoryContentsList::clear()
 \r
 void DirectoryContentsList::refresh()\r
 {\r
-    stopSearching();\r
-    files.clear();\r
+    clear();\r
 \r
     if (root.isDirectory())\r
     {\r
index c65b077723a661aa6c18f86f7c5c7d92cf8fb588..81664b167d9bc6fb19452d1af742afa94d13d5f0 100644 (file)
@@ -209,7 +209,7 @@ private:
     OwnedArray<FileInfo> files;\r
 \r
     std::unique_ptr<DirectoryIterator> fileFindHandle;\r
-    std::atomic<bool> shouldStop { true };\r
+    bool volatile shouldStop;\r
 \r
     int useTimeSlice() override;\r
     void stopSearching();\r
index d5321163d59459cc6a9fef6428fe97d251772da3..786bb6ab11d2f5a7db675b978f025a36442024c4 100644 (file)
@@ -39,8 +39,7 @@ public:
 \r
           filter (selectsFiles ? owner.filters : String(), selectsDirectories ? "*" : String(), {}),\r
           browserComponent (flags, owner.startingFile, &filter, preview),\r
-          dialogBox (owner.title, {}, browserComponent, warnAboutOverwrite,\r
-                     browserComponent.findColour (AlertWindow::backgroundColourId), owner.parent)\r
+          dialogBox (owner.title, {}, browserComponent, warnAboutOverwrite, browserComponent.findColour (AlertWindow::backgroundColourId))\r
     {}\r
 \r
     ~NonNative()\r
@@ -93,12 +92,10 @@ FileChooser::FileChooser (const String& chooserBoxTitle,
                           const File& currentFileOrDirectory,\r
                           const String& fileFilters,\r
                           const bool useNativeBox,\r
-                          const bool treatFilePackagesAsDirectories,\r
-                          Component* parentComponentToUse)\r
+                          const bool treatFilePackagesAsDirectories)\r
     : title (chooserBoxTitle),\r
       filters (fileFilters),\r
       startingFile (currentFileOrDirectory),\r
-      parent (parentComponentToUse),\r
       useNativeDialogBox (useNativeBox && isPlatformDialogAvailable()),\r
       treatFilePackagesAsDirs (treatFilePackagesAsDirectories)\r
 {\r
index b867ae131b1b88d9556b670f2f8cbbd5cee6d309..59497f2714a16adedf967fd259f7e8293660ab5c 100644 (file)
@@ -75,7 +75,7 @@ public:
                                               initialFileOrDirectory will be used as the initial\r
                                               directory of the native file chooser.\r
 \r
-                                              Note: On iOS when saving a file, a user will not\r
+                                              Note: on iOS when saving a file, a user will not\r
                                               be able to change a file name, so it may be a good\r
                                               idea to include at least a valid file name in\r
                                               initialFileOrDirectory. When no filename is found,\r
@@ -107,11 +107,6 @@ public:
                                               selection of files inside packages when\r
                                               invoked on OS X and when using native dialog\r
                                               boxes.\r
-        @param parentComponent                An optional component which should be the parent\r
-                                              for the file chooser. If this is a nullptr then the\r
-                                              FileChooser will be a top-level window. AUv3s on iOS\r
-                                              must specify this parameter as opening a top-level window\r
-                                              in an AUv3 is forbidden due to sandbox restrictions.\r
 \r
         @see browseForFileToOpen, browseForFileToSave, browseForDirectory\r
     */\r
@@ -119,8 +114,7 @@ public:
                  const File& initialFileOrDirectory = File(),\r
                  const String& filePatternsAllowed = String(),\r
                  bool useOSNativeDialogBox = true,\r
-                 bool treatFilePackagesAsDirectories = false,\r
-                 Component* parentComponent = nullptr);\r
+                 bool treatFilePackagesAsDirectories = false);\r
 \r
     /** Destructor. */\r
     ~FileChooser();\r
@@ -251,7 +245,7 @@ public:
         may return a URL to a remote document. If a local file is chosen then you can\r
         convert this file to a JUCE File class via the URL::getLocalFile method.\r
 \r
-        Note: On iOS you must use the returned URL object directly (you are also\r
+        Note: on iOS you must use the returned URL object directly (you are also\r
         allowed to copy- or move-construct another URL from the returned URL), rather\r
         than just storing the path as a String and then creating a new URL from that\r
         String. This is because the returned URL contains internally a security\r
@@ -274,7 +268,7 @@ public:
         This array may be empty if no files were chosen, or can contain multiple entries\r
         if multiple files were chosen.\r
 \r
-        Note: On iOS you must use the returned URL object directly (you are also\r
+        Note: on iOS you must use the returned URL object directly (you are also\r
         allowed to copy- or move-construct another URL from the returned URL), rather\r
         than just storing the path as a String and then creating a new URL from that\r
         String. This is because the returned URL contains internally a security\r
@@ -306,7 +300,6 @@ private:
     //==============================================================================\r
     String title, filters;\r
     File startingFile;\r
-    Component* parent;\r
     Array<URL> results;\r
     const bool useNativeDialogBox;\r
     const bool treatFilePackagesAsDirs;\r
index 4fbbafceeade7076686f3ba3623fdd0530acdcad..3847c46daee7c4497ad298e60087b4408d684c64 100644 (file)
@@ -94,9 +94,8 @@ FileChooserDialogBox::FileChooserDialogBox (const String& name,
                                             const String& instructions,\r
                                             FileBrowserComponent& chooserComponent,\r
                                             bool shouldWarn,\r
-                                            Colour backgroundColour,\r
-                                            Component* parentComponent)\r
-    : ResizableWindow (name, backgroundColour, parentComponent == nullptr),\r
+                                            Colour backgroundColour)\r
+    : ResizableWindow (name, backgroundColour, true),\r
       warnAboutOverwritingExistingFiles (shouldWarn)\r
 {\r
     content = new ContentComponent (name, instructions, chooserComponent);\r
@@ -112,9 +111,6 @@ FileChooserDialogBox::FileChooserDialogBox (const String& name,
     content->chooserComponent.addListener (this);\r
 \r
     FileChooserDialogBox::selectionChanged();\r
-\r
-    if (parentComponent != nullptr)\r
-        parentComponent->addAndMakeVisible (this);\r
 }\r
 \r
 FileChooserDialogBox::~FileChooserDialogBox()\r
index 68159c3d02705a673e8b59a84134770ecccb6fb4..16c006b8b952deeb0dc430952bbc3a9264616709 100644 (file)
@@ -81,11 +81,6 @@ public:
                                 if they try to select a file that already exists. (This\r
                                 flag is only used when saving files)\r
         @param backgroundColour the background colour for the top level window\r
-        @param parentComponent  an optional component which should be the parent\r
-                                for the file chooser. If this is a nullptr then the\r
-                                dialog box will be a top-level window. AUv3s on iOS\r
-                                must specify this parameter as opening a top-level window\r
-                                in an AUv3 is forbidden due to sandbox restrictions.\r
 \r
         @see FileBrowserComponent, FilePreviewComponent\r
     */\r
@@ -93,8 +88,7 @@ public:
                           const String& instructions,\r
                           FileBrowserComponent& browserComponent,\r
                           bool warnAboutOverwritingExistingFiles,\r
-                          Colour backgroundColour,\r
-                          Component* parentComponent = nullptr);\r
+                          Colour backgroundColour);\r
 \r
     /** Destructor. */\r
     ~FileChooserDialogBox();\r
index 5d65ae864309ad1a72aecc31bc8b9440a994be3c..17c564cce3d9d7dcb611dd9f1edc99f998eb08d1 100644 (file)
@@ -38,12 +38,12 @@ ImagePreviewComponent::~ImagePreviewComponent()
 //==============================================================================\r
 void ImagePreviewComponent::getThumbSize (int& w, int& h) const\r
 {\r
-    auto availableW = proportionOfWidth (0.97f);\r
-    auto availableH = getHeight() - 13 * 4;\r
+    const int availableW = proportionOfWidth (0.97f);\r
+    const int availableH = getHeight() - 13 * 4;\r
 \r
-    auto scale = jmin (1.0,\r
-                       availableW / (double) w,\r
-                       availableH / (double) h);\r
+    const double scale = jmin (1.0,\r
+                               availableW / (double) w,\r
+                               availableH / (double) h);\r
 \r
     w = roundToInt (scale * w);\r
     h = roundToInt (scale * h);\r
@@ -66,18 +66,18 @@ void ImagePreviewComponent::timerCallback()
     currentDetails.clear();\r
     repaint();\r
 \r
-    FileInputStream in (fileToLoad);\r
+    std::unique_ptr<FileInputStream> in (fileToLoad.createInputStream());\r
 \r
-    if (in.openedOk() && fileToLoad.existsAsFile())\r
+    if (in != nullptr && in->getFile().existsAsFile())\r
     {\r
-        if (auto format = ImageFileFormat::findImageFormatForStream (in))\r
+        if (ImageFileFormat* const format = ImageFileFormat::findImageFormatForStream (*in))\r
         {\r
-            currentThumbnail = format->decodeImage (in);\r
+            currentThumbnail = format->decodeImage (*in);\r
 \r
             if (currentThumbnail.isValid())\r
             {\r
-                auto w = currentThumbnail.getWidth();\r
-                auto h = currentThumbnail.getHeight();\r
+                int w = currentThumbnail.getWidth();\r
+                int h = currentThumbnail.getHeight();\r
 \r
                 currentDetails\r
                     << fileToLoad.getFileName() << "\n"\r
@@ -99,13 +99,13 @@ void ImagePreviewComponent::paint (Graphics& g)
     {\r
         g.setFont (13.0f);\r
 \r
-        auto w = currentThumbnail.getWidth();\r
-        auto h = currentThumbnail.getHeight();\r
+        int w = currentThumbnail.getWidth();\r
+        int h = currentThumbnail.getHeight();\r
         getThumbSize (w, h);\r
 \r
         const int numLines = 4;\r
-        auto totalH = 13 * numLines + h + 4;\r
-        auto y = (getHeight() - totalH) / 2;\r
+        const int totalH = 13 * numLines + h + 4;\r
+        const int y = (getHeight() - totalH) / 2;\r
 \r
         g.drawImageWithin (currentThumbnail,\r
                            (getWidth() - w) / 2, y, w, h,\r
index 3c98769a8465810c98fd8b2b025790829ba149eb..4c6dc5b315b54c2a5bdf8e9fdbe5f02034e5c621 100644 (file)
 #include <set>\r
 \r
 //==============================================================================\r
-#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \\r
-    jassert ((MessageManager::getInstanceWithoutCreating() != nullptr \\r
-               && MessageManager::getInstanceWithoutCreating()->currentThreadHasLockedMessageManager()) \\r
-              || getPeer() == nullptr);\r
+#define ASSERT_MESSAGE_MANAGER_IS_LOCKED \\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
+\r
+#define ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \\r
+    jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager() || getPeer() == nullptr);\r
 \r
 namespace juce\r
 {\r
@@ -152,8 +153,7 @@ namespace juce
 #include "components/juce_Component.cpp"\r
 #include "components/juce_ComponentListener.cpp"\r
 #include "mouse/juce_MouseInputSource.cpp"\r
-#include "desktop/juce_Displays.cpp"\r
-#include "desktop/juce_Desktop.cpp"\r
+#include "components/juce_Desktop.cpp"\r
 #include "components/juce_ModalComponentManager.cpp"\r
 #include "mouse/juce_ComponentDragger.cpp"\r
 #include "mouse/juce_DragAndDropContainer.cpp"\r
index e05c49a8f2c1d8f1933c9dc34e57ed197d366ff1..e756f154198720b62f76d06bdfff3ce05b050f1d 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_gui_basics\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE GUI core classes\r
   description:      Basic user-interface components and related classes.\r
   website:          http://www.juce.com/juce\r
  #define JUCE_USE_XCURSOR 1\r
 #endif\r
 \r
-/** Config: JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    Enables per-monitor DPI awareness on Windows 8.1 and above.\r
-*/\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- #define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
 //==============================================================================\r
 namespace juce\r
 {\r
@@ -155,7 +148,6 @@ namespace juce
     class KeyPressMappingSet;\r
     class ApplicationCommandManagerListener;\r
     class DrawableButton;\r
-    class Displays;\r
 \r
     class FlexBox;\r
     #if JUCE_HAS_CONSTEXPR\r
@@ -176,8 +168,7 @@ namespace juce
 #include "components/juce_CachedComponentImage.h"\r
 #include "components/juce_Component.h"\r
 #include "layout/juce_ComponentAnimator.h"\r
-#include "desktop/juce_Desktop.h"\r
-#include "desktop/juce_Displays.h"\r
+#include "components/juce_Desktop.h"\r
 #include "layout/juce_ComponentBoundsConstrainer.h"\r
 #include "mouse/juce_ComponentDragger.h"\r
 #include "mouse/juce_DragAndDropTarget.h"\r
index ae1707d83a88e11568078eda6be0108c36555582..af1c4da752cbc0fa767ed90101db663c8c7ec7ad 100644 (file)
 namespace juce\r
 {\r
 \r
+KeyPress::KeyPress() noexcept\r
+{\r
+}\r
+\r
 KeyPress::KeyPress (int code, ModifierKeys m, juce_wchar textChar) noexcept\r
     : keyCode (code), mods (m), textCharacter (textChar)\r
 {\r
@@ -36,6 +40,19 @@ KeyPress::KeyPress (const int code) noexcept  : keyCode (code)
 {\r
 }\r
 \r
+KeyPress::KeyPress (const KeyPress& other) noexcept\r
+    : keyCode (other.keyCode), mods (other.mods), textCharacter (other.textCharacter)\r
+{\r
+}\r
+\r
+KeyPress& KeyPress::operator= (const KeyPress& other) noexcept\r
+{\r
+    keyCode = other.keyCode;\r
+    mods = other.mods;\r
+    textCharacter = other.textCharacter;\r
+    return *this;\r
+}\r
+\r
 bool KeyPress::operator== (int otherKeyCode) const noexcept\r
 {\r
     return keyCode == otherKeyCode && ! mods.isAnyModifierKeyDown();\r
index 387c8d8358ec053d6ea5ef02396144522efee528..81df0af7de8c3420cf71ccefc6846dde49d68c46 100644 (file)
@@ -45,10 +45,7 @@ public:
 \r
         @see isValid\r
     */\r
-    KeyPress() = default;\r
-\r
-    /** Destructor. */\r
-    ~KeyPress() = default;\r
+    KeyPress() noexcept;\r
 \r
     /** Creates a KeyPress for a key and some modifiers.\r
 \r
@@ -77,10 +74,10 @@ public:
     explicit KeyPress (int keyCode) noexcept;\r
 \r
     /** Creates a copy of another KeyPress. */\r
-    KeyPress (const KeyPress&) = default;\r
+    KeyPress (const KeyPress& other) noexcept;\r
 \r
     /** Copies this KeyPress from another one. */\r
-    KeyPress& operator= (const KeyPress&) = default;\r
+    KeyPress& operator= (const KeyPress& other) noexcept;\r
 \r
     /** Compares two KeyPress objects. */\r
     bool operator== (const KeyPress& other) const noexcept;\r
index 4af3471c3ba1baede83cd0fec82ac93d702937f9..ec6f5d9a81dcf22eb14a0ef8ac043048ad39b650 100644 (file)
@@ -29,7 +29,15 @@ namespace juce
 \r
 ModifierKeys ModifierKeys::currentModifiers;\r
 \r
+ModifierKeys::ModifierKeys() noexcept                            : flags (0)           {}\r
 ModifierKeys::ModifierKeys (int rawFlags) noexcept               : flags (rawFlags)    {}\r
+ModifierKeys::ModifierKeys (const ModifierKeys& other) noexcept  : flags (other.flags) {}\r
+\r
+ModifierKeys& ModifierKeys::operator= (const ModifierKeys other) noexcept\r
+{\r
+    flags = other.flags;\r
+    return *this;\r
+}\r
 \r
 int ModifierKeys::getNumMouseButtonsDown() const noexcept\r
 {\r
index ed0fff22cc240907dedcb8ef11cfd77176b2a8c4..4c75078ba22288a9a255a98330a31c24cdaf4b54 100644 (file)
@@ -43,7 +43,7 @@ class JUCE_API  ModifierKeys
 public:\r
     //==============================================================================\r
     /** Creates a ModifierKeys object with no flags set. */\r
-    ModifierKeys() = default;\r
+    ModifierKeys() noexcept;\r
 \r
     /** Creates a ModifierKeys object from a raw set of flags.\r
 \r
@@ -54,10 +54,10 @@ public:
     ModifierKeys (int flags) noexcept;\r
 \r
     /** Creates a copy of another object. */\r
-    ModifierKeys (const ModifierKeys&) = default;\r
+    ModifierKeys (const ModifierKeys& other) noexcept;\r
 \r
     /** Copies this object from another one. */\r
-    ModifierKeys& operator= (const ModifierKeys&) = default;\r
+    ModifierKeys& operator= (const ModifierKeys other) noexcept;\r
 \r
     //==============================================================================\r
     /** Checks whether the 'command' key flag is set (or 'ctrl' on Windows/Linux).\r
@@ -206,7 +206,7 @@ public:
     static ModifierKeys getCurrentModifiersRealtime() noexcept;\r
 \r
 private:\r
-    int flags = 0;\r
+    int flags;\r
 };\r
 \r
 } // namespace juce\r
index bc58337c62846c242850794d894dd845071abff7..c3a105bb8c72d69c9cfcf41591c6d06c4f2dd635 100644 (file)
@@ -159,7 +159,8 @@ public:
             else\r
                 jassertfalse; // seem to be trying to animate a component that's not visible..\r
 \r
-            auto scale = (float) Desktop::getInstance().getDisplays().findDisplayForRect (getScreenBounds()).scale;\r
+            auto scale = (float) Desktop::getInstance().getDisplays()\r
+                                  .getDisplayContaining (getScreenBounds().getCentre()).scale;\r
 \r
             image = c.createComponentSnapshot (c.getLocalBounds(), false, scale);\r
 \r
index 0f42d012fc03bcac60889203a8493f8917c1db4a..054a51866268919d31e3604cb96161163e8d4660 100644 (file)
@@ -87,7 +87,7 @@ public:
                                     component, or if there's a chance the parent might decide to delete its children.\r
         @param startSpeed           a value to indicate the relative start speed of the animation. If this is 0,\r
                                     the component will start by accelerating from rest; higher values mean that it\r
-                                    will have an initial speed greater than zero. If the value is greater than 1, it\r
+                                    will have an initial speed greater than zero. If the value if greater than 1, it\r
                                     will decelerate towards the middle of its journey. To move the component at a\r
                                     constant rate for its entire animation, set both the start and end speeds to 1.0\r
         @param endSpeed             a relative speed at which the component should be moving when the animation finishes.\r
index 50486cdb0ddbd4ee92bd3692cab8b2fab3955e17..158cbe61f21c191f7dd64b2c55d9e0c5b2d7581b 100644 (file)
@@ -117,7 +117,7 @@ void ComponentBoundsConstrainer::setBoundsForComponent (Component* component,
         if (auto* peer = component->getPeer())\r
             border = peer->getFrameSize();\r
 \r
-        auto screenBounds = Desktop::getInstance().getDisplays().findDisplayForPoint (targetBounds.getCentre()).userArea;\r
+        auto screenBounds = Desktop::getInstance().getDisplays().getDisplayContaining (targetBounds.getCentre()).userArea;\r
 \r
         limits = component->getLocalArea (nullptr, screenBounds) + component->getPosition();\r
     }\r
index daa1f7fb542e05d6cae988787a5e86b1d2f42841..8f4bbb151565d66f1e77276989fbb2c351d5503c 100644 (file)
@@ -49,7 +49,7 @@ class JUCE_API  ComponentMovementWatcher    : public ComponentListener
 public:\r
     //==============================================================================\r
     /** Creates a ComponentMovementWatcher to watch a given target component. */\r
-    ComponentMovementWatcher (Component* componentToWatch);\r
+    ComponentMovementWatcher (Component* component);\r
 \r
     /** Destructor. */\r
     ~ComponentMovementWatcher();\r
@@ -68,7 +68,7 @@ public:
     virtual void componentVisibilityChanged() = 0;\r
 \r
     /** Returns the component that's being watched. */\r
-    Component* getComponent() const noexcept         { return component.get(); }\r
+    Component* getComponent() const noexcept         { return component; }\r
 \r
     //==============================================================================\r
     /** @internal */\r
index 83968347aaa2cf1d8d53b9cbaca3e9a2ff8214fe..6ab189b56af8152b6c7ce4a744e17a6971bb0a98 100644 (file)
@@ -125,6 +125,11 @@ private:
 \r
     class PanelHolder;\r
     struct PanelSizes;\r
+    friend class PanelHolder;\r
+    friend struct PanelSizes;\r
+    friend struct ContainerDeletePolicy<PanelSizes>;\r
+    friend struct ContainerDeletePolicy<PanelHolder>;\r
+\r
     std::unique_ptr<PanelSizes> currentSizes;\r
     OwnedArray<PanelHolder> holders;\r
     ComponentAnimator animator;\r
index 1f486253999872dac1147a7c82e7fa808fbc7d13..2c9361c63cba37a2663eab0bece0a779462135a1 100644 (file)
@@ -298,12 +298,7 @@ struct Grid::PlacementHelpers
                                     const std::map<juce::String, LineArea>& namedAreas)\r
     {\r
         if (item.area.isNotEmpty() && ! grid.templateAreas.isEmpty())\r
-        {\r
-            // Must be a named area!\r
-            jassert (namedAreas.count (item.area) != 0);\r
-\r
             return namedAreas.at (item.area);\r
-        }\r
 \r
         return { deduceLineRange (item.column, grid.templateColumns),\r
                  deduceLineRange (item.row,    grid.templateRows) };\r
@@ -354,7 +349,11 @@ struct Grid::PlacementHelpers
                 }\r
                 else\r
                 {\r
-                    if (string == area.name)\r
+                    if (string == emptyAreaCharacter)\r
+                    {\r
+                        break;\r
+                    }\r
+                    else if (string == area.name)\r
                     {\r
                         area.lines.row.end = stringsArrays.indexOf (stringArray) + 2;\r
                         area.lines.column.end = stringArray.indexOf (string) + 2;\r
@@ -533,9 +532,9 @@ struct Grid::AutoPlacement
     {\r
         struct Cell { int column, row; };\r
 \r
-        OccupancyPlane (int highestColumnToUse, int highestRowToUse, bool isColumnFirst)\r
-            : highestCrossDimension (isColumnFirst ? highestRowToUse : highestColumnToUse),\r
-              columnFirst (isColumnFirst)\r
+        OccupancyPlane (int highestColumnToUse, int highestRowToUse, bool isColoumnFirst)\r
+            : highestCrossDimension (isColoumnFirst ? highestRowToUse : highestColumnToUse),\r
+              columnFirst (isColoumnFirst)\r
         {}\r
 \r
         Grid::PlacementHelpers::LineArea setCell (Cell cell, int columnSpan, int rowSpan)\r
index f005e17cbdc9efe87033a9acda81361f0ea5e148..99084d099374a4e18d65c082a3637f77eacd1833 100644 (file)
 namespace juce\r
 {\r
 \r
-struct GridTests  : public UnitTest\r
+struct GridTests  : public juce::UnitTest\r
 {\r
-    GridTests() : UnitTest ("Grid class") {}\r
+    GridTests() : juce::UnitTest ("Grid class") {}\r
 \r
     void runTest() override\r
     {\r
-        using Fr = Grid::Fr;\r
-        using Tr = Grid::TrackInfo;\r
-        using Rect = Rectangle<float>;\r
+        using Fr = juce::Grid::Fr;\r
+        using Tr = juce::Grid::TrackInfo;\r
+        using Rect = juce::Rectangle<float>;\r
+        using Grid = juce::Grid;\r
 \r
         {\r
             Grid grid;\r
@@ -46,7 +47,7 @@ struct GridTests  : public UnitTest
             grid.items.addArray ({ GridItem().withArea (1, 1),\r
                                    GridItem().withArea (2, 1) });\r
 \r
-            grid.performLayout (Rectangle<int> (200, 400));\r
+            grid.performLayout (juce::Rectangle<int> (200, 400));\r
 \r
             beginTest ("Layout calculation test: 1 column x 2 rows: no gap");\r
             expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f,  200.f, 20.0f));\r
@@ -60,7 +61,7 @@ struct GridTests  : public UnitTest
                                     GridItem().withArea (3, 1),\r
                                     GridItem().withArea (3, 2) });\r
 \r
-            grid.performLayout (Rectangle<int> (150, 170));\r
+            grid.performLayout (juce::Rectangle<int> (150, 170));\r
 \r
             beginTest ("Layout calculation test: 2 columns x 3 rows: no gap");\r
             expect (grid.items[0].currentBounds == Rect (0.0f,   0.0f,  100.0f, 20.0f));\r
@@ -73,7 +74,7 @@ struct GridTests  : public UnitTest
             grid.columnGap = 20_px;\r
             grid.rowGap    = 10_px;\r
 \r
-            grid.performLayout (Rectangle<int> (200, 310));\r
+            grid.performLayout (juce::Rectangle<int> (200, 310));\r
 \r
             beginTest ("Layout calculation test: 2 columns x 3 rows: rowGap of 10 and columnGap of 20");\r
             expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 130.0f, 20.0f));\r
index 7ee552f6a9ae48338a6182dd6bfa4619ed9122b7..163295d7a4b465d364d5eecadf0ea0766da93a1d 100644 (file)
 namespace juce\r
 {\r
 \r
-ResizableBorderComponent::Zone::Zone() noexcept {}\r
-ResizableBorderComponent::Zone::Zone (int zoneFlags) noexcept  : zone (zoneFlags) {}\r
+ResizableBorderComponent::Zone::Zone() noexcept  : zone (0) {}\r
+\r
+ResizableBorderComponent::Zone::Zone (const int zoneFlags) noexcept  : zone (zoneFlags) {}\r
+\r
 ResizableBorderComponent::Zone::Zone (const ResizableBorderComponent::Zone& other) noexcept  : zone (other.zone) {}\r
 \r
 ResizableBorderComponent::Zone& ResizableBorderComponent::Zone::operator= (const ResizableBorderComponent::Zone& other) noexcept\r
@@ -40,8 +42,8 @@ ResizableBorderComponent::Zone& ResizableBorderComponent::Zone::operator= (const
 bool ResizableBorderComponent::Zone::operator== (const ResizableBorderComponent::Zone& other) const noexcept      { return zone == other.zone; }\r
 bool ResizableBorderComponent::Zone::operator!= (const ResizableBorderComponent::Zone& other) const noexcept      { return zone != other.zone; }\r
 \r
-ResizableBorderComponent::Zone ResizableBorderComponent::Zone::fromPositionOnBorder (Rectangle<int> totalSize,\r
-                                                                                     BorderSize<int> border,\r
+ResizableBorderComponent::Zone ResizableBorderComponent::Zone::fromPositionOnBorder (const Rectangle<int>& totalSize,\r
+                                                                                     const BorderSize<int>& border,\r
                                                                                      Point<int> position)\r
 {\r
     int z = 0;\r
@@ -49,15 +51,13 @@ ResizableBorderComponent::Zone ResizableBorderComponent::Zone::fromPositionOnBor
     if (totalSize.contains (position)\r
          && ! border.subtractedFrom (totalSize).contains (position))\r
     {\r
-        auto minW = jmax (totalSize.getWidth() / 10, jmin (10, totalSize.getWidth() / 3));\r
-\r
+        const int minW = jmax (totalSize.getWidth() / 10, jmin (10, totalSize.getWidth() / 3));\r
         if (position.x < jmax (border.getLeft(), minW) && border.getLeft() > 0)\r
             z |= left;\r
         else if (position.x >= totalSize.getWidth() - jmax (border.getRight(), minW) && border.getRight() > 0)\r
             z |= right;\r
 \r
-        auto minH = jmax (totalSize.getHeight() / 10, jmin (10, totalSize.getHeight() / 3));\r
-\r
+        const int minH = jmax (totalSize.getHeight() / 10, jmin (10, totalSize.getHeight() / 3));\r
         if (position.y < jmax (border.getTop(), minH) && border.getTop() > 0)\r
             z |= top;\r
         else if (position.y >= totalSize.getHeight() - jmax (border.getBottom(), minH) && border.getBottom() > 0)\r
@@ -69,7 +69,7 @@ ResizableBorderComponent::Zone ResizableBorderComponent::Zone::fromPositionOnBor
 \r
 MouseCursor ResizableBorderComponent::Zone::getMouseCursor() const noexcept\r
 {\r
-    auto mc = MouseCursor::NormalCursor;\r
+    MouseCursor::StandardCursorType mc = MouseCursor::NormalCursor;\r
 \r
     switch (zone)\r
     {\r
@@ -141,7 +141,7 @@ void ResizableBorderComponent::mouseDrag (const MouseEvent& e)
         return;\r
     }\r
 \r
-    auto newBounds = mouseZone.resizeRectangleBy (originalBounds, e.getOffsetFromDragStart());\r
+    const Rectangle<int> newBounds (mouseZone.resizeRectangleBy (originalBounds, e.getOffsetFromDragStart()));\r
 \r
     if (constrainer != nullptr)\r
     {\r
@@ -153,8 +153,8 @@ void ResizableBorderComponent::mouseDrag (const MouseEvent& e)
     }\r
     else\r
     {\r
-        if (auto* p = component->getPositioner())\r
-            p->applyNewBounds (newBounds);\r
+        if (Component::Positioner* const pos = component->getPositioner())\r
+            pos->applyNewBounds (newBounds);\r
         else\r
             component->setBounds (newBounds);\r
     }\r
@@ -190,7 +190,7 @@ BorderSize<int> ResizableBorderComponent::getBorderThickness() const
 \r
 void ResizableBorderComponent::updateMouseZone (const MouseEvent& e)\r
 {\r
-    auto newZone = Zone::fromPositionOnBorder (getLocalBounds(), borderSize, e.getPosition());\r
+    Zone newZone (Zone::fromPositionOnBorder (getLocalBounds(), borderSize, e.getPosition()));\r
 \r
     if (mouseZone != newZone)\r
     {\r
index 5a86c4f5bd079928e46e652c197aa70a740b68f4..507dd17718a69b91682a6076fc6e94b20904067a 100644 (file)
@@ -119,8 +119,8 @@ public:
         /** Given a point within a rectangle with a resizable border, this returns the\r
             zone that the point lies within.\r
         */\r
-        static Zone fromPositionOnBorder (Rectangle<int> totalSize,\r
-                                          BorderSize<int> border,\r
+        static Zone fromPositionOnBorder (const Rectangle<int>& totalSize,\r
+                                          const BorderSize<int>& border,\r
                                           Point<int> position);\r
 \r
         /** Returns an appropriate mouse-cursor for this resize zone. */\r
@@ -160,7 +160,7 @@ public:
 \r
     private:\r
         //==============================================================================\r
-        int zone = centre;\r
+        int zone;\r
     };\r
 \r
     /** Returns the zone in which the mouse was last seen. */\r
index 2fac0f042a66dd4eca0d5ce079318664629e0727..a4c8441be28d8b50ca7437c1411579ac3dbe28b5 100644 (file)
@@ -77,7 +77,7 @@ void ResizableEdgeComponent::mouseDrag (const MouseEvent& e)
         return;\r
     }\r
 \r
-    auto newBounds = originalBounds;\r
+    Rectangle<int> newBounds (originalBounds);\r
 \r
     switch (edge)\r
     {\r
@@ -98,8 +98,8 @@ void ResizableEdgeComponent::mouseDrag (const MouseEvent& e)
     }\r
     else\r
     {\r
-        if (auto* p = component->getPositioner())\r
-            p->applyNewBounds (newBounds);\r
+        if (Component::Positioner* const pos = component->getPositioner())\r
+            pos->applyNewBounds (newBounds);\r
         else\r
             component->setBounds (newBounds);\r
     }\r
index e13565e616c67928def33e9de3b201e31ed489dc..c441cbc454700c16f958f06c6d8dc3225a371929 100644 (file)
@@ -308,7 +308,7 @@ void ScrollBar::resized()
 \r
     if (upButton != nullptr)\r
     {\r
-        auto r = getLocalBounds();\r
+        Rectangle<int> r (getLocalBounds());\r
 \r
         if (vertical)\r
         {\r
index 038a86558bd09b5c496e1f7b13d46cb37899d26e..15e5825a8f7c1f1473a86063b9ac5384221bf736 100644 (file)
@@ -420,6 +420,7 @@ private:
     int initialDelayInMillisecs = 100, repeatDelayInMillisecs = 50, minimumDelayInMillisecs = 10;\r
     bool vertical, isDraggingThumb = false, autohides = true, userVisibilityFlag = false;\r
     class ScrollbarButton;\r
+    friend struct ContainerDeletePolicy<ScrollbarButton>;\r
     std::unique_ptr<ScrollbarButton> upButton, downButton;\r
     ListenerList<Listener> listeners;\r
 \r
index 17a14d7f8da79d34aea7182ff05169766d9dea4a..67ee6cb1ef95dbf02a320ba0a6390fe4f7ca7ba5 100644 (file)
@@ -39,9 +39,9 @@ int TabBarButton::getIndex() const                      { return owner.indexOfTa
 Colour TabBarButton::getTabBackgroundColour() const     { return owner.getTabBackgroundColour (getIndex()); }\r
 bool TabBarButton::isFrontTab() const                   { return getToggleState(); }\r
 \r
-void TabBarButton::paintButton (Graphics& g, const bool shouldDrawButtonAsHighlighted, const bool shouldDrawButtonAsDown)\r
+void TabBarButton::paintButton (Graphics& g, const bool isMouseOverButton, const bool isButtonDown)\r
 {\r
-    getLookAndFeel().drawTabButton (*this, g, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+    getLookAndFeel().drawTabButton (*this, g, isMouseOverButton, isButtonDown);\r
 }\r
 \r
 void TabBarButton::clicked (const ModifierKeys& mods)\r
index a647c93da9350bf53c171d3ad4307ce364562995..1fc8ec3b0e851b7c2e96314ac3f82b5856433caa 100644 (file)
@@ -109,7 +109,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    void paintButton (Graphics&, bool, bool) override;\r
+    void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
     /** @internal */\r
     void clicked (const ModifierKeys&) override;\r
     /** @internal */\r
@@ -359,6 +359,8 @@ private:
     int currentTabIndex = -1;\r
 \r
     class BehindFrontTabComp;\r
+    friend class BehindFrontTabComp;\r
+    friend struct ContainerDeletePolicy<BehindFrontTabComp>;\r
     std::unique_ptr<BehindFrontTabComp> behindFrontTab;\r
     std::unique_ptr<Button> extraTabsButton;\r
 \r
index 437c497dfa6ed95fb2fa431b3c0611636458a4e0..eed3622a39e673e4599a2d6ed302a3d4c87a87e0 100644 (file)
@@ -31,14 +31,14 @@ namespace TabbedComponentHelpers
 {\r
     const Identifier deleteComponentId ("deleteByTabComp_");\r
 \r
-    static void deleteIfNecessary (Component* comp)\r
+    static void deleteIfNecessary (Component* const comp)\r
     {\r
         if (comp != nullptr && (bool) comp->getProperties() [deleteComponentId])\r
             delete comp;\r
     }\r
 \r
     static Rectangle<int> getTabArea (Rectangle<int>& content, BorderSize<int>& outline,\r
-                                      TabbedButtonBar::Orientation orientation, int tabDepth)\r
+                                      const TabbedButtonBar::Orientation orientation, const int tabDepth)\r
     {\r
         switch (orientation)\r
         {\r
@@ -71,7 +71,7 @@ struct TabbedComponent::ButtonBar  : public TabbedButtonBar
         owner.popupMenuClickOnTab (tabIndex, tabName);\r
     }\r
 \r
-    Colour getTabBackgroundColour (int tabIndex)\r
+    Colour getTabBackgroundColour (const int tabIndex)\r
     {\r
         return owner.tabs->getTabBackgroundColour (tabIndex);\r
     }\r
@@ -88,7 +88,7 @@ struct TabbedComponent::ButtonBar  : public TabbedButtonBar
 \r
 \r
 //==============================================================================\r
-TabbedComponent::TabbedComponent (TabbedButtonBar::Orientation orientation)\r
+TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation)\r
 {\r
     tabs.reset (new ButtonBar (*this, orientation));\r
     addAndMakeVisible (tabs.get());\r
@@ -101,7 +101,7 @@ TabbedComponent::~TabbedComponent()
 }\r
 \r
 //==============================================================================\r
-void TabbedComponent::setOrientation (TabbedButtonBar::Orientation orientation)\r
+void TabbedComponent::setOrientation (const TabbedButtonBar::Orientation orientation)\r
 {\r
     tabs->setOrientation (orientation);\r
     resized();\r
@@ -112,7 +112,7 @@ TabbedButtonBar::Orientation TabbedComponent::getOrientation() const noexcept
     return tabs->getOrientation();\r
 }\r
 \r
-void TabbedComponent::setTabBarDepth (int newDepth)\r
+void TabbedComponent::setTabBarDepth (const int newDepth)\r
 {\r
     if (tabDepth != newDepth)\r
     {\r
@@ -121,7 +121,7 @@ void TabbedComponent::setTabBarDepth (int newDepth)
     }\r
 }\r
 \r
-TabBarButton* TabbedComponent::createTabButton (const String& tabName, int /*tabIndex*/)\r
+TabBarButton* TabbedComponent::createTabButton (const String& tabName, const int /*tabIndex*/)\r
 {\r
     return new TabBarButton (tabName, *tabs);\r
 }\r
@@ -132,7 +132,7 @@ void TabbedComponent::clearTabs()
     if (panelComponent != nullptr)\r
     {\r
         panelComponent->setVisible (false);\r
-        removeChildComponent (panelComponent.get());\r
+        removeChildComponent (panelComponent);\r
         panelComponent = nullptr;\r
     }\r
 \r
@@ -146,9 +146,9 @@ void TabbedComponent::clearTabs()
 \r
 void TabbedComponent::addTab (const String& tabName,\r
                               Colour tabBackgroundColour,\r
-                              Component* contentComponent,\r
-                              bool deleteComponentWhenNotNeeded,\r
-                              int insertIndex)\r
+                              Component* const contentComponent,\r
+                              const bool deleteComponentWhenNotNeeded,\r
+                              const int insertIndex)\r
 {\r
     contentComponents.insert (insertIndex, WeakReference<Component> (contentComponent));\r
 \r
@@ -159,22 +159,22 @@ void TabbedComponent::addTab (const String& tabName,
     resized();\r
 }\r
 \r
-void TabbedComponent::setTabName (int tabIndex, const String& newName)\r
+void TabbedComponent::setTabName (const int tabIndex, const String& newName)\r
 {\r
     tabs->setTabName (tabIndex, newName);\r
 }\r
 \r
-void TabbedComponent::removeTab (int tabIndex)\r
+void TabbedComponent::removeTab (const int tabIndex)\r
 {\r
     if (isPositiveAndBelow (tabIndex, contentComponents.size()))\r
     {\r
-        TabbedComponentHelpers::deleteIfNecessary (contentComponents.getReference (tabIndex).get());\r
+        TabbedComponentHelpers::deleteIfNecessary (contentComponents.getReference (tabIndex));\r
         contentComponents.remove (tabIndex);\r
         tabs->removeTab (tabIndex);\r
     }\r
 }\r
 \r
-void TabbedComponent::moveTab (int currentIndex, int newIndex, bool animate)\r
+void TabbedComponent::moveTab (const int currentIndex, const int newIndex, const bool animate)\r
 {\r
     contentComponents.move (currentIndex, newIndex);\r
     tabs->moveTab (currentIndex, newIndex, animate);\r
@@ -190,17 +190,17 @@ StringArray TabbedComponent::getTabNames() const
     return tabs->getTabNames();\r
 }\r
 \r
-Component* TabbedComponent::getTabContentComponent (int tabIndex) const noexcept\r
+Component* TabbedComponent::getTabContentComponent (const int tabIndex) const noexcept\r
 {\r
-    return contentComponents[tabIndex].get();\r
+    return contentComponents [tabIndex];\r
 }\r
 \r
-Colour TabbedComponent::getTabBackgroundColour (int tabIndex) const noexcept\r
+Colour TabbedComponent::getTabBackgroundColour (const int tabIndex) const noexcept\r
 {\r
     return tabs->getTabBackgroundColour (tabIndex);\r
 }\r
 \r
-void TabbedComponent::setTabBackgroundColour (int tabIndex, Colour newColour)\r
+void TabbedComponent::setTabBackgroundColour (const int tabIndex, Colour newColour)\r
 {\r
     tabs->setTabBackgroundColour (tabIndex, newColour);\r
 \r
@@ -208,7 +208,7 @@ void TabbedComponent::setTabBackgroundColour (int tabIndex, Colour newColour)
         repaint();\r
 }\r
 \r
-void TabbedComponent::setCurrentTabIndex (int newTabIndex, bool sendChangeMessage)\r
+void TabbedComponent::setCurrentTabIndex (const int newTabIndex, const bool sendChangeMessage)\r
 {\r
     tabs->setCurrentTabIndex (newTabIndex, sendChangeMessage);\r
 }\r
@@ -223,14 +223,14 @@ String TabbedComponent::getCurrentTabName() const
     return tabs->getCurrentTabName();\r
 }\r
 \r
-void TabbedComponent::setOutline (int thickness)\r
+void TabbedComponent::setOutline (const int thickness)\r
 {\r
     outlineThickness = thickness;\r
     resized();\r
     repaint();\r
 }\r
 \r
-void TabbedComponent::setIndent (int indentThickness)\r
+void TabbedComponent::setIndent (const int indentThickness)\r
 {\r
     edgeIndent = indentThickness;\r
     resized();\r
@@ -266,19 +266,19 @@ void TabbedComponent::resized()
     tabs->setBounds (TabbedComponentHelpers::getTabArea (content, outline, getOrientation(), tabDepth));\r
     content = BorderSize<int> (edgeIndent).subtractedFrom (outline.subtractedFrom (content));\r
 \r
-    for (auto& c : contentComponents)\r
-        if (auto comp = c.get())\r
-            comp->setBounds (content);\r
+    for (int i = contentComponents.size(); --i >= 0;)\r
+        if (Component* c = contentComponents.getReference(i))\r
+            c->setBounds (content);\r
 }\r
 \r
 void TabbedComponent::lookAndFeelChanged()\r
 {\r
-    for (auto& c : contentComponents)\r
-        if (auto comp = c.get())\r
-          comp->lookAndFeelChanged();\r
+    for (int i = contentComponents.size(); --i >= 0;)\r
+        if (Component* c = contentComponents.getReference(i))\r
+            c->lookAndFeelChanged();\r
 }\r
 \r
-void TabbedComponent::changeCallback (int newCurrentTabIndex, const String& newTabName)\r
+void TabbedComponent::changeCallback (const int newCurrentTabIndex, const String& newTabName)\r
 {\r
     auto* newPanelComp = getTabContentComponent (getCurrentTabIndex());\r
 \r
index 78e6e01be6bd101f2a46d39b6d8b46c9c86c522e..383ab340377f8df919b92fb4d5dd1661fbf273d5 100644 (file)
@@ -162,7 +162,7 @@ public:
     /** Returns the current component that's filling the panel.\r
         This will return nullptr if there isn't one.\r
     */\r
-    Component* getCurrentContentComponent() const noexcept          { return panelComponent.get(); }\r
+    Component* getCurrentContentComponent() const noexcept          { return panelComponent; }\r
 \r
     //==============================================================================\r
     /** Callback method to indicate the selected tab has been changed.\r
index d43f6ede467e165e0ee620412bb98783a1ef3d13..67ee38e27d1d91bb923b7d098d3316efe08214d1 100644 (file)
@@ -66,7 +66,7 @@ void Viewport::deleteOrRemoveContentComp()
         {\r
             // This sets the content comp to a null pointer before deleting the old one, in case\r
             // anything tries to use the old one while it's in mid-deletion..\r
-            std::unique_ptr<Component> oldCompDeleter (contentComp.get());\r
+            std::unique_ptr<Component> oldCompDeleter (contentComp);\r
             contentComp = nullptr;\r
         }\r
         else\r
@@ -124,7 +124,7 @@ Point<int> Viewport::viewportPosToCompPos (Point<int> pos) const
 {\r
     jassert (contentComp != nullptr);\r
 \r
-    auto contentBounds = contentHolder.getLocalArea (contentComp.get(), contentComp->getLocalBounds());\r
+    auto contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds());\r
 \r
     Point<int> p (jmax (jmin (0, contentHolder.getWidth()  - contentBounds.getWidth()),  jmin (0, -(pos.x))),\r
                   jmax (jmin (0, contentHolder.getHeight() - contentBounds.getHeight()), jmin (0, -(pos.y))));\r
@@ -398,9 +398,8 @@ void Viewport::updateVisibleArea()
     }\r
 \r
     Rectangle<int> contentBounds;\r
-\r
-    if (auto cc = contentComp.get())\r
-        contentBounds = contentHolder.getLocalArea (cc, cc->getLocalBounds());\r
+    if (contentComp != nullptr)\r
+        contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds());\r
 \r
     auto visibleOrigin = -contentBounds.getPosition();\r
 \r
index 6c493b4aa4b78ff620c41ffa61a1b30801852a6a..7f7e7176e03d150f8d905d764aa247d055a8b533 100644 (file)
@@ -81,7 +81,7 @@ public:
 \r
         @see setViewedComponent\r
     */\r
-    Component* getViewedComponent() const noexcept                  { return contentComp.get(); }\r
+    Component* getViewedComponent() const noexcept                  { return contentComp; }\r
 \r
     //==============================================================================\r
     /** Changes the position of the viewed component.\r
@@ -322,6 +322,8 @@ private:
     bool vScrollbarRight = true, hScrollbarBottom = true;\r
 \r
     struct DragToScrollListener;\r
+    friend struct DragToScrollListener;\r
+    friend struct ContainerDeletePolicy<DragToScrollListener>;\r
     std::unique_ptr<DragToScrollListener> dragToScrollListener;\r
 \r
     Point<int> viewportPosToCompPos (Point<int>) const;\r
index 6a1e1961731f106698331cf58c9bc5d81713b729..0159d6f74707af2596e979705d9e921918841f8a 100644 (file)
@@ -32,7 +32,7 @@ static Typeface::Ptr getTypefaceForFontFromLookAndFeel (const Font& font)
     return LookAndFeel::getDefaultLookAndFeel().getTypefaceForFont (font);\r
 }\r
 \r
-using GetTypefaceForFont = Typeface::Ptr (*)(const Font&);\r
+typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&);\r
 extern GetTypefaceForFont juce_getTypefaceForFont;\r
 \r
 //==============================================================================\r
@@ -147,7 +147,7 @@ void LookAndFeel::setDefaultSansSerifTypefaceName (const String& newName)
 {\r
     if (defaultSans != newName)\r
     {\r
-        defaultTypeface.reset();\r
+        defaultTypeface = {};\r
         Typeface::clearTypefaceCache();\r
         defaultSans = newName;\r
     }\r
index c4361fc7954b5ddd2d01d0cd746fff2cadd2fcab..837bdfb11bc7b9fa7d4ff509e909dcd40effa193 100644 (file)
@@ -52,7 +52,7 @@ LookAndFeel_V1::~LookAndFeel_V1()
 \r
 //==============================================================================\r
 void LookAndFeel_V1::drawButtonBackground (Graphics& g, Button& button, const Colour& backgroundColour,\r
-                                           bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+                                           bool isMouseOverButton, bool isButtonDown)\r
 {\r
     const int width = button.getWidth();\r
     const int height = button.getHeight();\r
@@ -69,9 +69,9 @@ void LookAndFeel_V1::drawButtonBackground (Graphics& g, Button& button, const Co
 \r
     Colour bc (backgroundColour.withMultipliedSaturation (0.3f));\r
 \r
-    if (shouldDrawButtonAsHighlighted)\r
+    if (isMouseOverButton)\r
     {\r
-        if (shouldDrawButtonAsDown)\r
+        if (isButtonDown)\r
             bc = bc.brighter();\r
         else if (bc.getBrightness() > 0.5f)\r
             bc = bc.darker (0.1f);\r
@@ -82,21 +82,21 @@ void LookAndFeel_V1::drawButtonBackground (Graphics& g, Button& button, const Co
     g.setColour (bc);\r
     g.fillPath (p);\r
 \r
-    g.setColour (bc.contrasting().withAlpha ((shouldDrawButtonAsHighlighted) ? 0.6f : 0.4f));\r
-    g.strokePath (p, PathStrokeType ((shouldDrawButtonAsHighlighted) ? 2.0f : 1.4f));\r
+    g.setColour (bc.contrasting().withAlpha ((isMouseOverButton) ? 0.6f : 0.4f));\r
+    g.strokePath (p, PathStrokeType ((isMouseOverButton) ? 2.0f : 1.4f));\r
 }\r
 \r
 void LookAndFeel_V1::drawTickBox (Graphics& g, Component& /*component*/,\r
                                   float x, float y, float w, float h,\r
                                   const bool ticked,\r
                                   const bool isEnabled,\r
-                                  const bool /*shouldDrawButtonAsHighlighted*/,\r
-                                  const bool shouldDrawButtonAsDown)\r
+                                  const bool /*isMouseOverButton*/,\r
+                                  const bool isButtonDown)\r
 {\r
     Path box;\r
     box.addRoundedRectangle (0.0f, 2.0f, 6.0f, 6.0f, 1.0f);\r
 \r
-    g.setColour (isEnabled ? Colours::blue.withAlpha (shouldDrawButtonAsDown ? 0.3f : 0.1f)\r
+    g.setColour (isEnabled ? Colours::blue.withAlpha (isButtonDown ? 0.3f : 0.1f)\r
                            : Colours::lightgrey.withAlpha (0.1f));\r
 \r
     AffineTransform trans (AffineTransform::scale (w / 9.0f, h / 9.0f).translated (x, y));\r
@@ -118,7 +118,7 @@ void LookAndFeel_V1::drawTickBox (Graphics& g, Component& /*component*/,
     }\r
 }\r
 \r
-void LookAndFeel_V1::drawToggleButton (Graphics& g, ToggleButton& button, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void LookAndFeel_V1::drawToggleButton (Graphics& g, ToggleButton& button, bool isMouseOverButton, bool isButtonDown)\r
 {\r
     if (button.hasKeyboardFocus (true))\r
     {\r
@@ -132,8 +132,8 @@ void LookAndFeel_V1::drawToggleButton (Graphics& g, ToggleButton& button, bool s
                  (float) tickWidth, (float) tickWidth,\r
                  button.getToggleState(),\r
                  button.isEnabled(),\r
-                 shouldDrawButtonAsHighlighted,\r
-                 shouldDrawButtonAsDown);\r
+                 isMouseOverButton,\r
+                 isButtonDown);\r
 \r
     g.setColour (button.findColour (ToggleButton::textColourId));\r
     g.setFont (jmin (15.0f, button.getHeight() * 0.6f));\r
@@ -182,8 +182,8 @@ void LookAndFeel_V1::drawProgressBar (Graphics& g, ProgressBar& progressBar,
 void LookAndFeel_V1::drawScrollbarButton (Graphics& g, ScrollBar& bar,\r
                                           int width, int height, int buttonDirection,\r
                                           bool isScrollbarVertical,\r
-                                          bool shouldDrawButtonAsHighlighted,\r
-                                          bool shouldDrawButtonAsDown)\r
+                                          bool isMouseOverButton,\r
+                                          bool isButtonDown)\r
 {\r
     if (isScrollbarVertical)\r
         width -= 2;\r
@@ -209,9 +209,9 @@ void LookAndFeel_V1::drawScrollbarButton (Graphics& g, ScrollBar& bar,
                        width * 0.7f, height * 0.1f,\r
                        width * 0.7f, height * 0.9f);\r
 \r
-    if (shouldDrawButtonAsDown)\r
+    if (isButtonDown)\r
         g.setColour (Colours::white);\r
-    else if (shouldDrawButtonAsHighlighted)\r
+    else if (isMouseOverButton)\r
         g.setColour (Colours::white.withAlpha (0.7f));\r
     else\r
         g.setColour (bar.findColour (ScrollBar::thumbColourId).withAlpha (0.5f));\r
index cd5e5c6cda9ccaed041cd041829ef71f215df6c1..004872c7c81c78c8ef268cda106eabb9e3b02f57 100644 (file)
@@ -42,14 +42,12 @@ public:
 \r
     //==============================================================================\r
     void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
-                               bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                               bool isMouseOverButton, bool isButtonDown) override;\r
 \r
-    void drawToggleButton (Graphics&, ToggleButton&,\r
-                           bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+    void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void drawTickBox (Graphics&, Component&, float x, float y, float w, float h,\r
-                      bool ticked, bool isEnabled,\r
-                      bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                      bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void drawProgressBar (Graphics&, ProgressBar&, int width, int height,\r
                           double progress, const String& textToShow) override;\r
@@ -57,7 +55,7 @@ public:
     //==============================================================================\r
     void drawScrollbarButton (Graphics&, ScrollBar&, int width, int height,\r
                               int buttonDirection, bool isScrollbarVertical,\r
-                              bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                              bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void drawScrollbar (Graphics&, ScrollBar&, int x, int y, int width, int height,\r
                         bool isScrollbarVertical, int thumbStartPosition, int thumbSize,\r
index 7f38d0ad8f5e68d75dedae326917cb134dab7f61..d9a56af513f73fd6b4e4e0732460a26ddee7f04d 100644 (file)
@@ -31,14 +31,14 @@ namespace LookAndFeelHelpers
 {\r
     static Colour createBaseColour (Colour buttonColour,\r
                                     bool hasKeyboardFocus,\r
-                                    bool shouldDrawButtonAsHighlighted,\r
-                                    bool shouldDrawButtonAsDown) noexcept\r
+                                    bool isMouseOverButton,\r
+                                    bool isButtonDown) noexcept\r
     {\r
         const float sat = hasKeyboardFocus ? 1.3f : 0.9f;\r
         const Colour baseColour (buttonColour.withMultipliedSaturation (sat));\r
 \r
-        if (shouldDrawButtonAsDown)        return baseColour.contrasting (0.2f);\r
-        if (shouldDrawButtonAsHighlighted) return baseColour.contrasting (0.1f);\r
+        if (isButtonDown)      return baseColour.contrasting (0.2f);\r
+        if (isMouseOverButton) return baseColour.contrasting (0.1f);\r
 \r
         return baseColour;\r
     }\r
@@ -239,13 +239,13 @@ LookAndFeel_V2::~LookAndFeel_V2()  {}
 void LookAndFeel_V2::drawButtonBackground (Graphics& g,\r
                                            Button& button,\r
                                            const Colour& backgroundColour,\r
-                                           bool shouldDrawButtonAsHighlighted,\r
-                                           bool shouldDrawButtonAsDown)\r
+                                           bool isMouseOverButton,\r
+                                           bool isButtonDown)\r
 {\r
     const int width = button.getWidth();\r
     const int height = button.getHeight();\r
 \r
-    const float outlineThickness = button.isEnabled() ? ((shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted) ? 1.2f : 0.7f) : 0.4f;\r
+    const float outlineThickness = button.isEnabled() ? ((isButtonDown || isMouseOverButton) ? 1.2f : 0.7f) : 0.4f;\r
     const float halfThickness = outlineThickness * 0.5f;\r
 \r
     const float indentL = button.isConnectedOnLeft()   ? 0.1f : halfThickness;\r
@@ -255,8 +255,7 @@ void LookAndFeel_V2::drawButtonBackground (Graphics& g,
 \r
     const Colour baseColour (LookAndFeelHelpers::createBaseColour (backgroundColour,\r
                                                                    button.hasKeyboardFocus (true),\r
-                                                                   shouldDrawButtonAsHighlighted,\r
-                                                                   shouldDrawButtonAsDown)\r
+                                                                   isMouseOverButton, isButtonDown)\r
                                .withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f));\r
 \r
     drawGlassLozenge (g,\r
@@ -281,8 +280,7 @@ int LookAndFeel_V2::getTextButtonWidthToFitText (TextButton& b, int buttonHeight
     return getTextButtonFont (b, buttonHeight).getStringWidth (b.getButtonText()) + buttonHeight;\r
 }\r
 \r
-void LookAndFeel_V2::drawButtonText (Graphics& g, TextButton& button,\r
-                                     bool /*shouldDrawButtonAsHighlighted*/, bool /*shouldDrawButtonAsDown*/)\r
+void LookAndFeel_V2::drawButtonText (Graphics& g, TextButton& button, bool /*isMouseOverButton*/, bool /*isButtonDown*/)\r
 {\r
     Font font (getTextButtonFont (button, button.getHeight()));\r
     g.setFont (font);\r
@@ -308,16 +306,16 @@ void LookAndFeel_V2::drawTickBox (Graphics& g, Component& component,
                                   float x, float y, float w, float h,\r
                                   const bool ticked,\r
                                   const bool isEnabled,\r
-                                  const bool shouldDrawButtonAsHighlighted,\r
-                                  const bool shouldDrawButtonAsDown)\r
+                                  const bool isMouseOverButton,\r
+                                  const bool isButtonDown)\r
 {\r
     const float boxSize = w * 0.7f;\r
 \r
     drawGlassSphere (g, x, y + (h - boxSize) * 0.5f, boxSize,\r
                      LookAndFeelHelpers::createBaseColour (component.findColour (TextButton::buttonColourId)\r
                                                                     .withMultipliedAlpha (isEnabled ? 1.0f : 0.5f),\r
-                                                           true, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown),\r
-                     isEnabled ? ((shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted) ? 1.1f : 0.5f) : 0.3f);\r
+                                                           true, isMouseOverButton, isButtonDown),\r
+                     isEnabled ? ((isButtonDown || isMouseOverButton) ? 1.1f : 0.5f) : 0.3f);\r
 \r
     if (ticked)\r
     {\r
@@ -337,7 +335,7 @@ void LookAndFeel_V2::drawTickBox (Graphics& g, Component& component,
 }\r
 \r
 void LookAndFeel_V2::drawToggleButton (Graphics& g, ToggleButton& button,\r
-                                       bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+                                       bool isMouseOverButton, bool isButtonDown)\r
 {\r
     if (button.hasKeyboardFocus (true))\r
     {\r
@@ -352,8 +350,8 @@ void LookAndFeel_V2::drawToggleButton (Graphics& g, ToggleButton& button,
                  tickWidth, tickWidth,\r
                  button.getToggleState(),\r
                  button.isEnabled(),\r
-                 shouldDrawButtonAsHighlighted,\r
-                 shouldDrawButtonAsDown);\r
+                 isMouseOverButton,\r
+                 isButtonDown);\r
 \r
     g.setColour (button.findColour (ToggleButton::textColourId));\r
     g.setFont (fontSize);\r
@@ -379,7 +377,7 @@ void LookAndFeel_V2::changeToggleButtonWidthToFitText (ToggleButton& button)
 }\r
 \r
 void LookAndFeel_V2::drawDrawableButton (Graphics& g, DrawableButton& button,\r
-                                         bool /*shouldDrawButtonAsHighlighted*/, bool /*shouldDrawButtonAsDown*/)\r
+                                         bool /*isMouseOverButton*/, bool /*isButtonDown*/)\r
 {\r
     bool toggleState = button.getToggleState();\r
 \r
@@ -646,8 +644,8 @@ bool LookAndFeel_V2::areScrollbarButtonsVisible()
 void LookAndFeel_V2::drawScrollbarButton (Graphics& g, ScrollBar& scrollbar,\r
                                           int width, int height, int buttonDirection,\r
                                           bool /*isScrollbarVertical*/,\r
-                                          bool /*shouldDrawButtonAsHighlighted*/,\r
-                                          bool shouldDrawButtonAsDown)\r
+                                          bool /*isMouseOverButton*/,\r
+                                          bool isButtonDown)\r
 {\r
     Path p;\r
 \r
@@ -668,7 +666,7 @@ void LookAndFeel_V2::drawScrollbarButton (Graphics& g, ScrollBar& scrollbar,
                        width * 0.7f, height * 0.1f,\r
                        width * 0.7f, height * 0.9f);\r
 \r
-    if (shouldDrawButtonAsDown)\r
+    if (isButtonDown)\r
         g.setColour (scrollbar.findColour (ScrollBar::thumbColourId).contrasting (0.2f));\r
     else\r
         g.setColour (scrollbar.findColour (ScrollBar::thumbColourId));\r
@@ -1134,7 +1132,7 @@ CaretComponent* LookAndFeel_V2::createCaretComponent (Component* keyFocusOwner)
 }\r
 \r
 //==============================================================================\r
-void LookAndFeel_V2::drawComboBox (Graphics& g, int width, int height, const bool isMouseButtonDown,\r
+void LookAndFeel_V2::drawComboBox (Graphics& g, int width, int height, const bool isButtonDown,\r
                                    int buttonX, int buttonY, int buttonW, int buttonH, ComboBox& box)\r
 {\r
     g.fillAll (box.findColour (ComboBox::backgroundColourId));\r
@@ -1150,11 +1148,11 @@ void LookAndFeel_V2::drawComboBox (Graphics& g, int width, int height, const boo
         g.drawRect (0, 0, width, height);\r
     }\r
 \r
-    auto outlineThickness = box.isEnabled() ? (isMouseButtonDown ? 1.2f : 0.5f) : 0.3f;\r
+    auto outlineThickness = box.isEnabled() ? (isButtonDown ? 1.2f : 0.5f) : 0.3f;\r
 \r
     auto baseColour = LookAndFeelHelpers::createBaseColour (box.findColour (ComboBox::buttonColourId),\r
                                                             box.hasKeyboardFocus (true),\r
-                                                            false, isMouseButtonDown)\r
+                                                            false, isButtonDown)\r
                          .withMultipliedAlpha (box.isEnabled() ? 1.0f : 0.5f);\r
 \r
     drawGlassLozenge (g,\r
@@ -1201,30 +1199,6 @@ void LookAndFeel_V2::positionComboBoxText (ComboBox& box, Label& label)
     label.setFont (getComboBoxFont (box));\r
 }\r
 \r
-PopupMenu::Options LookAndFeel_V2::getOptionsForComboBoxPopupMenu (ComboBox& box, Label& label)\r
-{\r
-    return PopupMenu::Options().withTargetComponent (&box)\r
-                               .withItemThatMustBeVisible (box.getSelectedId())\r
-                               .withMinimumWidth (box.getWidth())\r
-                               .withMaximumNumColumns (1)\r
-                               .withStandardItemHeight (label.getHeight());\r
-}\r
-\r
-void LookAndFeel_V2::drawComboBoxTextWhenNothingSelected (Graphics& g, ComboBox& box, Label& label)\r
-{\r
-    g.setColour (findColour (ComboBox::textColourId).withMultipliedAlpha (0.5f));\r
-\r
-    auto font = label.getLookAndFeel().getLabelFont (label);\r
-\r
-    g.setFont (font);\r
-\r
-    auto textArea = getLabelBorderSize (label).subtractedFrom (label.getLocalBounds());\r
-\r
-    g.drawFittedText (box.getTextWhenNothingSelected(), textArea, label.getJustificationType(),\r
-                      jmax (1, (int) (textArea.getHeight() / font.getHeight())),\r
-                      label.getMinimumHorizontalScale());\r
-}\r
-\r
 //==============================================================================\r
 Font LookAndFeel_V2::getLabelFont (Label& label)\r
 {\r
@@ -1243,7 +1217,7 @@ void LookAndFeel_V2::drawLabel (Graphics& g, Label& label)
         g.setColour (label.findColour (Label::textColourId).withMultipliedAlpha (alpha));\r
         g.setFont (font);\r
 \r
-        auto textArea = getLabelBorderSize (label).subtractedFrom (label.getLocalBounds());\r
+        Rectangle<int> textArea (label.getBorderSize().subtractedFrom (label.getLocalBounds()));\r
 \r
         g.drawFittedText (label.getText(), textArea, label.getJustificationType(),\r
                           jmax (1, (int) (textArea.getHeight() / font.getHeight())),\r
@@ -1259,11 +1233,6 @@ void LookAndFeel_V2::drawLabel (Graphics& g, Label& label)
     g.drawRect (label.getLocalBounds());\r
 }\r
 \r
-BorderSize<int> LookAndFeel_V2::getLabelBorderSize (Label& label)\r
-{\r
-    return label.getBorderSize();\r
-}\r
-\r
 //==============================================================================\r
 void LookAndFeel_V2::drawLinearSliderBackground (Graphics& g, int x, int y, int width, int height,\r
                                                  float /*sliderPos*/,\r
@@ -1825,9 +1794,9 @@ public:
     }\r
 \r
     //==============================================================================\r
-    void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+    void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
     {\r
-        float alpha = shouldDrawButtonAsHighlighted ? (shouldDrawButtonAsDown ? 1.0f : 0.8f) : 0.55f;\r
+        float alpha = isMouseOverButton ? (isButtonDown ? 1.0f : 0.8f) : 0.55f;\r
 \r
         if (! isEnabled())\r
             alpha *= 0.5f;\r
@@ -2655,7 +2624,7 @@ void LookAndFeel_V2::layoutFileBrowserComponent (FileBrowserComponent& browserCo
 //==============================================================================\r
 static Drawable* createDrawableFromSVG (const char* data)\r
 {\r
-    auto xml = parseXML (data);\r
+    std::unique_ptr<XmlElement> xml (XmlDocument::parse (data));\r
     jassert (xml != nullptr);\r
     return Drawable::createFromSVG (*xml);\r
 }\r
index 5b01782e0ae8de037464f47f462786c32aa3124d..7bc3c25a5a8288661924599fc320f5ab28c4b122 100644 (file)
@@ -43,25 +43,21 @@ public:
 \r
     //==============================================================================\r
     void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
-                               bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                               bool isMouseOverButton, bool isButtonDown) override;\r
     Font getTextButtonFont (TextButton&, int buttonHeight) override;\r
 \r
-    void drawButtonText (Graphics&, TextButton&,\r
-                         bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+    void drawButtonText (Graphics&, TextButton&, bool isMouseOverButton, bool isButtonDown) override;\r
     int getTextButtonWidthToFitText (TextButton&, int buttonHeight) override;\r
 \r
-    void drawToggleButton (Graphics&, ToggleButton&,\r
-                           bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+    void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void changeToggleButtonWidthToFitText (ToggleButton&) override;\r
 \r
     void drawTickBox (Graphics&, Component&,\r
                       float x, float y, float w, float h,\r
-                      bool ticked, bool isEnabled,\r
-                      bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                      bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
-    void drawDrawableButton (Graphics&, DrawableButton&,\r
-                             bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+    void drawDrawableButton (Graphics&, DrawableButton&, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     //==============================================================================\r
     AlertWindow* createAlertWindow (const String& title, const String& message,\r
@@ -102,7 +98,7 @@ public:
     //==============================================================================\r
     bool areScrollbarButtonsVisible() override;\r
     void drawScrollbarButton (Graphics&, ScrollBar&, int width, int height, int buttonDirection,\r
-                              bool isScrollbarVertical, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                              bool isScrollbarVertical, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void drawScrollbar (Graphics&, ScrollBar&, int x, int y, int width, int height,\r
                         bool isScrollbarVertical, int thumbStartPosition, int thumbSize,\r
@@ -191,19 +187,16 @@ public:
     int getPopupMenuBorderSize() override;\r
 \r
     //==============================================================================\r
-    void drawComboBox (Graphics&, int width, int height, bool isMouseButtonDown,\r
+    void drawComboBox (Graphics&, int width, int height, bool isButtonDown,\r
                        int buttonX, int buttonY, int buttonW, int buttonH,\r
                        ComboBox&) override;\r
     Font getComboBoxFont (ComboBox&) override;\r
     Label* createComboBoxTextBox (ComboBox&) override;\r
     void positionComboBoxText (ComboBox&, Label&) override;\r
-    PopupMenu::Options getOptionsForComboBoxPopupMenu (ComboBox&, Label&) override;\r
-    void drawComboBoxTextWhenNothingSelected (Graphics&, ComboBox&, Label&) override;\r
 \r
     //==============================================================================\r
     void drawLabel (Graphics&, Label&) override;\r
     Font getLabelFont (Label&) override;\r
-    BorderSize<int> getLabelBorderSize (Label&) override;\r
 \r
     //==============================================================================\r
     void drawLinearSlider (Graphics&, int x, int y, int width, int height,\r
index 5eeacf7791e51d55cfd7be8b6e27de7828ec8e9a..df7feb784d8a55a2c6a3b26b78dbd84465701849 100644 (file)
@@ -125,13 +125,13 @@ static void drawButtonShape (Graphics& g, const Path& outline, Colour baseColour
 }\r
 \r
 void LookAndFeel_V3::drawButtonBackground (Graphics& g, Button& button, const Colour& backgroundColour,\r
-                                           bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+                                           bool isMouseOverButton, bool isButtonDown)\r
 {\r
     Colour baseColour (backgroundColour.withMultipliedSaturation (button.hasKeyboardFocus (true) ? 1.3f : 0.9f)\r
                                        .withMultipliedAlpha (button.isEnabled() ? 0.9f : 0.5f));\r
 \r
-    if (shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted)\r
-        baseColour = baseColour.contrasting (shouldDrawButtonAsDown ? 0.2f : 0.1f);\r
+    if (isButtonDown || isMouseOverButton)\r
+        baseColour = baseColour.contrasting (isButtonDown ? 0.2f : 0.1f);\r
 \r
     const bool flatOnLeft   = button.isConnectedOnLeft();\r
     const bool flatOnRight  = button.isConnectedOnRight();\r
@@ -158,7 +158,7 @@ void LookAndFeel_V3::drawButtonBackground (Graphics& g, Button& button, const Co
 \r
 void LookAndFeel_V3::drawTableHeaderBackground (Graphics& g, TableHeaderComponent& header)\r
 {\r
-    auto r = header.getLocalBounds();\r
+    Rectangle<int> r (header.getLocalBounds());\r
     auto outlineColour = header.findColour (TableHeaderComponent::outlineColourId);\r
 \r
     g.setColour (outlineColour);\r
@@ -353,7 +353,7 @@ int LookAndFeel_V3::getTreeViewIndentSize (TreeView&)
     return 20;\r
 }\r
 \r
-void LookAndFeel_V3::drawComboBox (Graphics& g, int width, int height, const bool /*isMouseButtonDown*/,\r
+void LookAndFeel_V3::drawComboBox (Graphics& g, int width, int height, const bool /*isButtonDown*/,\r
                                    int buttonX, int buttonY, int buttonW, int buttonH, ComboBox& box)\r
 {\r
     g.fillAll (box.findColour (ComboBox::backgroundColourId));\r
@@ -536,7 +536,7 @@ public:
     {\r
     }\r
 \r
-    void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+    void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
     {\r
         Colour background (Colours::grey);\r
 \r
@@ -544,7 +544,7 @@ public:
             background = rw->getBackgroundColour();\r
 \r
         const float cx = getWidth() * 0.5f, cy = getHeight() * 0.5f;\r
-        const float diam = jmin (cx, cy) * (shouldDrawButtonAsDown ? 0.60f : 0.65f);\r
+        const float diam = jmin (cx, cy) * (isButtonDown ? 0.60f : 0.65f);\r
 \r
         g.setColour (background);\r
         g.fillEllipse (cx - diam, cy - diam, diam * 2.0f, diam * 2.0f);\r
@@ -553,7 +553,7 @@ public:
 \r
         if (! isEnabled())\r
             c = c.withAlpha (0.6f);\r
-        else if (shouldDrawButtonAsHighlighted)\r
+        else if (isMouseOverButton)\r
             c = c.brighter();\r
 \r
         g.setColour (c);\r
index 3378ff3fab491bbc8b3f282955b20192d66cae1b..6d48a798f3241e73ecefdb9e8270f4e2a31a61ac 100644 (file)
@@ -42,7 +42,7 @@ public:
 \r
     //==============================================================================\r
     void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
-                               bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                               bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void drawTableHeaderBackground (Graphics&, TableHeaderComponent&) override;\r
 \r
index d6971ed5e727f92a26bc1e2cda707174194034e6..c00ca1b18aa3365508de2d9cb78b22e013b4eb63 100644 (file)
@@ -115,7 +115,7 @@ public:
     {\r
     }\r
 \r
-    void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+    void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
     {\r
         auto background = Colours::grey;\r
 \r
@@ -125,10 +125,10 @@ public:
 \r
         g.fillAll (background);\r
 \r
-        g.setColour ((! isEnabled() || shouldDrawButtonAsDown) ? colour.withAlpha (0.6f)\r
+        g.setColour ((! isEnabled() || isButtonDown) ? colour.withAlpha (0.6f)\r
                                                      : colour);\r
 \r
-        if (shouldDrawButtonAsHighlighted)\r
+        if (isMouseOverButton)\r
         {\r
             g.fillAll();\r
             g.setColour (background);\r
@@ -284,8 +284,8 @@ Font LookAndFeel_V4::getTextButtonFont (TextButton&, int buttonHeight)
 void LookAndFeel_V4::drawButtonBackground (Graphics& g,\r
                                            Button& button,\r
                                            const Colour& backgroundColour,\r
-                                           bool shouldDrawButtonAsHighlighted,\r
-                                           bool shouldDrawButtonAsDown)\r
+                                           bool isMouseOverButton,\r
+                                           bool isButtonDown)\r
 {\r
     auto cornerSize = 6.0f;\r
     auto bounds = button.getLocalBounds().toFloat().reduced (0.5f, 0.5f);\r
@@ -293,8 +293,8 @@ void LookAndFeel_V4::drawButtonBackground (Graphics& g,
     auto baseColour = backgroundColour.withMultipliedSaturation (button.hasKeyboardFocus (true) ? 1.3f : 0.9f)\r
                                       .withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f);\r
 \r
-    if (shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted)\r
-        baseColour = baseColour.contrasting (shouldDrawButtonAsDown ? 0.2f : 0.05f);\r
+    if (isButtonDown || isMouseOverButton)\r
+        baseColour = baseColour.contrasting (isButtonDown ? 0.2f : 0.05f);\r
 \r
     g.setColour (baseColour);\r
 \r
@@ -324,7 +324,7 @@ void LookAndFeel_V4::drawButtonBackground (Graphics& g,
 }\r
 \r
 void LookAndFeel_V4::drawToggleButton (Graphics& g, ToggleButton& button,\r
-                                       bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+                                       bool isMouseOverButton, bool isButtonDown)\r
 {\r
     auto fontSize = jmin (15.0f, button.getHeight() * 0.75f);\r
     auto tickWidth = fontSize * 1.1f;\r
@@ -333,8 +333,8 @@ void LookAndFeel_V4::drawToggleButton (Graphics& g, ToggleButton& button,
                  tickWidth, tickWidth,\r
                  button.getToggleState(),\r
                  button.isEnabled(),\r
-                 shouldDrawButtonAsHighlighted,\r
-                 shouldDrawButtonAsDown);\r
+                 isMouseOverButton,\r
+                 isButtonDown);\r
 \r
     g.setColour (button.findColour (ToggleButton::textColourId));\r
     g.setFont (fontSize);\r
@@ -352,10 +352,10 @@ void LookAndFeel_V4::drawTickBox (Graphics& g, Component& component,
                                   float x, float y, float w, float h,\r
                                   const bool ticked,\r
                                   const bool isEnabled,\r
-                                  const bool shouldDrawButtonAsHighlighted,\r
-                                  const bool shouldDrawButtonAsDown)\r
+                                  const bool isMouseOverButton,\r
+                                  const bool isButtonDown)\r
 {\r
-    ignoreUnused (isEnabled, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+    ignoreUnused (isEnabled, isMouseOverButton, isButtonDown);\r
 \r
     Rectangle<float> tickBounds (x, y, w, h);\r
 \r
@@ -1152,6 +1152,8 @@ void LookAndFeel_V4::drawConcertinaPanelHeader (Graphics& g, const Rectangle<int
     p.addRoundedRectangle (bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(),\r
                            cornerSize, cornerSize, isTopPanel, isTopPanel, false, false);\r
 \r
+    auto bkg = Colours::grey;\r
+\r
     g.setGradientFill (ColourGradient::vertical (Colours::white.withAlpha (isMouseOver ? 0.4f : 0.2f), static_cast<float> (area.getY()),\r
                                                  Colours::darkgrey.withAlpha (0.1f), static_cast<float> (area.getBottom())));\r
     g.fillPath (p);\r
index db4726a3810e41405112d3b53adb5917c2635b3c..e83990dbb863e949e644151119f110237440d3b4 100644 (file)
@@ -115,14 +115,12 @@ public:
     Font getTextButtonFont (TextButton&, int buttonHeight) override;\r
 \r
     void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
-                               bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                               bool isMouseOverButton, bool isButtonDown) override;\r
 \r
-    void drawToggleButton (Graphics&, ToggleButton&,\r
-                           bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+    void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) override;\r
     void drawTickBox (Graphics&, Component&,\r
                       float x, float y, float w, float h,\r
-                      bool ticked, bool isEnabled,\r
-                      bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+                      bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override;\r
 \r
     void changeToggleButtonWidthToFitText (ToggleButton&) override;\r
 \r
index bf301dbd7b07b3e51fe0bc7a66fcd6c44c3a784c..8a3e5cacc2bb39f2595ac35e4136f17fd60b1143 100644 (file)
@@ -43,10 +43,10 @@ struct CustomMenuBarItemHolder    : public Component
         if (newComponent != custom)\r
         {\r
             if (custom != nullptr)\r
-                removeChildComponent (custom.get());\r
+                removeChildComponent (custom);\r
 \r
             custom = newComponent;\r
-            addAndMakeVisible (*custom);\r
+            addAndMakeVisible (custom);\r
             resized();\r
         }\r
     }\r
index e72722479b9b88a865eab3bb9bcb050fd59a93e3..0c599e43f8293f9f1d0635a622d634d780a44aac 100644 (file)
@@ -43,7 +43,7 @@ void MenuBarModel::menuItemsChanged()
     triggerAsyncUpdate();\r
 }\r
 \r
-void MenuBarModel::setApplicationCommandManagerToWatch (ApplicationCommandManager* newManager)\r
+void MenuBarModel::setApplicationCommandManagerToWatch (ApplicationCommandManager* const newManager) noexcept\r
 {\r
     if (manager != newManager)\r
     {\r
@@ -57,12 +57,12 @@ void MenuBarModel::setApplicationCommandManagerToWatch (ApplicationCommandManage
     }\r
 }\r
 \r
-void MenuBarModel::addListener (Listener* newListener)\r
+void MenuBarModel::addListener (Listener* const newListener) noexcept\r
 {\r
     listeners.add (newListener);\r
 }\r
 \r
-void MenuBarModel::removeListener (Listener* listenerToRemove)\r
+void MenuBarModel::removeListener (Listener* const listenerToRemove) noexcept\r
 {\r
     // Trying to remove a listener that isn't on the list!\r
     // If this assertion happens because this object is a dangling pointer, make sure you've not\r
index 245836d2a3ed622d1cd4d2e9b2b8a453061f080e..792337d1f0d6dc5916aae909b94dae681a31897e 100644 (file)
@@ -69,7 +69,7 @@ public:
         This will also allow it to flash a menu name when a command from that menu\r
         is invoked using a keystroke.\r
     */\r
-    void setApplicationCommandManagerToWatch (ApplicationCommandManager* manager);\r
+    void setApplicationCommandManagerToWatch (ApplicationCommandManager* manager) noexcept;\r
 \r
     //==============================================================================\r
     /** A class to receive callbacks when a MenuBarModel changes.\r
@@ -104,12 +104,12 @@ public:
 \r
         @see removeListener\r
     */\r
-    void addListener (Listener* listenerToAdd);\r
+    void addListener (Listener* listenerToAdd) noexcept;\r
 \r
     /** Removes a listener.\r
         @see addListener\r
     */\r
-    void removeListener (Listener* listenerToRemove);\r
+    void removeListener (Listener* listenerToRemove) noexcept;\r
 \r
     //==============================================================================\r
     /** This method must return a list of the names of the menus. */\r
index b43a3790beefc58a88fa3b136afd31f9ff532809..7acacad3e329a038855cd26b21ddbbefded4ac0e 100644 (file)
@@ -40,7 +40,7 @@ struct PopupMenu::HelperClasses
 {\r
 \r
 class MouseSourceState;\r
-struct MenuWindow;\r
+class MenuWindow;\r
 \r
 static bool canBeTriggered (const PopupMenu::Item& item) noexcept        { return item.isEnabled && item.itemID != 0 && ! item.isSectionHeader; }\r
 static bool hasActiveSubMenu (const PopupMenu::Item& item) noexcept      { return item.isEnabled && item.subMenu != nullptr && item.subMenu->items.size() > 0; }\r
@@ -77,10 +77,9 @@ struct ItemComponent  : public Component
       : item (i), customComp (i.customComponent)\r
     {\r
         if (item.isSectionHeader)\r
-            customComp = *new HeaderItemComponent (item.text);\r
+            customComp = new HeaderItemComponent (item.text);\r
 \r
-        if (customComp != nullptr)\r
-            addAndMakeVisible (*customComp);\r
+        addAndMakeVisible (customComp);\r
 \r
         parent.addAndMakeVisible (this);\r
 \r
@@ -96,7 +95,7 @@ struct ItemComponent  : public Component
 \r
     ~ItemComponent()\r
     {\r
-        removeChildComponent (customComp.get());\r
+        removeChildComponent (customComp);\r
     }\r
 \r
     void getIdealSize (int& idealWidth, int& idealHeight, const int standardItemHeight)\r
@@ -189,8 +188,9 @@ private:
 };\r
 \r
 //==============================================================================\r
-struct MenuWindow  : public Component\r
+class MenuWindow  : public Component\r
 {\r
+public:\r
     MenuWindow (const PopupMenu& menu, MenuWindow* parentWindow,\r
                 const Options& opts, bool alignToRectangle, bool shouldDismissOnMouseUp,\r
                 ApplicationCommandManager** manager, float parentScaleFactor = 1.0f)\r
@@ -211,10 +211,10 @@ struct MenuWindow  : public Component
 \r
         setLookAndFeel (parent != nullptr ? &(parent->getLookAndFeel())\r
                                           : menu.lookAndFeel.get());\r
+\r
         auto& lf = getLookAndFeel();\r
 \r
         parentComponent = lf.getParentComponentForMenuOptions (options);\r
-        const_cast<Options&>(options) = options.withParentComponent (parentComponent);\r
 \r
         if (parentComponent == nullptr && parentWindow == nullptr && lf.shouldPopupMenuScaleWithTargetComponent (options))\r
             if (auto* targetComponent = options.getTargetComponent())\r
@@ -592,12 +592,9 @@ struct MenuWindow  : public Component
     }\r
 \r
     //==============================================================================\r
-    Rectangle<int> getParentArea (Point<int> targetPoint, Component* relativeTo = nullptr)\r
+    Rectangle<int> getParentArea (Point<int> targetPoint)\r
     {\r
-        if (relativeTo != nullptr)\r
-            targetPoint = relativeTo->localPointToGlobal (targetPoint);\r
-\r
-        auto parentArea = Desktop::getInstance().getDisplays().findDisplayForPoint (targetPoint)\r
+        auto parentArea = Desktop::getInstance().getDisplays().getDisplayContaining (targetPoint)\r
                               #if JUCE_MAC\r
                                .userArea;\r
                               #else\r
@@ -792,7 +789,7 @@ struct MenuWindow  : public Component
                                                     windowPos.getHeight() - (PopupMenuSettings::scrollZone + m->getHeight())),\r
                                               currentY);\r
 \r
-                        auto parentArea = getParentArea (windowPos.getPosition(), parentComponent) / scaleFactor;\r
+                        auto parentArea = getParentArea (windowPos.getPosition()) / scaleFactor;\r
                         auto deltaY = wantedY - currentY;\r
 \r
                         windowPos.setSize (jmin (windowPos.getWidth(), parentArea.getWidth()),\r
@@ -912,8 +909,7 @@ struct MenuWindow  : public Component
             activeSubMenu.reset (new HelperClasses::MenuWindow (*(childComp->item.subMenu), this,\r
                                                                 options.withTargetScreenArea (childComp->getScreenBounds())\r
                                                                        .withMinimumWidth (0)\r
-                                                                       .withTargetComponent (nullptr)\r
-                                                                       .withParentComponent (parentComponent),\r
+                                                                       .withTargetComponent (nullptr),\r
                                                                 false, dismissOnMouseUp, managerOfChosenCommand, scaleFactor));\r
 \r
             activeSubMenu->setVisible (true); // (must be called before enterModalState on Windows to avoid DropShadower confusion)\r
@@ -1089,7 +1085,7 @@ private:
             {\r
                 PopupMenuSettings::menuWasHiddenBecauseOfAppChange = true;\r
                 window.dismissMenu (nullptr);\r
-                // Note: This object may have been deleted by the previous call.\r
+                // Note: this object may have been deleted by the previous call..\r
             }\r
         }\r
         else if (wasDown && timeNow > window.windowCreationTime + 250\r
@@ -1100,7 +1096,7 @@ private:
             else if ((window.hasBeenOver || ! window.dismissOnMouseUp) && ! isOverAny)\r
                 window.dismissMenu (nullptr);\r
 \r
-            // Note: This object may have been deleted by the previous call.\r
+            // Note: this object may have been deleted by the previous call..\r
         }\r
         else\r
         {\r
@@ -1742,13 +1738,8 @@ bool JUCE_CALLTYPE PopupMenu::dismissAllActiveMenus()
     auto numWindows = windows.size();\r
 \r
     for (int i = numWindows; --i >= 0;)\r
-    {\r
         if (auto* pmw = windows[i])\r
-        {\r
-            pmw->setLookAndFeel (nullptr);\r
             pmw->dismissMenu (nullptr);\r
-        }\r
-    }\r
 \r
     return numWindows > 0;\r
 }\r
@@ -1862,9 +1853,7 @@ bool PopupMenu::MenuItemIterator::next()
         menus.add (currentItem->subMenu.get());\r
     }\r
     else\r
-    {\r
         index.setUnchecked (index.size() - 1, index.getLast() + 1);\r
-    }\r
 \r
     while (index.size() > 0 && index.getLast() >= menus.getLast()->items.size())\r
     {\r
index 833e35463a2980a54dbc0a57c81b7d3fd440a645..13ce260eb66ba39e5fc331f7cf4544b04162cdfd 100644 (file)
@@ -64,7 +64,7 @@ void BubbleComponent::setPosition (Component* componentToPointTo, int distanceFr
     if (Component* p = getParentComponent())\r
         target = p->getLocalArea (componentToPointTo, componentToPointTo->getLocalBounds());\r
     else\r
-        target = componentToPointTo->getScreenBounds().transformedBy (getTransform().inverted());\r
+        target = componentToPointTo->getScreenBounds();\r
 \r
     setPosition (target, distanceFromTarget, arrowLength);\r
 }\r
@@ -86,8 +86,8 @@ void BubbleComponent::setPosition (Rectangle<int> rectangleToPointTo,
     const int totalW = content.getWidth()  + distanceFromTarget * 2;\r
     const int totalH = content.getHeight() + distanceFromTarget * 2;\r
 \r
-    auto availableSpace = (getParentComponent() != nullptr ? getParentComponent()->getLocalBounds()\r
-                                                           : getParentMonitorArea().transformedBy (getTransform().inverted()));\r
+    const Rectangle<int> availableSpace (getParentComponent() != nullptr ? getParentComponent()->getLocalBounds()\r
+                                                                         : getParentMonitorArea());\r
 \r
     int spaceAbove = ((allowablePlacements & above) != 0) ? jmax (0, rectangleToPointTo.getY()  - availableSpace.getY()) : -1;\r
     int spaceBelow = ((allowablePlacements & below) != 0) ? jmax (0, availableSpace.getBottom() - rectangleToPointTo.getBottom()) : -1;\r
index b28a73bc85a88283b4fc41c149a88ab8c8045d27..3bffb8ef458910198c43299ca79a308d61a318bd 100644 (file)
@@ -294,8 +294,7 @@ std::unique_ptr<Drawable> JUCESplashScreen::getSplashScreenLogo()
     </svg>\r
     )JUCESPLASHSCREEN";\r
 \r
-    auto svgXml = parseXML (svgData);\r
-    jassert (svgXml != nullptr);\r
+    std::unique_ptr<XmlElement> svgXml (XmlDocument::parse (svgData));\r
     return std::unique_ptr<Drawable> (Drawable::createFromSVG (*svgXml));\r
 }\r
 \r
index 8814b327839051ced0f17172e300c560c73abbeb..5f01eb8c983bedcb275a80312c759b3866b72c8e 100644 (file)
@@ -48,7 +48,7 @@ void ComponentDragger::dragComponent (Component* const componentToDrag, const Mo
 \r
     if (componentToDrag != nullptr)\r
     {\r
-        auto bounds = componentToDrag->getBounds();\r
+        Rectangle<int> bounds (componentToDrag->getBounds());\r
 \r
         // If the component is a window, multiple mouse events can get queued while it's in the same position,\r
         // so their coordinates become wrong after the first one moves the window, so in that case, we'll use\r
index ea55467214695b69663d351023fdaddfeba38f6f..5bff2bb74fc08f4222c03bae4b4f982eb20b68f4 100644 (file)
@@ -249,16 +249,10 @@ private:
 \r
         for (auto i = desktop.getNumComponents(); --i >= 0;)\r
         {\r
-            auto* desktopComponent = desktop.getComponent (i);\r
-            auto dPoint = desktopComponent->getLocalPoint (nullptr, screenPos);\r
+            auto* c = desktop.getComponent(i);\r
 \r
-            if (auto* c = desktopComponent->getComponentAt (dPoint))\r
-            {\r
-                auto cPoint = c->getLocalPoint (desktopComponent, dPoint);\r
-\r
-                if (c->hitTest (cPoint.getX(), cPoint.getY()))\r
-                    return c;\r
-            }\r
+            if (auto* hit = c->getComponentAt (c->getLocalPoint (nullptr, screenPos)))\r
+                return hit;\r
         }\r
 \r
         return nullptr;\r
index 94b7b29f6a8de4ccd4cf2eaeb03c3aa50aaaea2c..631f878e9184053501bcfef9660bc1109f4a141d 100644 (file)
@@ -153,46 +153,42 @@ public:
 \r
 \r
     //==============================================================================\r
-    /** This performs an asynchronous drag-and-drop of a set of files to some external\r
+    /** This performs a synchronous drag-and-drop of a set of files to some external\r
         application.\r
 \r
         You can call this function in response to a mouseDrag callback, and it will\r
-        use a native operating system drag-and-drop operation to move or copy some\r
+        block, running its own internal message loop and tracking the mouse, while it\r
+        uses a native operating system drag-and-drop operation to move or copy some\r
         files to another application.\r
 \r
         @param files            a list of filenames to drag\r
         @param canMoveFiles     if true, the app that receives the files is allowed to move the files to a new location\r
                                 (if this is appropriate). If false, the receiver is expected to make a copy of them.\r
-        @param sourceComponent  normally, JUCE will assume that the component under the mouse is the source component\r
+        @param sourceComponent  Normally, JUCE will assume that the component under the mouse is the source component\r
                                 of the drag, but you can use this parameter to override this.\r
-        @param callback         an optional completion callback that will be called when the operation has ended.\r
-\r
-        @returns                true if the drag operation was successfully started, or false if it failed for some reason\r
-\r
+        @returns                true if the files were successfully dropped somewhere, or false if it\r
+                                was interrupted\r
         @see performExternalDragDropOfText\r
     */\r
     static bool performExternalDragDropOfFiles (const StringArray& files, bool canMoveFiles,\r
-                                                Component* sourceComponent = nullptr,\r
-                                                std::function<void()> callback = nullptr);\r
+                                                Component* sourceComponent = nullptr);\r
 \r
-    /** This performs an asynchronous drag-and-drop of a block of text to some external\r
+    /** This performs a synchronous drag-and-drop of a block of text to some external\r
         application.\r
 \r
         You can call this function in response to a mouseDrag callback, and it will\r
-        use a native operating system drag-and-drop operation to move or copy some\r
+        block, running its own internal message loop and tracking the mouse, while it\r
+        uses a native operating system drag-and-drop operation to move or copy some\r
         text to another application.\r
 \r
         @param text             the text to copy\r
         @param sourceComponent  Normally, JUCE will assume that the component under the mouse is the source component\r
                                 of the drag, but you can use this parameter to override this.\r
-        @param callback         an optional completion callback that will be called when the operation has ended.\r
-\r
-        @returns                true if the drag operation was successfully started, or false if it failed for some reason\r
-\r
+        @returns                true if the text was successfully dropped somewhere, or false if it\r
+                                was interrupted\r
         @see performExternalDragDropOfFiles\r
     */\r
-    static bool performExternalDragDropOfText (const String& text, Component* sourceComponent = nullptr,\r
-                                               std::function<void()> callback = nullptr);\r
+    static bool performExternalDragDropOfText (const String& text, Component* sourceComponent = nullptr);\r
 \r
 protected:\r
     /** Override this if you want to be able to perform an external drag of a set of files\r
@@ -234,6 +230,8 @@ protected:
 private:\r
     //==============================================================================\r
     class DragImageComponent;\r
+    friend class DragImageComponent;\r
+    friend struct ContainerDeletePolicy<DragImageComponent>;\r
     OwnedArray<DragImageComponent> dragImageComponents;\r
 \r
     const MouseInputSource* getMouseInputSourceForDrag (Component* sourceComponent, const MouseInputSource* inputSourceCausingDrag);\r
index 2b7712a7f45abeaa5e9eeeb7157a045ac3767d3b..11d72dbc3ae62dd7d82314fb7542c267a06efdd7 100644 (file)
@@ -50,7 +50,9 @@ public:
     virtual ~DragAndDropTarget()  {}\r
 \r
     //==============================================================================\r
-    /** Contains details about the source of a drag-and-drop operation. */\r
+    /** Contains details about the source of a drag-and-drop operation.\r
+        The contents of this\r
+    */\r
     class JUCE_API  SourceDetails\r
     {\r
     public:\r
index 2010699bbfd6a12908a27b265849aa02d90bff04..f904a398368f02a8e7301c25a83bde5d9e02d99d 100644 (file)
@@ -171,10 +171,11 @@ private:
     SharedCursorHandle* cursorHandle = nullptr;\r
 \r
     friend class MouseInputSourceInternal;\r
-    void showInWindow (ComponentPeer*) const;\r
+    void showInWindow (ComponentPeer* window) const;\r
+    void showInAllWindows() const;\r
     void* getHandle() const noexcept;\r
 \r
-    static void* createStandardMouseCursor (MouseCursor::StandardCursorType);\r
+    static void* createStandardMouseCursor (MouseCursor::StandardCursorType type);\r
     static void deleteMouseCursor (void* cursorHandle, bool isStandard);\r
 \r
     JUCE_LEAK_DETECTOR (MouseCursor)\r
index 79abd5361e28c14bd75350d06d4954e03a09ae00..7fac55204cdb29a5d8bbbff94440c75f3973dbbe 100644 (file)
@@ -47,12 +47,12 @@ MouseEvent::MouseEvent (MouseInputSource inputSource,
       pressure (force),\r
       orientation (o), rotation (r),\r
       tiltX (tX), tiltY (tY),\r
-      mouseDownPosition (downPos),\r
       eventComponent (eventComp),\r
       originalComponent (originator),\r
       eventTime (time),\r
       mouseDownTime (downTime),\r
       source (inputSource),\r
+      mouseDownPos (downPos),\r
       numberOfClicks ((uint8) numClicks),\r
       wasMovedSinceMouseDown ((uint8) (mouseWasDragged ? 1 : 0))\r
 {\r
@@ -70,21 +70,21 @@ MouseEvent MouseEvent::getEventRelativeTo (Component* const otherComponent) cons
     return MouseEvent (source, otherComponent->getLocalPoint (eventComponent, position),\r
                        mods, pressure, orientation, rotation, tiltX, tiltY,\r
                        otherComponent, originalComponent, eventTime,\r
-                       otherComponent->getLocalPoint (eventComponent, mouseDownPosition),\r
+                       otherComponent->getLocalPoint (eventComponent, mouseDownPos),\r
                        mouseDownTime, numberOfClicks, wasMovedSinceMouseDown != 0);\r
 }\r
 \r
 MouseEvent MouseEvent::withNewPosition (Point<float> newPosition) const noexcept\r
 {\r
     return MouseEvent (source, newPosition, mods, pressure, orientation, rotation, tiltX, tiltY,\r
-                       eventComponent, originalComponent, eventTime, mouseDownPosition, mouseDownTime,\r
+                       eventComponent, originalComponent, eventTime, mouseDownPos, mouseDownTime,\r
                        numberOfClicks, wasMovedSinceMouseDown != 0);\r
 }\r
 \r
 MouseEvent MouseEvent::withNewPosition (Point<int> newPosition) const noexcept\r
 {\r
     return MouseEvent (source, newPosition.toFloat(), mods, pressure, orientation, rotation,\r
-                       tiltX, tiltY, eventComponent,  originalComponent, eventTime, mouseDownPosition,\r
+                       tiltX, tiltY, eventComponent,  originalComponent, eventTime, mouseDownPos,\r
                        mouseDownTime, numberOfClicks, wasMovedSinceMouseDown != 0);\r
 }\r
 \r
@@ -111,14 +111,14 @@ int MouseEvent::getLengthOfMousePress() const noexcept
 Point<int> MouseEvent::getPosition() const noexcept             { return Point<int> (x, y); }\r
 Point<int> MouseEvent::getScreenPosition() const                { return eventComponent->localPointToGlobal (getPosition()); }\r
 \r
-Point<int> MouseEvent::getMouseDownPosition() const noexcept    { return mouseDownPosition.roundToInt(); }\r
-Point<int> MouseEvent::getMouseDownScreenPosition() const       { return eventComponent->localPointToGlobal (mouseDownPosition).roundToInt(); }\r
+Point<int> MouseEvent::getMouseDownPosition() const noexcept    { return mouseDownPos.roundToInt(); }\r
+Point<int> MouseEvent::getMouseDownScreenPosition() const       { return eventComponent->localPointToGlobal (mouseDownPos).roundToInt(); }\r
 \r
-Point<int> MouseEvent::getOffsetFromDragStart() const noexcept  { return (position - mouseDownPosition).roundToInt(); }\r
-int MouseEvent::getDistanceFromDragStart() const noexcept       { return roundToInt (mouseDownPosition.getDistanceFrom (position)); }\r
+Point<int> MouseEvent::getOffsetFromDragStart() const noexcept  { return (position - mouseDownPos).roundToInt(); }\r
+int MouseEvent::getDistanceFromDragStart() const noexcept       { return roundToInt (mouseDownPos.getDistanceFrom (position)); }\r
 \r
-int MouseEvent::getMouseDownX() const noexcept                  { return roundToInt (mouseDownPosition.x); }\r
-int MouseEvent::getMouseDownY() const noexcept                  { return roundToInt (mouseDownPosition.y); }\r
+int MouseEvent::getMouseDownX() const noexcept                  { return roundToInt (mouseDownPos.x); }\r
+int MouseEvent::getMouseDownY() const noexcept                  { return roundToInt (mouseDownPos.y); }\r
 \r
 int MouseEvent::getDistanceFromDragStartX() const noexcept      { return getOffsetFromDragStart().x; }\r
 int MouseEvent::getDistanceFromDragStartY() const noexcept      { return getOffsetFromDragStart().y; }\r
index d47a30c8da45f2fe1327cf91939be6679404006d..8fe3220f9ef347509a9f6038c1ede8feab83a524 100644 (file)
@@ -149,12 +149,6 @@ public:
     */\r
     const float tiltY;\r
 \r
-    /** The coordinates of the last place that a mouse button was pressed.\r
-        The coordinates are relative to the component specified in MouseEvent::component.\r
-        @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown\r
-    */\r
-    const Point<float> mouseDownPosition;\r
-\r
     /** The component that this event applies to.\r
 \r
         This is usually the component that the mouse was over at the time, but for mouse-drag\r
@@ -203,8 +197,7 @@ public:
 \r
     /** Returns the coordinates of the last place that a mouse was pressed.\r
         The coordinates are relative to the component specified in MouseEvent::component.\r
-        For a floating point version of this value, see mouseDownPosition.\r
-        @see mouseDownPosition, getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown\r
+        @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown\r
     */\r
     Point<int> getMouseDownPosition() const noexcept;\r
 \r
@@ -374,6 +367,7 @@ public:
 \r
 private:\r
     //==============================================================================\r
+    const Point<float> mouseDownPos;\r
     const uint8 numberOfClicks, wasMovedSinceMouseDown;\r
 \r
     MouseEvent& operator= (const MouseEvent&);\r
index d028d2a1667b419033766cf04fc6862ce8937205..efe7654ce0ef1070535de0e607111635328421c0 100644 (file)
@@ -149,7 +149,7 @@ public:
         comp.internalMouseDrag (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, pressure, orientation, rotation, tiltX, tiltY);\r
     }\r
 \r
-    void sendMouseUp (Component& comp, Point<float> screenPos, Time time, ModifierKeys oldMods)\r
+    void sendMouseUp (Component& comp, Point<float> screenPos, Time time, const ModifierKeys oldMods)\r
     {\r
         JUCE_MOUSE_EVENT_DBG ("up")\r
             comp.internalMouseUp (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, oldMods, pressure, orientation, rotation, tiltX, tiltY);\r
@@ -161,7 +161,7 @@ public:
         comp.internalMouseWheel (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, wheel);\r
     }\r
 \r
-    void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, float amount)\r
+    void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, const float amount)\r
     {\r
         JUCE_MOUSE_EVENT_DBG ("magnify")\r
         comp.internalMagnifyGesture (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, amount);\r
@@ -169,7 +169,7 @@ public:
 \r
     //==============================================================================\r
     // (returns true if the button change caused a modal event loop)\r
-    bool setButtons (Point<float> screenPos, Time time, ModifierKeys newButtonState)\r
+    bool setButtons (Point<float> screenPos, Time time, const ModifierKeys newButtonState)\r
     {\r
         if (buttonState == newButtonState)\r
             return false;\r
@@ -220,7 +220,7 @@ public:
         return lastCounter != mouseEventCounter;\r
     }\r
 \r
-    void setComponentUnderMouse (Component* newComponent, Point<float> screenPos, Time time)\r
+    void setComponentUnderMouse (Component* const newComponent, Point<float> screenPos, Time time)\r
     {\r
         auto* current = getComponentUnderMouse();\r
 \r
@@ -234,17 +234,16 @@ public:
                 WeakReference<Component> safeOldComp (current);\r
                 setButtons (screenPos, time, ModifierKeys());\r
 \r
-                if (auto oldComp = safeOldComp.get())\r
+                if (safeOldComp != nullptr)\r
                 {\r
                     componentUnderMouse = safeNewComp;\r
-                    sendMouseExit (*oldComp, screenPos, time);\r
+                    sendMouseExit (*safeOldComp, screenPos, time);\r
                 }\r
 \r
                 buttonState = originalButtonState;\r
             }\r
 \r
-            componentUnderMouse = safeNewComp.get();\r
-            current = safeNewComp.get();\r
+            current = componentUnderMouse = safeNewComp;\r
 \r
             if (current != nullptr)\r
                 sendMouseEnter (*current, screenPos, time);\r
@@ -264,7 +263,7 @@ public:
         }\r
     }\r
 \r
-    void setScreenPos (Point<float> newScreenPos, Time time, bool forceUpdate)\r
+    void setScreenPos (Point<float> newScreenPos, Time time, const bool forceUpdate)\r
     {\r
         if (! isDragging())\r
             setComponentUnderMouse (findComponentAt (newScreenPos), newScreenPos, time);\r
@@ -369,7 +368,7 @@ public:
         else\r
             screenPos = peer.localToGlobal (positionWithinPeer);\r
 \r
-        if (auto target = lastNonInertialWheelTarget.get())\r
+        if (Component* target = lastNonInertialWheelTarget)\r
             sendMouseWheel (*target, screenPos, time, wheel);\r
     }\r
 \r
@@ -738,7 +737,7 @@ struct MouseInputSource::SourceList  : public Timer
         return nullptr;\r
     }\r
 \r
-    void beginDragAutoRepeat (int interval)\r
+    void beginDragAutoRepeat (const int interval)\r
     {\r
         if (interval > 0)\r
         {\r
index 723cc2beb1f2dcc95893a5bf3b8c8bc72633cb39..346fefe4389692576f664c9879e9c6c0febfe776 100644 (file)
@@ -47,13 +47,15 @@ class SelectedItemSet   : public ChangeBroadcaster
 {\r
 public:\r
     //==============================================================================\r
-    using ItemType = SelectableItemType;\r
-    using ItemArray = Array<SelectableItemType>;\r
-    using ParameterType = typename TypeHelpers::ParameterType<SelectableItemType>::type;\r
+    typedef SelectableItemType ItemType;\r
+    typedef Array<SelectableItemType> ItemArray;\r
+    typedef typename TypeHelpers::ParameterType<SelectableItemType>::type ParameterType;\r
 \r
     //==============================================================================\r
     /** Creates an empty set. */\r
-    SelectedItemSet() = default;\r
+    SelectedItemSet()\r
+    {\r
+    }\r
 \r
     /** Creates a set based on an array of items. */\r
     explicit SelectedItemSet (const ItemArray& items)\r
@@ -63,7 +65,7 @@ public:
 \r
     /** Creates a copy of another set. */\r
     SelectedItemSet (const SelectedItemSet& other)\r
-        : ChangeBroadcaster(), selectedItems (other.selectedItems)\r
+        : selectedItems (other.selectedItems)\r
     {\r
     }\r
 \r
index 73dbfcbdee17d54d6f1552f7a2166be7a84dc43d..15b18d8fc041609e11ac1c3442ad3630af6357c2 100644 (file)
@@ -30,13 +30,13 @@ namespace juce
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  FIELD (providers, "providers", "[Landroid/content/pm/ProviderInfo;")\r
 \r
-DECLARE_JNI_CLASS (AndroidPackageInfo, "android/content/pm/PackageInfo")\r
+DECLARE_JNI_CLASS (AndroidPackageInfo, "android/content/pm/PackageInfo");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  FIELD (authority, "authority", "Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (AndroidProviderInfo, "android/content/pm/ProviderInfo")\r
+DECLARE_JNI_CLASS (AndroidProviderInfo, "android/content/pm/ProviderInfo");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -44,13 +44,13 @@ DECLARE_JNI_CLASS (AndroidProviderInfo, "android/content/pm/ProviderInfo")
  METHOD (createInputStream, "createInputStream", "()Ljava/io/FileInputStream;") \\r
  METHOD (getLength,         "getLength",         "()J")\r
 \r
-DECLARE_JNI_CLASS (AssetFileDescriptor, "android/content/res/AssetFileDescriptor")\r
+DECLARE_JNI_CLASS (AssetFileDescriptor, "android/content/res/AssetFileDescriptor");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (close, "close", "()V")\r
 \r
-DECLARE_JNI_CLASS (JavaCloseable, "java/io/Closeable")\r
+DECLARE_JNI_CLASS (JavaCloseable, "java/io/Closeable");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -58,20 +58,20 @@ DECLARE_JNI_CLASS (JavaCloseable, "java/io/Closeable")
  METHOD (startWatching, "startWatching", "()V") \\r
  METHOD (stopWatching,  "stopWatching",  "()V")\r
 \r
-DECLARE_JNI_CLASS (JuceContentProviderFileObserver, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderFileObserver")\r
+DECLARE_JNI_CLASS (JuceContentProviderFileObserver, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderFileObserver");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (addRow,      "addRow", "([Ljava/lang/Object;)V") \\r
  METHOD (constructor, "<init>", "(L" JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH ";J[Ljava/lang/String;)V")\r
 \r
-DECLARE_JNI_CLASS (JuceContentProviderFileObserverCursor, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderCursor")\r
+DECLARE_JNI_CLASS (JuceContentProviderFileObserverCursor, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderCursor");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  STATICMETHOD (open, "open", "(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;")\r
 \r
-DECLARE_JNI_CLASS (ParcelFileDescriptor, "android/os/ParcelFileDescriptor")\r
+DECLARE_JNI_CLASS (ParcelFileDescriptor, "android/os/ParcelFileDescriptor");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -294,7 +294,7 @@ private:
                                          javaString ("raw").get(), javaString (packageName).get());\r
 \r
         // Raw resource not found. Please make sure that you include your file as a raw resource\r
-        // and that you specify just the file name, without an extension.\r
+        // and that you specify just the file name, without an extention.\r
         jassert (fileId != 0);\r
 \r
         if (fileId == 0)\r
@@ -307,10 +307,14 @@ private:
         auto inputStream = StreamCloser (LocalRef<jobject> (env->CallObjectMethod (assetFd,\r
                                                                                    AssetFileDescriptor.createInputStream)));\r
 \r
-        if (jniCheckHasExceptionOccurredAndClear())\r
+        auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+        if (exception != 0)\r
         {\r
             // Failed to open file stream for resource\r
             jassertfalse;\r
+\r
+            env->ExceptionClear();\r
             return {};\r
         }\r
 \r
@@ -322,27 +326,35 @@ private:
                                                                              JavaFileOutputStream.constructor,\r
                                                                              javaString (tempFile.getFullPathName()).get())));\r
 \r
-        if (jniCheckHasExceptionOccurredAndClear())\r
+        exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+        if (exception != 0)\r
         {\r
             // Failed to open file stream for temporary file\r
             jassertfalse;\r
+\r
+            env->ExceptionClear();\r
             return {};\r
         }\r
 \r
         auto buffer = LocalRef<jbyteArray> (env->NewByteArray (1024));\r
         int bytesRead = 0;\r
 \r
-        for (;;)\r
+        while (true)\r
         {\r
             if (threadShouldExit())\r
                 return {};\r
 \r
             bytesRead = env->CallIntMethod (inputStream.stream, JavaFileInputStream.read, buffer.get());\r
 \r
-            if (jniCheckHasExceptionOccurredAndClear())\r
+            exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+            if (exception != 0)\r
             {\r
                 // Failed to read from resource file.\r
                 jassertfalse;\r
+\r
+                env->ExceptionClear();\r
                 return {};\r
             }\r
 \r
@@ -351,10 +363,12 @@ private:
 \r
             env->CallVoidMethod (outputStream.stream, JavaFileOutputStream.write, buffer.get(), 0, bytesRead);\r
 \r
-            if (jniCheckHasExceptionOccurredAndClear())\r
+            if (exception != 0)\r
             {\r
                 // Failed to write to temporary file.\r
                 jassertfalse;\r
+\r
+                env->ExceptionClear();\r
                 return {};\r
             }\r
         }\r
@@ -700,10 +714,14 @@ private:
                                                                                     ParcelFileDescriptor.open,\r
                                                                                     javaFile.get(), modeReadOnly));\r
 \r
-        if (jniCheckHasExceptionOccurredAndClear())\r
+        auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+        if (exception != 0)\r
         {\r
             // Failed to create file descriptor. Have you provided a valid file path/resource name?\r
             jassertfalse;\r
+\r
+            env->ExceptionClear();\r
             return nullptr;\r
         }\r
 \r
index c8dd673bfae6de162ea36634327a720219fc332d..34b71143bc5939e6c720167a7d94a4302542d42b 100644 (file)
@@ -74,7 +74,7 @@ JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, launchApp, void, (JNIEnv* en
         jassertfalse; // you must supply an application object for an android app!\r
     }\r
 \r
-    JUCE_ASSERT_MESSAGE_THREAD\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 }\r
 \r
 JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, suspendApp, void, (JNIEnv* env, jobject))\r
@@ -200,7 +200,7 @@ JUCE_JNI_CALLBACK (JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME, firebaseRemoteMess
  METHOD (drawBitmap,       "drawBitmap",    "([IIIFFIIZLandroid/graphics/Paint;)V") \\r
  METHOD (getClipBounds,    "getClipBounds", "()Landroid/graphics/Rect;")\r
 \r
-DECLARE_JNI_CLASS (CanvasMinimal, "android/graphics/Canvas")\r
+DECLARE_JNI_CLASS (CanvasMinimal, "android/graphics/Canvas");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -212,7 +212,7 @@ DECLARE_JNI_CLASS (CanvasMinimal, "android/graphics/Canvas")
  METHOD (showKeyboard,                "showKeyboard",                "(Ljava/lang/String;)V") \\r
  METHOD (setSystemUiVisibilityCompat, "setSystemUiVisibilityCompat", "(I)V") \\r
 \r
-DECLARE_JNI_CLASS (ComponentPeerView, JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView")\r
+DECLARE_JNI_CLASS (ComponentPeerView, JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 \r
@@ -1034,7 +1034,7 @@ bool juce_areThereAnyAlwaysOnTopWindows()
 }\r
 \r
 //==============================================================================\r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
 {\r
     Display d;\r
 \r
@@ -1057,7 +1057,7 @@ JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, setScreenSize, void, (JNIEnv
     android.screenHeight = screenHeight;\r
     android.dpi = dpi;\r
 \r
-    const_cast<Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+    const_cast<Desktop::Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
 }\r
 \r
 //==============================================================================\r
@@ -1073,19 +1073,17 @@ void MouseCursor::deleteMouseCursor (void* const /*cursorHandle*/, const bool /*
 \r
 //==============================================================================\r
 void MouseCursor::showInWindow (ComponentPeer*) const   {}\r
+void MouseCursor::showInAllWindows() const  {}\r
 \r
 //==============================================================================\r
 bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& /*files*/, const bool /*canMove*/,\r
-                                                           Component* /*srcComp*/, std::function<void()> /*callback*/)\r
+                                                           Component* /*srcComp*/)\r
 {\r
-    jassertfalse;    // no such thing on Android!\r
     return false;\r
 }\r
 \r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/, Component* /*srcComp*/,\r
-                                                          std::function<void()> /*callback*/)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/, Component* /*srcComp*/)\r
 {\r
-    jassertfalse;    // no such thing on Android!\r
     return false;\r
 }\r
 \r
index 3c767c0965d81f2e311d32078929f248979c602f..32f1d8e73f7eecc6f696a2814f3340bc025e1399 100644 (file)
@@ -477,7 +477,7 @@ MimeTypeTableEntry MimeTypeTableEntry::table[640] =
     {"pvu",      "paleovu/x-pv"},\r
     {"pwz",      "application/vnd.ms-powerpoint"},\r
     {"py",       "text/x-script.phyton"},\r
-    {"pyc",      "application/x-bytecode.python"},\r
+    {"pyc",      "applicaiton/x-bytecode.python"},\r
     {"qcp",      "audio/vnd.qcelp"},\r
     {"qd3",      "x-world/x-3dmf"},\r
     {"qd3d",     "x-world/x-3dmf"},\r
index 11112883569845e47abd8b12ed37b1f69c6d1d9f..13ac6d5578e9a0d33e26697f211fe4759b2e0a19 100644 (file)
@@ -45,7 +45,7 @@ public:
 \r
     void shareFiles (const Array<URL>& files) override\r
     {\r
-        auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) files.size()];\r
+        auto* urls = [NSMutableArray arrayWithCapacity: (NSUInteger) files.size()];\r
 \r
         for (const auto& f : files)\r
         {\r
@@ -86,7 +86,7 @@ public:
 \r
     void shareText (const String& text) override\r
     {\r
-        auto array = [NSArray arrayWithObject: juceStringToNS (text)];\r
+        auto* array = [NSArray arrayWithObject: juceStringToNS (text)];\r
         share (array);\r
     }\r
 \r
index cf5f613e0cdea49bf8e2b92da24a4667e2e02be4..8304895483224048350fdacde2eb8dc92e173958 100644 (file)
@@ -85,34 +85,11 @@ public:
 \r
         setOpaque (false);\r
 \r
-        if (SystemStats::isRunningInAppExtensionSandbox())\r
-        {\r
-            if (fileChooser.parent != nullptr)\r
-            {\r
-                [controller.get() setModalPresentationStyle:UIModalPresentationFullScreen];\r
-\r
-                auto chooserBounds = fileChooser.parent->getBounds();\r
-                setBounds (chooserBounds);\r
-\r
-                setAlwaysOnTop (true);\r
-                fileChooser.parent->addAndMakeVisible (this);\r
-            }\r
-            else\r
-            {\r
-                // Opening a native top-level window in an AUv3 is not allowed (sandboxing). You need to specify a\r
-                // parent component (for example your editor) to parent the native file chooser window. To do this\r
-                // specify a parent component in the FileChooser's constructor!\r
-                jassert (fileChooser.parent != nullptr);\r
-            }\r
-        }\r
-        else\r
-        {\r
-            auto chooserBounds = Desktop::getInstance().getDisplays().getMainDisplay().userArea;\r
-            setBounds (chooserBounds);\r
+        auto chooserBounds = Desktop::getInstance().getDisplays().getMainDisplay().userArea;\r
+        setBounds (chooserBounds);\r
 \r
-            setAlwaysOnTop (true);\r
-            addToDesktop (0);\r
-        }\r
+        setAlwaysOnTop (true);\r
+        addToDesktop (0);\r
     }\r
 \r
     ~Native()\r
@@ -222,7 +199,7 @@ private:
 \r
         NSArray<NSFileAccessIntent*>* intents = @[fileAccessIntent];\r
 \r
-        auto fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter: nil];\r
+        auto* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter: nil];\r
 \r
         [fileCoordinator coordinateAccessWithIntents: intents queue: [NSOperationQueue mainQueue] byAccessor: ^(NSError* err)\r
         {\r
@@ -251,7 +228,7 @@ private:
                 }\r
                 else\r
                 {\r
-                    auto desc = [error localizedDescription];\r
+                    auto* desc = [error localizedDescription];\r
                     ignoreUnused (desc);\r
                     jassertfalse;\r
                 }\r
@@ -260,7 +237,7 @@ private:
             }\r
             else\r
             {\r
-                auto desc = [err localizedDescription];\r
+                auto* desc = [err localizedDescription];\r
                 ignoreUnused (desc);\r
                 jassertfalse;\r
             }\r
@@ -331,7 +308,7 @@ bool FileChooser::isPlatformDialogAvailable()
    #if JUCE_DISABLE_NATIVE_FILECHOOSERS\r
     return false;\r
    #else\r
-    return true;\r
+    return [[NSFileManager defaultManager] ubiquityIdentityToken] != nil;\r
    #endif\r
 }\r
 \r
index 6a278c07c65f558e7ad9d20fb95b1269b58d1bab..dc2499a82d6f2fe6ded42cc528728a7bdab8e40e 100644 (file)
@@ -163,17 +163,8 @@ using namespace juce;
 namespace juce\r
 {\r
 \r
-struct UIViewPeerControllerReceiver\r
-{\r
-    virtual ~UIViewPeerControllerReceiver();\r
-    virtual void setViewController (UIViewController*) = 0;\r
-};\r
-\r
-UIViewPeerControllerReceiver::~UIViewPeerControllerReceiver() {}\r
-\r
 class UIViewComponentPeer  : public ComponentPeer,\r
-                             public FocusChangeListener,\r
-                             public UIViewPeerControllerReceiver\r
+                             public FocusChangeListener\r
 {\r
 public:\r
     UIViewComponentPeer (Component&, int windowStyleFlags, UIView* viewToAttachTo);\r
@@ -185,12 +176,6 @@ public:
     void setTitle (const String& title) override;\r
     void setBounds (const Rectangle<int>&, bool isNowFullScreen) override;\r
 \r
-    void setViewController (UIViewController* newController) override\r
-    {\r
-        jassert (controller == nullptr);\r
-        controller = [newController retain];\r
-    }\r
-\r
     Rectangle<int> getBounds() const override               { return getBounds (! isSharedWindow); }\r
     Rectangle<int> getBounds (bool global) const;\r
     Point<float> localToGlobal (Point<float> relativePosition) override;\r
@@ -233,7 +218,7 @@ public:
     //==============================================================================\r
     UIWindow* window;\r
     JuceUIView* view;\r
-    UIViewController* controller;\r
+    JuceUIViewController* controller;\r
     bool isSharedWindow, fullScreen, insideDrawRect, isAppex;\r
 \r
     static int64 getMouseTime (UIEvent* e) noexcept\r
@@ -717,7 +702,7 @@ void UIViewComponentPeer::updateTransformAndScreenBounds()
     const Rectangle<int> oldArea (component.getBounds());\r
     const Rectangle<int> oldDesktop (desktop.getDisplays().getMainDisplay().userArea);\r
 \r
-    const_cast<Displays&> (desktop.getDisplays()).refresh();\r
+    const_cast<Desktop::Displays&> (desktop.getDisplays()).refresh();\r
 \r
     window.transform = Orientations::getCGTransformFor (desktop.getCurrentOrientation());\r
     view.transform = CGAffineTransformIdentity;\r
index c5f1bd6915dcdc0724952501a17c7738469a3a49..ce7135f2576e459754d3263d8fe8bdaf80468e6c 100644 (file)
@@ -48,8 +48,7 @@ namespace juce
 }\r
 \r
 @property (strong, nonatomic) UIWindow *window;\r
-- (id) init;\r
-- (void) dealloc;\r
+- (id)init;\r
 - (void) applicationDidFinishLaunching: (UIApplication*) application;\r
 - (void) applicationWillTerminate: (UIApplication*) application;\r
 - (void) applicationDidEnterBackground: (UIApplication*) application;\r
@@ -89,7 +88,7 @@ namespace juce
 \r
     NSObject* _pushNotificationsDelegate;\r
 \r
-- (id) init\r
+- (id)init\r
 {\r
     self = [super init];\r
     appSuspendTask = UIBackgroundTaskInvalid;\r
@@ -101,11 +100,6 @@ namespace juce
     return self;\r
 }\r
 \r
-- (void) dealloc\r
-{\r
-    [super dealloc];\r
-}\r
-\r
 - (void) applicationDidFinishLaunching: (UIApplication*) application\r
 {\r
     ignoreUnused (application);\r
@@ -646,13 +640,13 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType /*i
 }\r
 \r
 //==============================================================================\r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray&, bool, Component*, std::function<void()>)\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray&, bool, Component*)\r
 {\r
     jassertfalse;    // no such thing on iOS!\r
     return false;\r
 }\r
 \r
-bool DragAndDropContainer::performExternalDragDropOfText (const String&, Component*, std::function<void()>)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String&, Component*)\r
 {\r
     jassertfalse;    // no such thing on iOS!\r
     return false;\r
@@ -736,7 +730,7 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
     return Orientations::convertToJuce (orientation);\r
 }\r
 \r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
 {\r
     JUCE_AUTORELEASEPOOL\r
     {\r
index ab9b9496b92f95e8372d70c75fad2d643ee66590..d6dc752ffdf5835e8fe725dcf7f094e3ff76c0ab 100644 (file)
@@ -68,7 +68,7 @@ namespace Keys
     static const int extendedKeyModifier = 0x10000000;\r
 }\r
 \r
-bool KeyPress::isKeyCurrentlyDown (int keyCode)\r
+bool KeyPress::isKeyCurrentlyDown (const int keyCode)\r
 {\r
     ScopedXDisplay xDisplay;\r
 \r
@@ -96,9 +96,9 @@ bool KeyPress::isKeyCurrentlyDown (int keyCode)
         ScopedXLock xlock (display);\r
 \r
         const int keycode = XKeysymToKeycode (display, (KeySym) keysym);\r
+\r
         const int keybyte = keycode >> 3;\r
         const int keybit = (1 << (keycode & 7));\r
-\r
         return (Keys::keyStates [keybyte] & keybit) != 0;\r
     }\r
 \r
@@ -318,7 +318,7 @@ namespace XRender
     static bool hasCompositingWindowManager (::Display* display) noexcept\r
     {\r
         return display != nullptr\r
-                && XGetSelectionOwner (display, Atoms::getCreating (display, "_NET_WM_CM_S0")) != 0;\r
+                && XGetSelectionOwner (display, Atoms::getCreating ("_NET_WM_CM_S0")) != 0;\r
     }\r
 \r
     static XRenderPictFormat* findPictureFormat (::Display* display)\r
@@ -326,7 +326,7 @@ namespace XRender
         ScopedXLock xlock (display);\r
         XRenderPictFormat* pictFormat = nullptr;\r
 \r
-        if (isAvailable (display))\r
+        if (isAvailable())\r
         {\r
             pictFormat = xRenderFindStandardFormat (display, PictStandardARGB32);\r
 \r
@@ -366,7 +366,7 @@ namespace XRender
 \r
 namespace Visuals\r
 {\r
-    static Visual* findVisualWithDepth (::Display* display, int desiredDepth) noexcept\r
+    static Visual* findVisualWithDepth (::Display* display, const int desiredDepth) noexcept\r
     {\r
         ScopedXLock xlock (display);\r
 \r
@@ -395,7 +395,10 @@ namespace Visuals
             desiredMask |= VisualBitsPerRGBMask;\r
         }\r
 \r
-        if (auto* xvinfos = XGetVisualInfo (display, desiredMask, &desiredVisual, &numVisuals))\r
+        if (XVisualInfo* xvinfos = XGetVisualInfo (display,\r
+                                                   desiredMask,\r
+                                                   &desiredVisual,\r
+                                                   &numVisuals))\r
         {\r
             for (int i = 0; i < numVisuals; i++)\r
             {\r
@@ -412,7 +415,7 @@ namespace Visuals
         return visual;\r
     }\r
 \r
-    static Visual* findVisualFormat (::Display* display, int desiredDepth, int& matchedDepth) noexcept\r
+    static Visual* findVisualFormat (::Display* display, const int desiredDepth, int& matchedDepth) noexcept\r
     {\r
         Visual* visual = nullptr;\r
 \r
@@ -424,7 +427,7 @@ namespace Visuals
                #if JUCE_USE_XRENDER\r
                 if (XRender::isAvailable (display))\r
                 {\r
-                    if (auto pictFormat = XRender::findPictureFormat (display))\r
+                    if (XRenderPictFormat* pictFormat = XRender::findPictureFormat (display))\r
                     {\r
                         int numVisuals = 0;\r
                         XVisualInfo desiredVisual;\r
@@ -432,13 +435,13 @@ namespace Visuals
                         desiredVisual.depth = 32;\r
                         desiredVisual.bits_per_rgb = 8;\r
 \r
-                        if (auto xvinfos = XGetVisualInfo (display,\r
-                                                           VisualScreenMask | VisualDepthMask | VisualBitsPerRGBMask,\r
-                                                           &desiredVisual, &numVisuals))\r
+                        if (XVisualInfo* xvinfos = XGetVisualInfo (display,\r
+                                                                   VisualScreenMask | VisualDepthMask | VisualBitsPerRGBMask,\r
+                                                                   &desiredVisual, &numVisuals))\r
                         {\r
                             for (int i = 0; i < numVisuals; ++i)\r
                             {\r
-                                auto pictVisualFormat = XRender::xRenderFindVisualFormat (display, xvinfos[i].visual);\r
+                                XRenderPictFormat* pictVisualFormat = XRender::xRenderFindVisualFormat (display, xvinfos[i].visual);\r
 \r
                                 if (pictVisualFormat != nullptr\r
                                      && pictVisualFormat->type == PictTypeDirect\r
@@ -458,7 +461,6 @@ namespace Visuals
                 if (visual == nullptr)\r
                 {\r
                     visual = findVisualWithDepth (display, 32);\r
-\r
                     if (visual != nullptr)\r
                         matchedDepth = 32;\r
                 }\r
@@ -469,7 +471,6 @@ namespace Visuals
         if (visual == nullptr && desiredDepth >= 24)\r
         {\r
             visual = findVisualWithDepth (display, 24);\r
-\r
             if (visual != nullptr)\r
                 matchedDepth = 24;\r
         }\r
@@ -477,7 +478,6 @@ namespace Visuals
         if (visual == nullptr && desiredDepth >= 16)\r
         {\r
             visual = findVisualWithDepth (display, 16);\r
-\r
             if (visual != nullptr)\r
                 matchedDepth = 16;\r
         }\r
@@ -626,8 +626,7 @@ public:
         return new LowLevelGraphicsSoftwareRenderer (Image (this));\r
     }\r
 \r
-    void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y,\r
-                               Image::BitmapData::ReadWriteMode mode) override\r
+    void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
     {\r
         bitmap.data = imageData + x * pixelStride + y * lineStride;\r
         bitmap.pixelFormat = pixelFormat;\r
@@ -646,8 +645,7 @@ public:
 \r
     ImageType* createType() const override     { return new NativeImageType(); }\r
 \r
-    void blitToWindow (Window window, int dx, int dy,\r
-                       unsigned int dw, unsigned int dh, int sx, int sy)\r
+    void blitToWindow (Window window, int dx, int dy, unsigned int dw, unsigned int dh, int sx, int sy)\r
     {\r
         ScopedXLock xlock (display);\r
 \r
@@ -668,15 +666,15 @@ public:
 \r
         if (imageDepth == 16)\r
         {\r
-            auto rMask   = (uint32) xImage->red_mask;\r
-            auto gMask   = (uint32) xImage->green_mask;\r
-            auto bMask   = (uint32) xImage->blue_mask;\r
-            auto rShiftL = (uint32) jmax (0,  getShiftNeeded (rMask));\r
-            auto rShiftR = (uint32) jmax (0, -getShiftNeeded (rMask));\r
-            auto gShiftL = (uint32) jmax (0,  getShiftNeeded (gMask));\r
-            auto gShiftR = (uint32) jmax (0, -getShiftNeeded (gMask));\r
-            auto bShiftL = (uint32) jmax (0,  getShiftNeeded (bMask));\r
-            auto bShiftR = (uint32) jmax (0, -getShiftNeeded (bMask));\r
+            const uint32 rMask   = (uint32) xImage->red_mask;\r
+            const uint32 gMask   = (uint32) xImage->green_mask;\r
+            const uint32 bMask   = (uint32) xImage->blue_mask;\r
+            const uint32 rShiftL = (uint32) jmax (0,  getShiftNeeded (rMask));\r
+            const uint32 rShiftR = (uint32) jmax (0, -getShiftNeeded (rMask));\r
+            const uint32 gShiftL = (uint32) jmax (0,  getShiftNeeded (gMask));\r
+            const uint32 gShiftR = (uint32) jmax (0, -getShiftNeeded (gMask));\r
+            const uint32 bShiftL = (uint32) jmax (0,  getShiftNeeded (bMask));\r
+            const uint32 bShiftR = (uint32) jmax (0, -getShiftNeeded (bMask));\r
 \r
             const Image::BitmapData srcData (Image (this), Image::BitmapData::readOnly);\r
 \r
@@ -740,231 +738,651 @@ private:
 };\r
 \r
 //==============================================================================\r
-#if JUCE_USE_XINERAMA\r
-static Array<XineramaScreenInfo> XineramaQueryDisplays (::Display* display)\r
+\r
+#if JUCE_USE_XRANDR\r
+template <>\r
+struct ContainerDeletePolicy<XRRScreenResources>\r
 {\r
-    typedef Bool (*tXineramaIsActive) (::Display*);\r
-    typedef XineramaScreenInfo* (*tXineramaQueryScreens) (::Display*, int*);\r
+    static void destroy (XRRScreenResources* object);\r
+};\r
 \r
-    int major_opcode, first_event, first_error;\r
+template <>\r
+struct ContainerDeletePolicy<XRROutputInfo>\r
+{\r
+    static void destroy (XRROutputInfo* object);\r
+};\r
 \r
-    if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error))\r
+template <>\r
+struct ContainerDeletePolicy<XRRCrtcInfo>\r
+{\r
+    static void destroy (XRRCrtcInfo* object);\r
+};\r
+#endif\r
+\r
+//================================ X11 - DisplayGeometry =======================\r
+\r
+class DisplayGeometry\r
+{\r
+private:\r
+    //==============================================================================\r
+    DisplayGeometry (::Display* display, double masterScale)\r
     {\r
-        static void* libXinerama = nullptr;\r
-        static tXineramaIsActive isActiveFuncPtr = nullptr;\r
-        static tXineramaQueryScreens xineramaQueryScreens = nullptr;\r
+        jassert (instance == nullptr);\r
+        instance = this;\r
 \r
-        if (libXinerama == nullptr)\r
-        {\r
-            libXinerama = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW);\r
+        queryDisplayInfos (display, masterScale);\r
+        updatePositions();\r
+    }\r
 \r
-            if (libXinerama == nullptr)\r
-                libXinerama = dlopen ("libXinerama.so.1", RTLD_GLOBAL | RTLD_NOW);\r
+public:\r
+    //==============================================================================\r
+    struct ExtendedInfo\r
+    {\r
+        // Unlike Desktop::Displays::Display, the following is in\r
+        // physical pixels, i.e. the area is not scaled\r
+        Rectangle<int> totalBounds;\r
+        // Usable bounds is the usable area in local coordinates\r
+        // with respect to the above totalBounds\r
+        Rectangle<int> usableBounds;\r
+        // top-left point of display in scaled coordinates. This\r
+        // is different from totalBounds.getTopLeft() / scale,\r
+        // because the neighbouring display may have a different\r
+        // scale factor\r
+        Point<int> topLeftScaled;\r
+        double dpi, scale;\r
+        bool isMain;\r
+    };\r
 \r
-            if (libXinerama != nullptr)\r
-            {\r
-                isActiveFuncPtr = (tXineramaIsActive) dlsym (libXinerama, "XineramaIsActive");\r
-                xineramaQueryScreens = (tXineramaQueryScreens) dlsym (libXinerama, "XineramaQueryScreens");\r
-            }\r
-        }\r
+    Array<ExtendedInfo> infos;\r
 \r
-        if (isActiveFuncPtr != nullptr && xineramaQueryScreens != nullptr && isActiveFuncPtr (display) != 0)\r
+    //==============================================================================\r
+    ExtendedInfo& findDisplayForRect (Rectangle<int> bounds, bool isScaledBounds)\r
+    {\r
+        int maxArea = -1;\r
+        ExtendedInfo* retval = nullptr;\r
+\r
+        for (int i = 0; i < infos.size(); ++i)\r
         {\r
-            int numScreens;\r
+            auto& dpy = infos.getReference (i);\r
 \r
-            if (auto* xinfo = xineramaQueryScreens (display, &numScreens))\r
-            {\r
-                Array<XineramaScreenInfo> infos (xinfo, numScreens);\r
-                XFree (xinfo);\r
+            auto displayBounds = dpy.totalBounds;\r
+\r
+            if (isScaledBounds)\r
+                displayBounds = (displayBounds.withZeroOrigin() / dpy.scale) + dpy.topLeftScaled;\r
 \r
-                return infos;\r
+            displayBounds = displayBounds.getIntersection (bounds);\r
+            int area = displayBounds.getWidth() * displayBounds.getHeight();\r
+\r
+            if (area >= maxArea)\r
+            {\r
+                maxArea = area;\r
+                retval = &dpy;\r
             }\r
         }\r
-    }\r
 \r
-    return {};\r
-}\r
-#endif\r
+        return *retval;\r
+    }\r
 \r
-//==============================================================================\r
-#if JUCE_USE_XRANDR\r
-class XRandrWrapper\r
-{\r
-private:\r
-    XRandrWrapper()\r
+    ExtendedInfo& findDisplayForPoint (Point<int> pt, bool isScaledPoint)\r
     {\r
-        if (libXrandr == nullptr)\r
+        int minDistance = (int) ((((unsigned int)(-1)) >> 1) - 1);\r
+        ExtendedInfo* retval = nullptr;\r
+\r
+        for (int i = 0; i < infos.size(); ++i)\r
         {\r
-            libXrandr = dlopen ("libXrandr.so", RTLD_GLOBAL | RTLD_NOW);\r
+            auto& dpy = infos.getReference (i);\r
 \r
-            if (libXrandr == nullptr)\r
-                libXrandr = dlopen ("libXrandr.so.2", RTLD_GLOBAL | RTLD_NOW);\r
+            auto displayBounds = dpy.totalBounds;\r
 \r
-            if (libXrandr != nullptr)\r
+            if (isScaledPoint)\r
+                displayBounds = (displayBounds.withZeroOrigin() / dpy.scale) + dpy.topLeftScaled;\r
+\r
+            if (displayBounds.contains (pt))\r
+                return dpy;\r
+\r
+            int distance = displayBounds.getCentre().getDistanceFrom (pt);\r
+            if (distance <= minDistance)\r
             {\r
-                getScreenResourcesPtr  = (tXRRGetScreenResources)  dlsym (libXrandr, "XRRGetScreenResources");\r
-                freeScreenResourcesPtr = (tXRRFreeScreenResources) dlsym (libXrandr, "XRRFreeScreenResources");\r
-                getOutputInfoPtr       = (tXRRGetOutputInfo)       dlsym (libXrandr, "XRRGetOutputInfo");\r
-                freeOutputInfoPtr      = (tXRRFreeOutputInfo)      dlsym (libXrandr, "XRRFreeOutputInfo");\r
-                getCrtcInfoPtr         = (tXRRGetCrtcInfo)         dlsym (libXrandr, "XRRGetCrtcInfo");\r
-                freeCrtcInfoPtr        = (tXRRFreeCrtcInfo)        dlsym (libXrandr, "XRRFreeCrtcInfo");\r
-                getOutputPrimaryPtr    = (tXRRGetOutputPrimary)    dlsym (libXrandr, "XRRGetOutputPrimary");\r
+                minDistance = distance;\r
+                retval = &dpy;\r
             }\r
         }\r
-    }\r
 \r
-public:\r
-    //==============================================================================\r
-    static XRandrWrapper& getInstance()\r
-    {\r
-        static XRandrWrapper xrandr;\r
-        return xrandr;\r
+        return *retval;\r
     }\r
 \r
     //==============================================================================\r
-    XRRScreenResources* getScreenResources (::Display* display, ::Window window)\r
+    static Rectangle<int> physicalToScaled (Rectangle<int> physicalBounds)\r
     {\r
-        if (getScreenResourcesPtr != nullptr)\r
-            return getScreenResourcesPtr (display, window);\r
+        // first find with which display physicalBounds has the most overlap\r
+        auto& dpy = getInstance().findDisplayForRect (physicalBounds, false);\r
 \r
-        return nullptr;\r
+        // convert to local screen bounds\r
+        physicalBounds -= dpy.totalBounds.getTopLeft();\r
+\r
+        // now we can safely scale the coordinates and convert to global again\r
+        return (physicalBounds / dpy.scale) + dpy.topLeftScaled;\r
     }\r
 \r
-    XRROutputInfo* getOutputInfo (::Display* display, XRRScreenResources* resources, RROutput output)\r
+    static Rectangle<int> scaledToPhysical (Rectangle<int> scaledBounds)\r
     {\r
-        if (getOutputInfoPtr != nullptr)\r
-            return getOutputInfoPtr (display, resources, output);\r
+        // first find with which display physicalBounds has the most overlap\r
+        auto& dpy = getInstance().findDisplayForRect (scaledBounds, true);\r
 \r
-        return nullptr;\r
+        // convert to local screen bounds\r
+        scaledBounds -= dpy.topLeftScaled;\r
+\r
+        // now we can safely scale the coordinates and convert to global again\r
+        return (scaledBounds * dpy.scale) + dpy.totalBounds.getTopLeft();\r
     }\r
 \r
-    XRRCrtcInfo* getCrtcInfo (::Display* display, XRRScreenResources* resources, RRCrtc crtc)\r
+    //==============================================================================\r
+    template <typename ValueType>\r
+    static Point<ValueType> physicalToScaled (Point<ValueType> physicalPoint)\r
     {\r
-        if (getCrtcInfoPtr != nullptr)\r
-            return getCrtcInfoPtr (display, resources, crtc);\r
+        auto& dpy = getInstance().findDisplayForPoint (physicalPoint.roundToInt(), false);\r
 \r
-        return nullptr;\r
+        Point<ValueType> scaledTopLeft   (dpy.topLeftScaled.getX(), dpy.topLeftScaled.getY());\r
+        Point<ValueType> physicalTopLeft (dpy.totalBounds.getX(), dpy.totalBounds.getY());\r
+\r
+        return ((physicalPoint - physicalTopLeft) / dpy.scale) + scaledTopLeft;\r
     }\r
 \r
-    RROutput getOutputPrimary (::Display* display, ::Window window)\r
+    template <typename ValueType>\r
+    static Point<ValueType> scaledToPhysical (const Point<ValueType>& scaledPoint)\r
     {\r
-        if (getOutputPrimaryPtr != nullptr)\r
-            return getOutputPrimaryPtr (display, window);\r
+        auto& dpy = getInstance().findDisplayForPoint (scaledPoint.roundToInt(), true);\r
 \r
-        return 0;\r
+        Point<ValueType> scaledTopLeft   (dpy.topLeftScaled.getX(), dpy.topLeftScaled.getY());\r
+        Point<ValueType> physicalTopLeft (dpy.totalBounds.getX(), dpy.totalBounds.getY());\r
+\r
+        return ((scaledPoint - scaledTopLeft) * dpy.scale) + physicalTopLeft;\r
     }\r
 \r
     //==============================================================================\r
-    void freeScreenResources (XRRScreenResources* ptr)\r
+    static DisplayGeometry& getInstance()\r
     {\r
-        if (freeScreenResourcesPtr != nullptr)\r
-            freeScreenResourcesPtr (ptr);\r
+        jassert (instance != nullptr);\r
+        return *instance;\r
     }\r
 \r
-    void freeOutputInfo (XRROutputInfo* ptr)\r
+    static DisplayGeometry& getOrCreateInstance (::Display* display, double masterScale)\r
     {\r
-        if (freeOutputInfoPtr != nullptr)\r
-            freeOutputInfoPtr (ptr);\r
+        if (instance == nullptr)\r
+            new DisplayGeometry (display, masterScale);\r
+\r
+        return getInstance();\r
     }\r
 \r
-    void freeCrtcInfo (XRRCrtcInfo* ptr)\r
+private:\r
+    //==============================================================================\r
+    static DisplayGeometry* instance;\r
+\r
+    //==============================================================================\r
+   #if JUCE_USE_XINERAMA\r
+    static Array<XineramaScreenInfo> XineramaQueryDisplays (::Display* display)\r
     {\r
-        if (freeCrtcInfoPtr != nullptr)\r
-            freeCrtcInfoPtr (ptr);\r
+        typedef Bool (*tXineramaIsActive) (::Display*);\r
+        typedef XineramaScreenInfo* (*tXineramaQueryScreens) (::Display*, int*);\r
+\r
+        int major_opcode, first_event, first_error;\r
+\r
+        if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error))\r
+        {\r
+            static void* libXinerama = nullptr;\r
+            static tXineramaIsActive isActiveFuncPtr = nullptr;\r
+            static tXineramaQueryScreens xineramaQueryScreens = nullptr;\r
+\r
+            if (libXinerama == nullptr)\r
+            {\r
+                libXinerama = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW);\r
+\r
+                if (libXinerama == nullptr)\r
+                    libXinerama = dlopen ("libXinerama.so.1", RTLD_GLOBAL | RTLD_NOW);\r
+\r
+                if (libXinerama != nullptr)\r
+                {\r
+                    isActiveFuncPtr = (tXineramaIsActive) dlsym (libXinerama, "XineramaIsActive");\r
+                    xineramaQueryScreens = (tXineramaQueryScreens) dlsym (libXinerama, "XineramaQueryScreens");\r
+                }\r
+            }\r
+\r
+            if (isActiveFuncPtr != nullptr && xineramaQueryScreens != nullptr && isActiveFuncPtr (display) != 0)\r
+            {\r
+                int numScreens;\r
+\r
+                if (auto* xinfo = xineramaQueryScreens (display, &numScreens))\r
+                {\r
+                    Array<XineramaScreenInfo> infos (xinfo, numScreens);\r
+                    XFree (xinfo);\r
+\r
+                    return infos;\r
+                }\r
+            }\r
+        }\r
+\r
+        return {};\r
     }\r
+   #endif\r
 \r
-private:\r
-    using tXRRGetScreenResources   = XRRScreenResources* (*) (::Display*, ::Window);\r
-    using tXRRFreeScreenResources  = void (*) (XRRScreenResources*);\r
-    using tXRRGetOutputInfo        = XRROutputInfo* (*) (::Display*, XRRScreenResources*, RROutput);\r
-    using tXRRFreeOutputInfo       = void (*) (XRROutputInfo*);\r
-    using tXRRGetCrtcInfo          = XRRCrtcInfo* (*) (::Display*, XRRScreenResources*, RRCrtc);\r
-    using tXRRFreeCrtcInfo         = void (*) (XRRCrtcInfo*);\r
-    using tXRRGetOutputPrimary     = RROutput (*) (::Display*, ::Window);\r
-\r
-    void* libXrandr = nullptr;\r
-    tXRRGetScreenResources getScreenResourcesPtr = nullptr;\r
-    tXRRFreeScreenResources freeScreenResourcesPtr = nullptr;\r
-    tXRRGetOutputInfo getOutputInfoPtr = nullptr;\r
-    tXRRFreeOutputInfo freeOutputInfoPtr = nullptr;\r
-    tXRRGetCrtcInfo getCrtcInfoPtr = nullptr;\r
-    tXRRFreeCrtcInfo freeCrtcInfoPtr = nullptr;\r
-    tXRRGetOutputPrimary getOutputPrimaryPtr = nullptr;\r
-};\r
-#endif\r
+    //==============================================================================\r
+   #if JUCE_USE_XRANDR\r
+    friend struct ContainerDeletePolicy<XRRScreenResources>;\r
+    friend struct ContainerDeletePolicy<XRROutputInfo>;\r
+    friend struct ContainerDeletePolicy<XRRCrtcInfo>;\r
 \r
+    class XRandrWrapper\r
+    {\r
+    private:\r
+        XRandrWrapper()\r
+        {\r
+            if (libXrandr == nullptr)\r
+            {\r
+                libXrandr = dlopen ("libXrandr.so", RTLD_GLOBAL | RTLD_NOW);\r
 \r
-static double getDisplayDPI (::Display* display, int index)\r
-{\r
-    double dpiX = (DisplayWidth  (display, index) * 25.4) / DisplayWidthMM  (display, index);\r
-    double dpiY = (DisplayHeight (display, index) * 25.4) / DisplayHeightMM (display, index);\r
-    return (dpiX + dpiY) / 2.0;\r
-}\r
+                if (libXrandr == nullptr)\r
+                    libXrandr = dlopen ("libXrandr.so.2", RTLD_GLOBAL | RTLD_NOW);\r
 \r
-static double getScaleForDisplay (const String& name, double dpi)\r
-{\r
-    if (name.isNotEmpty())\r
+                if (libXrandr != nullptr)\r
+                {\r
+                    getScreenResourcesPtr  = (tXRRGetScreenResources)  dlsym (libXrandr, "XRRGetScreenResources");\r
+                    freeScreenResourcesPtr = (tXRRFreeScreenResources) dlsym (libXrandr, "XRRFreeScreenResources");\r
+                    getOutputInfoPtr       = (tXRRGetOutputInfo)       dlsym (libXrandr, "XRRGetOutputInfo");\r
+                    freeOutputInfoPtr      = (tXRRFreeOutputInfo)      dlsym (libXrandr, "XRRFreeOutputInfo");\r
+                    getCrtcInfoPtr         = (tXRRGetCrtcInfo)         dlsym (libXrandr, "XRRGetCrtcInfo");\r
+                    freeCrtcInfoPtr        = (tXRRFreeCrtcInfo)        dlsym (libXrandr, "XRRFreeCrtcInfo");\r
+                    getOutputPrimaryPtr    = (tXRRGetOutputPrimary)    dlsym (libXrandr, "XRRGetOutputPrimary");\r
+                }\r
+            }\r
+\r
+            instance = this;\r
+        }\r
+\r
+    public:\r
+        //==============================================================================\r
+        static XRandrWrapper& getInstance()\r
+        {\r
+            if (instance == nullptr)\r
+                instance = new XRandrWrapper();\r
+\r
+            return *instance;\r
+        }\r
+\r
+        //==============================================================================\r
+        XRRScreenResources* getScreenResources (::Display* display, ::Window window)\r
+        {\r
+            if (getScreenResourcesPtr != nullptr)\r
+                return getScreenResourcesPtr (display, window);\r
+\r
+            return nullptr;\r
+        }\r
+\r
+        XRROutputInfo* getOutputInfo (::Display* display, XRRScreenResources* resources, RROutput output)\r
+        {\r
+            if (getOutputInfoPtr != nullptr)\r
+                return getOutputInfoPtr (display, resources, output);\r
+\r
+            return nullptr;\r
+        }\r
+\r
+        XRRCrtcInfo* getCrtcInfo (::Display* display, XRRScreenResources* resources, RRCrtc crtc)\r
+        {\r
+            if (getCrtcInfoPtr != nullptr)\r
+                return getCrtcInfoPtr (display, resources, crtc);\r
+\r
+            return nullptr;\r
+        }\r
+\r
+        RROutput getOutputPrimary (::Display* display, ::Window window)\r
+        {\r
+            if (getOutputPrimaryPtr != nullptr)\r
+                return getOutputPrimaryPtr (display, window);\r
+\r
+            return 0;\r
+        }\r
+\r
+    private:\r
+        //==============================================================================\r
+        friend struct ContainerDeletePolicy<XRRScreenResources>;\r
+        friend struct ContainerDeletePolicy<XRROutputInfo>;\r
+        friend struct ContainerDeletePolicy<XRRCrtcInfo>;\r
+\r
+        void freeScreenResources (XRRScreenResources* ptr)\r
+        {\r
+            if (freeScreenResourcesPtr != nullptr)\r
+                freeScreenResourcesPtr (ptr);\r
+        }\r
+\r
+        void freeOutputInfo (XRROutputInfo* ptr)\r
+        {\r
+            if (freeOutputInfoPtr != nullptr)\r
+                freeOutputInfoPtr (ptr);\r
+        }\r
+\r
+        void freeCrtcInfo (XRRCrtcInfo* ptr)\r
+        {\r
+            if (freeCrtcInfoPtr != nullptr)\r
+                freeCrtcInfoPtr (ptr);\r
+        }\r
+    private:\r
+        static XRandrWrapper* instance;\r
+\r
+        typedef XRRScreenResources* (*tXRRGetScreenResources) (::Display*, ::Window);\r
+        typedef void (*tXRRFreeScreenResources) (XRRScreenResources*);\r
+        typedef XRROutputInfo* (*tXRRGetOutputInfo) (::Display*, XRRScreenResources*, RROutput);\r
+        typedef void (*tXRRFreeOutputInfo) (XRROutputInfo*);\r
+        typedef XRRCrtcInfo* (*tXRRGetCrtcInfo) (::Display*, XRRScreenResources*, RRCrtc);\r
+        typedef void (*tXRRFreeCrtcInfo) (XRRCrtcInfo*);\r
+        typedef RROutput (*tXRRGetOutputPrimary) (::Display*, ::Window);\r
+\r
+        void* libXrandr = nullptr;\r
+        tXRRGetScreenResources getScreenResourcesPtr = nullptr;\r
+        tXRRFreeScreenResources freeScreenResourcesPtr = nullptr;\r
+        tXRRGetOutputInfo getOutputInfoPtr = nullptr;\r
+        tXRRFreeOutputInfo freeOutputInfoPtr = nullptr;\r
+        tXRRGetCrtcInfo getCrtcInfoPtr = nullptr;\r
+        tXRRFreeCrtcInfo freeCrtcInfoPtr = nullptr;\r
+        tXRRGetOutputPrimary getOutputPrimaryPtr = nullptr;\r
+    };\r
+   #endif\r
+\r
+\r
+    static double getDisplayDPI (::Display* display, int index)\r
     {\r
-        // Ubuntu and derived distributions now save a per-display scale factor as a configuration\r
-        // variable. This can be changed in the Monitor system settings panel.\r
-        ChildProcess dconf;\r
+        double dpiX = (DisplayWidth  (display, index) * 25.4) / DisplayWidthMM  (display, index);\r
+        double dpiY = (DisplayHeight (display, index) * 25.4) / DisplayHeightMM (display, index);\r
+        return (dpiX + dpiY) / 2.0;\r
+    }\r
 \r
-        if (File ("/usr/bin/dconf").existsAsFile()\r
-            && dconf.start ("/usr/bin/dconf read /com/ubuntu/user-interface/scale-factor", ChildProcess::wantStdOut))\r
+    static double getScaleForDisplay (const String& name, const ExtendedInfo& info)\r
+    {\r
+        if (! name.isEmpty())\r
         {\r
-            if (dconf.waitForProcessToFinish (200))\r
+            // Ubuntu and derived distributions now save a per-display scale factor as a configuration\r
+            // variable. This can be changed in the Monitor system settings panel.\r
+            ChildProcess dconf;\r
+            if (File ("/usr/bin/dconf").existsAsFile() &&\r
+                dconf.start ("/usr/bin/dconf read /com/ubuntu/user-interface/scale-factor", ChildProcess::wantStdOut))\r
             {\r
-                auto jsonOutput = dconf.readAllProcessOutput().replaceCharacter ('\'', '"');\r
+                if (dconf.waitForProcessToFinish (200))\r
+                {\r
+                    String jsonOutput = dconf.readAllProcessOutput().replaceCharacter ('\'', '"');\r
 \r
-                if (dconf.getExitCode() == 0 && jsonOutput.isNotEmpty())\r
+                    if (dconf.getExitCode() == 0 && jsonOutput.isNotEmpty())\r
+                    {\r
+                        var jsonVar = JSON::parse (jsonOutput);\r
+\r
+                        if (DynamicObject* object = jsonVar.getDynamicObject())\r
+                        {\r
+                            var scaleFactorVar = object->getProperty (name);\r
+                            if (! scaleFactorVar.isVoid())\r
+                            {\r
+                                double scaleFactor = ((double) scaleFactorVar) / 8.0;\r
+\r
+                                if (scaleFactor > 0.0)\r
+                                    return scaleFactor;\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        {\r
+            // Other gnome based distros now use gsettings for a global scale factor\r
+            ChildProcess gsettings;\r
+\r
+            if (File ("/usr/bin/gsettings").existsAsFile()\r
+                 && gsettings.start ("/usr/bin/gsettings get org.gnome.desktop.interface scaling-factor", ChildProcess::wantStdOut))\r
+            {\r
+                if (gsettings.waitForProcessToFinish (200))\r
                 {\r
-                    auto jsonVar = JSON::parse (jsonOutput);\r
+                    auto gsettingsOutput = StringArray::fromTokens (gsettings.readAllProcessOutput(), true);\r
 \r
-                    if (auto* object = jsonVar.getDynamicObject())\r
+                    if (gsettingsOutput.size() >= 2 && gsettingsOutput[1].length() > 0)\r
                     {\r
-                        auto scaleFactorVar = object->getProperty (name);\r
+                        auto scaleFactor = gsettingsOutput[1].getDoubleValue();\r
+\r
+                        if (scaleFactor > 0.0)\r
+                            return scaleFactor;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        // If no scale factor is set by GNOME or Ubuntu then calculate from monitor dpi\r
+        // We use the same approach as chromium which simply divides the dpi by 96\r
+        // and then rounds the result\r
+        return round (info.dpi / 150.0);\r
+    }\r
+\r
+    //==============================================================================\r
+    void queryDisplayInfos (::Display* display, double masterScale) noexcept\r
+    {\r
+        ScopedXLock xlock (display);\r
 \r
-                        if (! scaleFactorVar.isVoid())\r
+       #if JUCE_USE_XRANDR\r
+        {\r
+            int major_opcode, first_event, first_error;\r
+\r
+            if (XQueryExtension (display, "RANDR", &major_opcode, &first_event, &first_error))\r
+            {\r
+                XRandrWrapper& xrandr = XRandrWrapper::getInstance();\r
+\r
+                std::unique_ptr<XRRScreenResources> screens;\r
+\r
+                const int numMonitors = ScreenCount (display);\r
+                RROutput mainDisplay = xrandr.getOutputPrimary (display, RootWindow (display, 0));\r
+\r
+                for (int i = 0; i < numMonitors; ++i)\r
+                {\r
+                    screens.reset (xrandr.getScreenResources (display, RootWindow (display, i)));\r
+\r
+                    if (screens != nullptr)\r
+                    {\r
+                        for (int j = 0; j < screens->noutput; ++j)\r
                         {\r
-                            auto scaleFactor = ((double) scaleFactorVar) / 8.0;\r
+                            if (! screens->outputs[j])\r
+                                continue;\r
+\r
+                            // Xrandr on the raspberry pi fails to determine the main display (mainDisplay == 0)!\r
+                            // Detect this edge case and make the first found display the main display\r
+                            if (! mainDisplay)\r
+                                mainDisplay = screens->outputs[j];\r
+\r
+                            std::unique_ptr<XRROutputInfo> output (xrandr.getOutputInfo (display, screens.get(), screens->outputs[j]));\r
 \r
-                            if (scaleFactor > 0.0)\r
-                                return scaleFactor;\r
+                            if (output != nullptr)\r
+                            {\r
+                                if (! output->crtc)\r
+                                    continue;\r
+\r
+                                std::unique_ptr<XRRCrtcInfo> crtc (xrandr.getCrtcInfo (display, screens.get(), output->crtc));\r
+\r
+                                if (crtc != nullptr)\r
+                                {\r
+                                    ExtendedInfo e;\r
+                                    e.totalBounds = Rectangle<int> (crtc->x, crtc->y,\r
+                                                                    (int) crtc->width, (int) crtc->height);\r
+                                    e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet\r
+                                    e.topLeftScaled = e.totalBounds.getTopLeft();\r
+                                    e.isMain = (mainDisplay == screens->outputs[j]) && (i == 0);\r
+                                    e.dpi = getDisplayDPI (display, 0);\r
+\r
+                                    // The raspberry pi returns a zero sized display, so we need to guard for divide-by-zero\r
+                                    if (output->mm_width > 0 && output->mm_height > 0)\r
+                                        e.dpi = ((static_cast<double> (crtc->width) * 25.4 * 0.5) / static_cast<double> (output->mm_width))\r
+                                            + ((static_cast<double> (crtc->height) * 25.4 * 0.5) / static_cast<double> (output->mm_height));\r
+\r
+                                    double scale = getScaleForDisplay (output->name, e);\r
+                                    scale = (scale <= 0.1 ? 1.0 : scale);\r
+\r
+                                    e.scale = masterScale * scale;\r
+\r
+                                    infos.add (e);\r
+                                }\r
+                            }\r
                         }\r
                     }\r
                 }\r
             }\r
         }\r
+        if (infos.size() == 0)\r
+       #endif\r
+       #if JUCE_USE_XINERAMA\r
+        {\r
+            Array<XineramaScreenInfo> screens = XineramaQueryDisplays (display);\r
+            int numMonitors = screens.size();\r
+\r
+            for (int index = 0; index < numMonitors; ++index)\r
+            {\r
+                for (int j = numMonitors; --j >= 0;)\r
+                {\r
+                    if (screens[j].screen_number == index)\r
+                    {\r
+                        ExtendedInfo e;\r
+                        e.totalBounds = Rectangle<int> (screens[j].x_org,\r
+                                                        screens[j].y_org,\r
+                                                        screens[j].width,\r
+                                                        screens[j].height);\r
+                        e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet\r
+                        e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later\r
+                        e.isMain = (index == 0);\r
+                        e.scale = masterScale;\r
+                        e.dpi = getDisplayDPI (display, 0); // (all screens share the same DPI)\r
+\r
+                        infos.add (e);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        if (infos.size() == 0)\r
+       #endif\r
+        {\r
+            Atom hints = Atoms::getIfExists (display, "_NET_WORKAREA");\r
+\r
+            if (hints != None)\r
+            {\r
+                const int numMonitors = ScreenCount (display);\r
+\r
+                for (int i = 0; i < numMonitors; ++i)\r
+                {\r
+                    GetXProperty prop (display, RootWindow (display, i), hints, 0, 4, false, XA_CARDINAL);\r
+\r
+                    if (prop.success && prop.actualType == XA_CARDINAL && prop.actualFormat == 32 && prop.numItems == 4)\r
+                    {\r
+                        const long* const position = (const long*) prop.data;\r
+\r
+                        ExtendedInfo e;\r
+                        e.totalBounds = Rectangle<int> ((int) position[0], (int) position[1],\r
+                                                        (int) position[2], (int) position[3]);\r
+                        e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet\r
+                        e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later\r
+                        e.isMain = (infos.size() == 0);\r
+                        e.scale = masterScale;\r
+                        e.dpi = getDisplayDPI (display, i);\r
+\r
+                        infos.add (e);\r
+                    }\r
+                }\r
+            }\r
+\r
+            if (infos.size() == 0)\r
+            {\r
+                ExtendedInfo e;\r
+                e.totalBounds = Rectangle<int> (DisplayWidth  (display, DefaultScreen (display)),\r
+                                                DisplayHeight (display, DefaultScreen (display)));\r
+                e.usableBounds = e.totalBounds; // Support for usable area is not implemented in JUCE yet\r
+                e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later\r
+                e.isMain = true;\r
+                e.scale = masterScale;\r
+                e.dpi = getDisplayDPI (display, 0);\r
+\r
+                infos.add (e);\r
+            }\r
+        }\r
     }\r
 \r
+    //==============================================================================\r
+    void updateScaledDisplayCoordinate (bool updateYCoordinates)\r
     {\r
-        // Other gnome based distros now use gsettings for a global scale factor\r
-        ChildProcess gsettings;\r
+        if (infos.size() < 2)\r
+            return;\r
+\r
+        Array<ExtendedInfo*> copy;\r
+\r
+        for (auto& i : infos)\r
+            copy.add (&i);\r
+\r
+        std::sort (copy.begin(), copy.end(), [updateYCoordinates] (const ExtendedInfo* a, const ExtendedInfo* b)\r
+        {\r
+            if (updateYCoordinates)\r
+                return a->totalBounds.getY() < b->totalBounds.getY();\r
 \r
-        if (File ("/usr/bin/gsettings").existsAsFile()\r
-            && gsettings.start ("/usr/bin/gsettings get org.gnome.desktop.interface scaling-factor", ChildProcess::wantStdOut))\r
+            return a->totalBounds.getX() < b->totalBounds.getX();\r
+        });\r
+\r
+        for (int i = 1; i < copy.size(); ++i)\r
         {\r
-            if (gsettings.waitForProcessToFinish (200))\r
+            auto& current = *copy[i];\r
+\r
+            // Is this screen's position aligned to any other previous display?\r
+            for (int j = i - 1; j >= 0; --j)\r
             {\r
-                auto gsettingsOutput = StringArray::fromTokens (gsettings.readAllProcessOutput(), true);\r
+                auto& other = *copy[j];\r
+                auto prevCoordinate = updateYCoordinates ? other.totalBounds.getBottom() : other.totalBounds.getRight();\r
+                auto curCoordinate  = updateYCoordinates ? current.totalBounds.getY() : current.totalBounds.getX();\r
 \r
-                if (gsettingsOutput.size() >= 2 && gsettingsOutput[1].length() > 0)\r
+                if (prevCoordinate == curCoordinate)\r
                 {\r
-                    auto scaleFactor = gsettingsOutput[1].getDoubleValue();\r
+                    // both displays are aligned! As "other" comes before "current" in the array, it must already\r
+                    // have a valid topLeftScaled which we can use\r
+                    auto topLeftScaled = other.topLeftScaled;\r
+                    topLeftScaled += Point<int> (other.totalBounds.getWidth(), other.totalBounds.getHeight()) / other.scale;\r
+\r
+                    if (updateYCoordinates)\r
+                        current.topLeftScaled.setY (topLeftScaled.getY());\r
+                    else\r
+                        current.topLeftScaled.setX (topLeftScaled.getX());\r
 \r
-                    if (scaleFactor > 0.0)\r
-                        return scaleFactor;\r
+                    break;\r
                 }\r
             }\r
         }\r
     }\r
 \r
-    // If no scale factor is set by GNOME or Ubuntu then calculate from monitor dpi\r
-    // We use the same approach as chromium which simply divides the dpi by 96\r
-    // and then rounds the result\r
-    return round (dpi / 150.0);\r
+    void updatePositions()\r
+    {\r
+        updateScaledDisplayCoordinate (false);\r
+        updateScaledDisplayCoordinate (true);\r
+    }\r
+};\r
+\r
+DisplayGeometry* DisplayGeometry::instance = nullptr;\r
+\r
+#if JUCE_USE_XRANDR\r
+DisplayGeometry::XRandrWrapper* DisplayGeometry::XRandrWrapper::instance = nullptr;\r
+\r
+void ContainerDeletePolicy<XRRScreenResources>::destroy (XRRScreenResources* ptr)\r
+{\r
+    if (ptr != nullptr)\r
+        DisplayGeometry::XRandrWrapper::getInstance().freeScreenResources (ptr);\r
+}\r
+\r
+void ContainerDeletePolicy<XRROutputInfo>::destroy (XRROutputInfo* ptr)\r
+{\r
+    if (ptr != nullptr)\r
+        DisplayGeometry::XRandrWrapper::getInstance().freeOutputInfo (ptr);\r
 }\r
 \r
+void ContainerDeletePolicy<XRRCrtcInfo>::destroy (XRRCrtcInfo* ptr)\r
+{\r
+    if (ptr != nullptr)\r
+        DisplayGeometry::XRandrWrapper::getInstance().freeCrtcInfo (ptr);\r
+}\r
+#endif\r
+\r
 //=============================== X11 - Pixmap =================================\r
 \r
 namespace PixmapHelpers\r
@@ -973,8 +1391,8 @@ namespace PixmapHelpers
     {\r
         ScopedXLock xlock (display);\r
 \r
-        auto width = (unsigned int) image.getWidth();\r
-        auto height = (unsigned int) image.getHeight();\r
+        const unsigned int width = (unsigned int) image.getWidth();\r
+        const unsigned int height = (unsigned int) image.getHeight();\r
         HeapBlock<uint32> colour (width * height);\r
         int index = 0;\r
 \r
@@ -1000,9 +1418,9 @@ namespace PixmapHelpers
     {\r
         ScopedXLock xlock (display);\r
 \r
-        auto width = (unsigned int) image.getWidth();\r
-        auto height = (unsigned int) image.getHeight();\r
-        auto stride = (width + 7) >> 3;\r
+        const unsigned int width = (unsigned int) image.getWidth();\r
+        const unsigned int height = (unsigned int) image.getHeight();\r
+        const unsigned int stride = (width + 7) >> 3;\r
         HeapBlock<char> mask;\r
         mask.calloc (stride * height);\r
         const bool msbfirst = (BitmapBitOrder (display) == MSBFirst);\r
@@ -1011,7 +1429,7 @@ namespace PixmapHelpers
         {\r
             for (unsigned int x = 0; x < width; ++x)\r
             {\r
-                auto bit = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
+                const char bit = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
                 const unsigned int offset = y * stride + (x >> 3);\r
 \r
                 if (image.getPixelAt ((int) x, (int) y).getAlpha() >= 128)\r
@@ -1046,12 +1464,12 @@ bool juce_areThereAnyAlwaysOnTopWindows()
 class LinuxComponentPeer  : public ComponentPeer\r
 {\r
 public:\r
-    LinuxComponentPeer (Component& comp, int windowStyleFlags, Window parentToAddTo)\r
+    LinuxComponentPeer (Component& comp, const int windowStyleFlags, Window parentToAddTo)\r
         : ComponentPeer (comp, windowStyleFlags),\r
           isAlwaysOnTop (comp.isAlwaysOnTop())\r
     {\r
         // it's dangerous to create a window on a thread other than the message thread..\r
-        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+        jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
         display = XWindowSystem::getInstance()->displayRef();\r
 \r
@@ -1097,7 +1515,7 @@ public:
     ~LinuxComponentPeer()\r
     {\r
         // it's dangerous to delete a window on a thread other than the message thread..\r
-        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+        jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
        #if JUCE_X11_SUPPORTS_XEMBED\r
         juce_handleXEmbedEvent (this, nullptr);\r
@@ -1200,21 +1618,14 @@ public:
             bounds = newBounds.withSize (jmax (1, newBounds.getWidth()),\r
                                          jmax (1, newBounds.getHeight()));\r
 \r
-            auto& displays = Desktop::getInstance().getDisplays();\r
+            currentScaleFactor = DisplayGeometry::getInstance().findDisplayForRect (bounds, true).scale;\r
 \r
-            auto newScaleFactor = displays.findDisplayForRect (bounds, true).scale;\r
-            if (! approximatelyEqual (newScaleFactor, currentScaleFactor))\r
-            {\r
-                currentScaleFactor = newScaleFactor;\r
-                scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (currentScaleFactor); });\r
-            }\r
-\r
-            auto physicalBounds = displays.logicalToPhysical (bounds);\r
+            auto physicalBounds = DisplayGeometry::scaledToPhysical (bounds);\r
 \r
             WeakReference<Component> deletionChecker (&component);\r
             ScopedXLock xlock (display);\r
 \r
-            auto* hints = XAllocSizeHints();\r
+            XSizeHints* const hints = XAllocSizeHints();\r
             hints->flags  = USSize | USPosition;\r
             hints->x      = physicalBounds.getX();\r
             hints->y      = physicalBounds.getY();\r
@@ -1302,7 +1713,7 @@ public:
                 && ((unsigned long*) prop.data)[0] == IconicState;\r
     }\r
 \r
-    void setFullScreen (bool shouldBeFullScreen) override\r
+    void setFullScreen (const bool shouldBeFullScreen) override\r
     {\r
         auto r = lastNonFullscreenBounds; // (get a copy of this before de-minimising)\r
 \r
@@ -1383,7 +1794,7 @@ public:
         {\r
             for (int i = (int) windowListSize; --i >= 0;)\r
             {\r
-                if (auto* peer = LinuxComponentPeer::getPeerFor (windowList[i]))\r
+                if (LinuxComponentPeer* const peer = LinuxComponentPeer::getPeerFor (windowList[i]))\r
                 {\r
                     result = (peer == this);\r
                     break;\r
@@ -1812,7 +2223,7 @@ public:
         return Point<float> ((float) e.x, (float) e.y) / currentScaleFactor;\r
     }\r
 \r
-    void handleWheelEvent (const XButtonPressedEvent& buttonPressEvent, float amount)\r
+    void handleWheelEvent (const XButtonPressedEvent& buttonPressEvent, const float amount)\r
     {\r
         MouseWheelDetails wheel;\r
         wheel.deltaX = 0.0f;\r
@@ -1974,12 +2385,11 @@ public:
         while (XEventsQueued (display, QueuedAfterFlush) > 0)\r
         {\r
             XPeekEvent (display, &nextEvent);\r
-\r
             if (nextEvent.type != Expose || nextEvent.xany.window != exposeEvent.window)\r
                 break;\r
 \r
             XNextEvent (display, &nextEvent);\r
-            auto& nextExposeEvent = (const XExposeEvent&) nextEvent.xexpose;\r
+            const XExposeEvent& nextExposeEvent = (const XExposeEvent&) nextEvent.xexpose;\r
             repaint (Rectangle<int> (nextExposeEvent.x, nextExposeEvent.y,\r
                                      nextExposeEvent.width, nextExposeEvent.height) / currentScaleFactor);\r
         }\r
@@ -2043,7 +2453,7 @@ public:
     {\r
         if (clientMsg.message_type == atoms->protocols && clientMsg.format == 32)\r
         {\r
-            auto atom = (Atom) clientMsg.data.l[0];\r
+            const Atom atom = (Atom) clientMsg.data.l[0];\r
 \r
             if (atom == atoms->protocolList [Atoms::PING])\r
             {\r
@@ -2105,15 +2515,15 @@ public:
         }\r
     }\r
 \r
-    bool externalDragTextInit (const String& text, std::function<void()> cb)\r
+    bool externalDragTextInit (const String& text)\r
     {\r
         if (dragState->dragging)\r
             return false;\r
 \r
-        return externalDragInit (true, text, cb);\r
+        return externalDragInit (true, text);\r
     }\r
 \r
-    bool externalDragFileInit (const StringArray& files, bool /*canMoveFiles*/, std::function<void()> cb)\r
+    bool externalDragFileInit (const StringArray& files, bool /*canMoveFiles*/)\r
     {\r
         if (dragState->dragging)\r
             return false;\r
@@ -2128,7 +2538,7 @@ public:
                 uriList.add ("file://" + f);\r
         }\r
 \r
-        return externalDragInit (false, uriList.joinIntoString ("\r\n"), cb);\r
+        return externalDragInit (false, uriList.joinIntoString ("\r\n"));\r
     }\r
 \r
     //==============================================================================\r
@@ -2139,7 +2549,7 @@ public:
     }\r
 \r
     //==============================================================================\r
-    double getPlatformScaleFactor() const noexcept override\r
+    double getCurrentScale() noexcept\r
     {\r
         return currentScaleFactor;\r
     }\r
@@ -2229,8 +2639,9 @@ private:
                 ScopedXLock xlock (display);\r
                 XShmSegmentInfo segmentinfo;\r
 \r
-                auto testImage = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)),\r
-                                                  24, ZPixmap, 0, &segmentinfo, 64, 64);\r
+                XImage* const testImage\r
+                    = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)),\r
+                                       24, ZPixmap, 0, &segmentinfo, 64, 64);\r
 \r
                 useARGBImagesForRendering = (testImage->bits_per_pixel == 32);\r
                 XDestroyImage (testImage);\r
@@ -2275,9 +2686,9 @@ private:
             }\r
            #endif\r
 \r
-            auto originalRepaintRegion = regionsNeedingRepaint;\r
+            RectangleList<int>  originalRepaintRegion (regionsNeedingRepaint);\r
             regionsNeedingRepaint.clear();\r
-            auto totalArea = originalRepaintRegion.getBounds();\r
+            const Rectangle<int> totalArea (originalRepaintRegion.getBounds());\r
 \r
             if (! totalArea.isEmpty())\r
             {\r
@@ -2379,7 +2790,7 @@ private:
         unsigned long status;\r
     };\r
 \r
-    static void updateKeyStates (int keycode, bool press) noexcept\r
+    static void updateKeyStates (const int keycode, const bool press) noexcept\r
     {\r
         const int keybyte = keycode >> 3;\r
         const int keybit = (1 << (keycode & 7));\r
@@ -2390,7 +2801,7 @@ private:
             Keys::keyStates [keybyte] &= ~keybit;\r
     }\r
 \r
-    static void updateKeyModifiers (int status) noexcept\r
+    static void updateKeyModifiers (const int status) noexcept\r
     {\r
         int keyMods = 0;\r
 \r
@@ -2404,7 +2815,7 @@ private:
         Keys::capsLock = ((status & LockMask) != 0);\r
     }\r
 \r
-    static bool updateKeyModifiersFromSym (KeySym sym, bool press) noexcept\r
+    static bool updateKeyModifiersFromSym (KeySym sym, const bool press) noexcept\r
     {\r
         int modifier = 0;\r
         bool isModifier = true;\r
@@ -2451,25 +2862,20 @@ private:
     static void updateModifierMappings() noexcept\r
     {\r
         ScopedXLock xlock (display);\r
-        int altLeftCode = XKeysymToKeycode (display, XK_Alt_L);\r
-        int numLockCode = XKeysymToKeycode (display, XK_Num_Lock);\r
+        const int altLeftCode = XKeysymToKeycode (display, XK_Alt_L);\r
+        const int numLockCode = XKeysymToKeycode (display, XK_Num_Lock);\r
 \r
         Keys::AltMask = 0;\r
         Keys::NumLockMask = 0;\r
 \r
-        if (auto* mapping = XGetModifierMapping (display))\r
+        if (XModifierKeymap* const mapping = XGetModifierMapping (display))\r
         {\r
-            for (int modifierIdx = 0; modifierIdx < 8; ++modifierIdx)\r
+            for (int i = 0; i < 8; i++)\r
             {\r
-                for (int keyIndex = 0; keyIndex < mapping->max_keypermod; ++keyIndex)\r
-                {\r
-                    auto key = mapping->modifiermap[(modifierIdx * mapping->max_keypermod) + keyIndex];\r
-\r
-                    if (key == altLeftCode)\r
-                        Keys::AltMask = 1 << modifierIdx;\r
-                    else if (key == numLockCode)\r
-                        Keys::NumLockMask = 1 << modifierIdx;\r
-                }\r
+                if (mapping->modifiermap [i << 1] == altLeftCode)\r
+                    Keys::AltMask = 1 << i;\r
+                else if (mapping->modifiermap [i << 1] == numLockCode)\r
+                    Keys::NumLockMask = 1 << i;\r
             }\r
 \r
             XFreeModifiermap (mapping);\r
@@ -2738,7 +3144,7 @@ private:
     static int64 getEventTime (::Time t)\r
     {\r
         static int64 eventTimeOffset = 0x12345678;\r
-        auto thisMessageTime = (int64) t;\r
+        const int64 thisMessageTime = (int64) t;\r
 \r
         if (eventTimeOffset == 0x12345678)\r
             eventTimeOffset = Time::currentTimeMillis() - thisMessageTime;\r
@@ -2769,7 +3175,7 @@ private:
 \r
                 if (prop.success && prop.actualFormat == 32)\r
                 {\r
-                    auto* sizes = (const unsigned long*) prop.data;\r
+                    const unsigned long* const sizes = (const unsigned long*) prop.data;\r
 \r
                     windowBorder = BorderSize<int> ((int) sizes[2], (int) sizes[0],\r
                                                     (int) sizes[3], (int) sizes[1]);\r
@@ -2794,16 +3200,11 @@ private:
                     wx = wy = 0;\r
 \r
             Rectangle<int> physicalBounds (wx, wy, (int) ww, (int) wh);\r
-            auto& displays = Desktop::getInstance().getDisplays();\r
 \r
-            auto newScaleFactor = displays.findDisplayForRect (physicalBounds, true).scale;\r
-            if (! approximatelyEqual (newScaleFactor, currentScaleFactor))\r
-            {\r
-                currentScaleFactor = newScaleFactor;\r
-                scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (currentScaleFactor); });\r
-            }\r
+            currentScaleFactor =\r
+                DisplayGeometry::getInstance().findDisplayForRect (physicalBounds, false).scale;\r
 \r
-            bounds = displays.physicalToLogical (physicalBounds);\r
+            bounds = DisplayGeometry::physicalToScaled (physicalBounds);\r
         }\r
     }\r
 \r
@@ -2827,7 +3228,6 @@ private:
         Rectangle<int> silentRect;\r
         String textOrFiles;\r
         Array<Atom> allowedTypes;\r
-        std::function<void()> completionCallback;\r
     };\r
 \r
     //==============================================================================\r
@@ -2858,7 +3258,7 @@ private:
         XSendEvent (display, dragAndDropSourceWindow, False, 0, (XEvent*) &msg);\r
     }\r
 \r
-    bool sendExternalDragAndDropMessage (XClientMessageEvent& msg, Window targetWindow)\r
+    bool sendExternalDragAndDropMessage (XClientMessageEvent& msg, const Window targetWindow)\r
     {\r
         msg.type      = ClientMessage;\r
         msg.display   = display;\r
@@ -2870,7 +3270,7 @@ private:
         return XSendEvent (display, targetWindow, False, 0, (XEvent*) &msg) != 0;\r
     }\r
 \r
-    void sendExternalDragAndDropDrop (Window targetWindow)\r
+    void sendExternalDragAndDropDrop (const Window targetWindow)\r
     {\r
         XClientMessageEvent msg;\r
         zerostruct (msg);\r
@@ -2881,7 +3281,7 @@ private:
         sendExternalDragAndDropMessage (msg, targetWindow);\r
     }\r
 \r
-    void sendExternalDragAndDropEnter (Window targetWindow)\r
+    void sendExternalDragAndDropEnter (const Window targetWindow)\r
     {\r
         XClientMessageEvent msg;\r
         zerostruct (msg);\r
@@ -2895,7 +3295,7 @@ private:
         sendExternalDragAndDropMessage (msg, targetWindow);\r
     }\r
 \r
-    void sendExternalDragAndDropPosition (Window targetWindow)\r
+    void sendExternalDragAndDropPosition (const Window targetWindow)\r
     {\r
         XClientMessageEvent msg;\r
         zerostruct (msg);\r
@@ -2907,9 +3307,7 @@ private:
         if (dragState->silentRect.contains (mousePos)) // we've been asked to keep silent\r
             return;\r
 \r
-        auto& displays = Desktop::getInstance().getDisplays();\r
-\r
-        mousePos = displays.logicalToPhysical (mousePos);\r
+        mousePos = DisplayGeometry::scaledToPhysical (mousePos);\r
         msg.data.l[1] = 0;\r
         msg.data.l[2] = (mousePos.x << 16) | mousePos.y;\r
         msg.data.l[3] = CurrentTime;\r
@@ -2918,7 +3316,7 @@ private:
         dragState->expectingStatus = sendExternalDragAndDropMessage (msg, targetWindow);\r
     }\r
 \r
-    void sendDragAndDropStatus (bool acceptDrop, Atom dropAction)\r
+    void sendDragAndDropStatus (const bool acceptDrop, Atom dropAction)\r
     {\r
         XClientMessageEvent msg;\r
         zerostruct (msg);\r
@@ -2930,7 +3328,7 @@ private:
         sendDragAndDropMessage (msg);\r
     }\r
 \r
-    void sendExternalDragAndDropLeave (Window targetWindow)\r
+    void sendExternalDragAndDropLeave (const Window targetWindow)\r
     {\r
         XClientMessageEvent msg;\r
         zerostruct (msg);\r
@@ -3125,7 +3523,7 @@ private:
         srcMimeTypeAtomList.clear();\r
 \r
         dragAndDropCurrentMimeType = 0;\r
-        auto dndCurrentVersion = static_cast<unsigned long> (clientMsg.data.l[1] & 0xff000000) >> 24;\r
+        const unsigned long dndCurrentVersion = static_cast<unsigned long> (clientMsg.data.l[1] & 0xff000000) >> 24;\r
 \r
         if (dndCurrentVersion < 3 || dndCurrentVersion > Atoms::DndVersion)\r
         {\r
@@ -3145,7 +3543,7 @@ private:
                  && prop.actualFormat == 32\r
                  && prop.numItems != 0)\r
             {\r
-                auto* types = (const unsigned long*) prop.data;\r
+                const unsigned long* const types = (const unsigned long*) prop.data;\r
 \r
                 for (unsigned long i = 0; i < prop.numItems; ++i)\r
                     if (types[i] != None)\r
@@ -3153,13 +3551,13 @@ private:
             }\r
         }\r
 \r
-        if (srcMimeTypeAtomList.isEmpty())\r
+        if (srcMimeTypeAtomList.size() == 0)\r
         {\r
             for (int i = 2; i < 5; ++i)\r
                 if (clientMsg.data.l[i] != None)\r
                     srcMimeTypeAtomList.add ((unsigned long) clientMsg.data.l[i]);\r
 \r
-            if (srcMimeTypeAtomList.isEmpty())\r
+            if (srcMimeTypeAtomList.size() == 0)\r
             {\r
                 dragAndDropSourceWindow = 0;\r
                 return;\r
@@ -3240,9 +3638,9 @@ private:
     bool isWindowDnDAware (Window w) const\r
     {\r
         int numProperties = 0;\r
-        auto* properties = XListProperties (display, w, &numProperties);\r
-        bool dndAwarePropFound = false;\r
+        Atom* const properties = XListProperties (display, w, &numProperties);\r
 \r
+        bool dndAwarePropFound = false;\r
         for (int i = 0; i < numProperties; ++i)\r
             if (properties[i] == atoms->XdndAware)\r
                 dndAwarePropFound = true;\r
@@ -3271,7 +3669,7 @@ private:
         return externalFindDragTargetWindow (child);\r
     }\r
 \r
-    bool externalDragInit (bool isText, const String& textOrFiles, std::function<void()> cb)\r
+    bool externalDragInit (bool isText, const String& textOrFiles)\r
     {\r
         ScopedXLock xlock (display);\r
 \r
@@ -3279,7 +3677,6 @@ private:
         dragState->isText = isText;\r
         dragState->textOrFiles = textOrFiles;\r
         dragState->targetWindow = windowH;\r
-        dragState->completionCallback = cb;\r
 \r
         const int pointerGrabMask = Button1MotionMask | ButtonReleaseMask;\r
 \r
@@ -3312,9 +3709,6 @@ private:
             XUngrabPointer (display, CurrentTime);\r
         }\r
 \r
-        if (dragState->completionCallback != nullptr)\r
-            dragState->completionCallback();\r
-\r
         resetExternalDragState();\r
     }\r
 \r
@@ -3425,159 +3819,67 @@ ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindowToAtt
 }\r
 \r
 //==============================================================================\r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
 {\r
     ScopedXDisplay xDisplay;\r
 \r
     if (auto display = xDisplay.display)\r
     {\r
-       #if JUCE_USE_XRANDR\r
-        {\r
-            int major_opcode, first_event, first_error;\r
-\r
-            if (XQueryExtension (display, "RANDR", &major_opcode, &first_event, &first_error))\r
-            {\r
-                auto& xrandr = XRandrWrapper::getInstance();\r
-\r
-                auto numMonitors = ScreenCount (display);\r
-                auto mainDisplay = xrandr.getOutputPrimary (display, RootWindow (display, 0));\r
-\r
-                for (int i = 0; i < numMonitors; ++i)\r
-                {\r
-                    if (auto* screens = xrandr.getScreenResources (display, RootWindow (display, i)))\r
-                    {\r
-                        for (int j = 0; j < screens->noutput; ++j)\r
-                        {\r
-                            if (screens->outputs[j])\r
-                            {\r
-                                // Xrandr on the raspberry pi fails to determine the main display (mainDisplay == 0)!\r
-                                // Detect this edge case and make the first found display the main display\r
-                                if (! mainDisplay)\r
-                                    mainDisplay = screens->outputs[j];\r
-\r
-                                if (auto* output = xrandr.getOutputInfo (display, screens, screens->outputs[j]))\r
-                                {\r
-                                    if (output->crtc)\r
-                                    {\r
-                                        if (auto* crtc = xrandr.getCrtcInfo (display, screens, output->crtc))\r
-                                        {\r
-                                            Display d;\r
-                                            d.totalArea = Rectangle<int> (crtc->x, crtc->y,\r
-                                                                          (int) crtc->width, (int) crtc->height);\r
-                                            d.isMain = (mainDisplay == screens->outputs[j]) && (i == 0);\r
-                                            d.dpi = getDisplayDPI (display, 0);\r
-\r
-                                            // The raspberry pi returns a zero sized display, so we need to guard for divide-by-zero\r
-                                            if (output->mm_width > 0 && output->mm_height > 0)\r
-                                                d.dpi = ((static_cast<double> (crtc->width)  * 25.4 * 0.5) / static_cast<double> (output->mm_width))\r
-                                                      + ((static_cast<double> (crtc->height) * 25.4 * 0.5) / static_cast<double> (output->mm_height));\r
-\r
-                                            double scale = getScaleForDisplay (output->name, d.dpi);\r
-                                            scale = (scale <= 0.1 ? 1.0 : scale);\r
-\r
-                                            d.scale = masterScale * scale;\r
-\r
-                                            if (d.isMain)\r
-                                                displays.insert (0, d);\r
-                                            else\r
-                                                displays.add (d);\r
-\r
-                                            xrandr.freeCrtcInfo (crtc);\r
-                                        }\r
-                                    }\r
-\r
-                                    xrandr.freeOutputInfo (output);\r
-                                }\r
-                            }\r
-                        }\r
+        auto& geometry = DisplayGeometry::getOrCreateInstance (display, masterScale);\r
 \r
-                        xrandr.freeScreenResources (screens);\r
-                    }\r
-                }\r
-            }\r
-        }\r
+        // add the main display first\r
+        int mainDisplayIdx;\r
 \r
-        if (displays.isEmpty())\r
-       #endif\r
-       #if JUCE_USE_XINERAMA\r
+        for (mainDisplayIdx = 0; mainDisplayIdx < geometry.infos.size(); ++mainDisplayIdx)\r
         {\r
-            auto screens = XineramaQueryDisplays (display);\r
-            int numMonitors = screens.size();\r
+            auto& info = geometry.infos.getReference (mainDisplayIdx);\r
 \r
-            for (int index = 0; index < numMonitors; ++index)\r
-            {\r
-                for (int j = numMonitors; --j >= 0;)\r
-                {\r
-                    if (screens[j].screen_number == index)\r
-                    {\r
-                        Display d;\r
-                        d.totalArea = Rectangle<int> (screens[j].x_org,\r
-                                                      screens[j].y_org,\r
-                                                      screens[j].width,\r
-                                                      screens[j].height);\r
-                        d.isMain = (index == 0);\r
-                        d.scale = masterScale;\r
-                        d.dpi = getDisplayDPI (display, 0); // (all screens share the same DPI)\r
-\r
-                        displays.add (d);\r
-                    }\r
-                }\r
-            }\r
+            if (info.isMain)\r
+                break;\r
         }\r
 \r
-        if (displays.isEmpty())\r
-       #endif\r
+        // no main display found then use the first\r
+        if (mainDisplayIdx >= geometry.infos.size())\r
+            mainDisplayIdx = 0;\r
+\r
+        // add the main display\r
         {\r
-            Atom hints = Atoms::getIfExists (display, "_NET_WORKAREA");\r
+            auto& info = geometry.infos.getReference (mainDisplayIdx);\r
 \r
-            if (hints != None)\r
-            {\r
-                auto numMonitors = ScreenCount (display);\r
+            Desktop::Displays::Display d;\r
+            d.isMain = true;\r
+            d.scale = masterScale * info.scale;\r
+            d.dpi = info.dpi;\r
+            d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds);\r
+            d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled;\r
 \r
-                for (int i = 0; i < numMonitors; ++i)\r
-                {\r
-                    GetXProperty prop (display, RootWindow (display, i), hints, 0, 4, false, XA_CARDINAL);\r
+            displays.add (d);\r
+        }\r
 \r
-                    if (prop.success && prop.actualType == XA_CARDINAL && prop.actualFormat == 32 && prop.numItems == 4)\r
-                    {\r
-                        auto position = (const long*) prop.data;\r
+        for (int i = 0; i < geometry.infos.size(); ++i)\r
+        {\r
+            // don't add the main display a second time\r
+            if (i == mainDisplayIdx)\r
+                continue;\r
 \r
-                        Display d;\r
-                        d.totalArea = Rectangle<int> ((int) position[0], (int) position[1],\r
-                                                      (int) position[2], (int) position[3]);\r
-                        d.isMain = displays.isEmpty();\r
-                        d.scale = masterScale;\r
-                        d.dpi = getDisplayDPI (display, i);\r
+            auto& info = geometry.infos.getReference (i);\r
 \r
-                        displays.add (d);\r
-                    }\r
-                }\r
-            }\r
+            Desktop::Displays::Display d;\r
+            d.isMain = false;\r
+            d.scale = masterScale * info.scale;\r
+            d.dpi = info.dpi;\r
+            d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds);\r
+            d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled;\r
 \r
-            if (displays.isEmpty())\r
-            {\r
-                Display d;\r
-                d.totalArea = Rectangle<int> (DisplayWidth  (display, DefaultScreen (display)),\r
-                                              DisplayHeight (display, DefaultScreen (display)));\r
-                d.isMain = true;\r
-                d.scale = masterScale;\r
-                d.dpi = getDisplayDPI (display, 0);\r
-\r
-                displays.add (d);\r
-            }\r
+            displays.add (d);\r
         }\r
-\r
-        for (auto& d : displays)\r
-            d.userArea = d.totalArea; // JUCE currently does not support requesting the user area on Linux\r
-\r
-        updateToLogical();\r
     }\r
 }\r
 \r
 //==============================================================================\r
 bool MouseInputSource::SourceList::addSource()\r
 {\r
-    if (sources.isEmpty())\r
+    if (sources.size() == 0)\r
     {\r
         addSource (0, MouseInputSource::InputSourceType::mouse);\r
         return true;\r
@@ -3594,14 +3896,12 @@ bool MouseInputSource::SourceList::canUseTouch()
 bool Desktop::canUseSemiTransparentWindows() noexcept\r
 {\r
    #if JUCE_USE_XRENDER\r
-    auto display = XWindowSystem::getInstance()->displayRef();\r
-\r
-    if (XRender::hasCompositingWindowManager (display))\r
+    if (XRender::hasCompositingWindowManager())\r
     {\r
         int matchedDepth = 0, desiredDepth = 32;\r
 \r
         return Visuals::findVisualFormat (display, desiredDepth, matchedDepth) != 0\r
-                && matchedDepth == desiredDepth;\r
+                 && matchedDepth == desiredDepth;\r
     }\r
    #endif\r
 \r
@@ -3631,7 +3931,7 @@ Point<float> MouseInputSource::getCurrentRawMousePosition()
         x = y = -1;\r
     }\r
 \r
-    return Desktop::getInstance().getDisplays().physicalToLogical (Point<float> ((float) x, (float) y));\r
+    return DisplayGeometry::physicalToScaled (Point<float> ((float) x, (float) y));\r
 }\r
 \r
 void MouseInputSource::setRawMousePosition (Point<float> newPosition)\r
@@ -3642,7 +3942,7 @@ void MouseInputSource::setRawMousePosition (Point<float> newPosition)
     {\r
         ScopedXLock xlock (display);\r
         Window root = RootWindow (display, DefaultScreen (display));\r
-        newPosition = Desktop::getInstance().getDisplays().logicalToPhysical (newPosition);\r
+        newPosition = DisplayGeometry::scaledToPhysical (newPosition);\r
         XWarpPointer (display, None, root, 0, 0, 0, 0, roundToInt (newPosition.getX()), roundToInt (newPosition.getY()));\r
     }\r
 }\r
@@ -3660,7 +3960,7 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
 //==============================================================================\r
 static bool screenSaverAllowed = true;\r
 \r
-void Desktop::setScreenSaverEnabled (bool isEnabled)\r
+void Desktop::setScreenSaverEnabled (const bool isEnabled)\r
 {\r
     if (screenSaverAllowed != isEnabled)\r
     {\r
@@ -3705,7 +4005,7 @@ void LookAndFeel::playAlertSound()
 Rectangle<int> juce_LinuxScaledToPhysicalBounds (ComponentPeer* peer, Rectangle<int> bounds)\r
 {\r
     if (auto* linuxPeer = dynamic_cast<LinuxComponentPeer*> (peer))\r
-        bounds *= linuxPeer->getPlatformScaleFactor();\r
+        bounds *= linuxPeer->getCurrentScale();\r
 \r
     return bounds;\r
 }\r
@@ -3793,17 +4093,17 @@ void* CustomMouseCursorInfo::create() const
         return nullptr;\r
 \r
     ScopedXLock xlock (display);\r
-    auto imageW = (unsigned int) image.getWidth();\r
-    auto imageH = (unsigned int) image.getHeight();\r
+    const unsigned int imageW = (unsigned int) image.getWidth();\r
+    const unsigned int imageH = (unsigned int) image.getHeight();\r
     int hotspotX = hotspot.x;\r
     int hotspotY = hotspot.y;\r
 \r
   #if JUCE_USE_XCURSOR\r
     {\r
-        using tXcursorSupportsARGB    = XcursorBool (*) (Display*);\r
-        using tXcursorImageCreate     = XcursorImage* (*) (int, int);\r
-        using tXcursorImageDestroy    = void (*) (XcursorImage*);\r
-        using tXcursorImageLoadCursor = Cursor (*) (Display*, const XcursorImage*);\r
+        typedef XcursorBool (*tXcursorSupportsARGB) (Display*);\r
+        typedef XcursorImage* (*tXcursorImageCreate) (int, int);\r
+        typedef void (*tXcursorImageDestroy) (XcursorImage*);\r
+        typedef Cursor (*tXcursorImageLoadCursor) (Display*, const XcursorImage*);\r
 \r
         static tXcursorSupportsARGB    xcursorSupportsARGB    = nullptr;\r
         static tXcursorImageCreate     xcursorImageCreate     = nullptr;\r
@@ -3886,10 +4186,10 @@ void* CustomMouseCursorInfo::create() const
     {\r
         for (int x = (int) cursorW; --x >= 0;)\r
         {\r
-            auto mask = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
-            auto offset = (unsigned int) y * stride + ((unsigned int) x >> 3);\r
+            const char mask = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
+            const unsigned int offset = (unsigned int) y * stride + ((unsigned int) x >> 3);\r
 \r
-            auto c = im.getPixelAt (x, y);\r
+            const Colour c (im.getPixelAt (x, y));\r
 \r
             if (c.getAlpha() >= 128)        maskPlane[offset]   |= mask;\r
             if (c.getBrightness() >= 0.5f)  sourcePlane[offset] |= mask;\r
@@ -3912,7 +4212,7 @@ void* CustomMouseCursorInfo::create() const
     return result;\r
 }\r
 \r
-void MouseCursor::deleteMouseCursor (void* cursorHandle, bool)\r
+void MouseCursor::deleteMouseCursor (void* const cursorHandle, const bool)\r
 {\r
     if (cursorHandle != nullptr)\r
     {\r
@@ -3985,6 +4285,12 @@ void MouseCursor::showInWindow (ComponentPeer* peer) const
         lp->showMouseCursor ((Cursor) getHandle());\r
 }\r
 \r
+void MouseCursor::showInAllWindows() const\r
+{\r
+    for (int i = ComponentPeer::getNumPeers(); --i >= 0;)\r
+        showInWindow (ComponentPeer::getPeer (i));\r
+}\r
+\r
 //=================================== X11 - DND ================================\r
 static LinuxComponentPeer* getPeerForDragEvent (Component* sourceComp)\r
 {\r
@@ -4000,28 +4306,27 @@ static LinuxComponentPeer* getPeerForDragEvent (Component* sourceComp)
     return nullptr;\r
 }\r
 \r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, bool canMoveFiles,\r
-                                                           Component* sourceComp, std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMoveFiles,\r
+                                                           Component* sourceComp)\r
 {\r
-    if (files.isEmpty())\r
+    if (files.size() == 0)\r
         return false;\r
 \r
     if (auto* lp = getPeerForDragEvent (sourceComp))\r
-        return lp->externalDragFileInit (files, canMoveFiles, callback);\r
+        return lp->externalDragFileInit (files, canMoveFiles);\r
 \r
     // This method must be called in response to a component's mouseDown or mouseDrag event!\r
     jassertfalse;\r
     return false;\r
 }\r
 \r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComp,\r
-                                                          std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComp)\r
 {\r
     if (text.isEmpty())\r
         return false;\r
 \r
     if (auto* lp = getPeerForDragEvent (sourceComp))\r
-        return lp->externalDragTextInit (text, callback);\r
+        return lp->externalDragTextInit (text);\r
 \r
     // This method must be called in response to a component's mouseDown or mouseDrag event!\r
     jassertfalse;\r
index 69c838cea5ae9e9429038f0087ef80663174434e..3fcc32eed829aa94ca06e66d2a8d1ffd6c02f21c 100644 (file)
@@ -202,22 +202,13 @@ private:
 \r
         exitModalState (0);\r
 \r
-        if (panel != nil && result ==\r
-                             #if defined (MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9\r
-                               NSModalResponseOK)\r
-                             #else\r
-                               NSFileHandlingPanelOKButton)\r
-                             #endif\r
+        if (panel != nil && result == NSFileHandlingPanelOKButton)\r
         {\r
             auto addURLResult = [&chooserResults] (NSURL* urlToAdd)\r
             {\r
                 auto scheme = nsStringToJuce ([urlToAdd scheme]);\r
-                auto pathComponents = StringArray::fromTokens (nsStringToJuce ([urlToAdd path]), "/", {});\r
-\r
-                for (auto& component : pathComponents)\r
-                    component = URL::addEscapeChars (component, false);\r
-\r
-                chooserResults.add (URL (scheme + "://" + pathComponents.joinIntoString ("/")));\r
+                auto path = nsStringToJuce ([urlToAdd path]);\r
+                chooserResults.add (URL (scheme + "://" + path));\r
             };\r
 \r
             if (isSave)\r
@@ -227,7 +218,7 @@ private:
             else\r
             {\r
                 auto* openPanel = (NSOpenPanel*) panel;\r
-                auto urls = [openPanel URLs];\r
+                auto* urls = [openPanel URLs];\r
 \r
                 for (unsigned int i = 0; i < [urls count]; ++i)\r
                     addURLResult ([urls objectAtIndex: i]);\r
index 50798a678636960b17dfb735f6a6c2abc168333c..c41fe5b30adeb8ddbf614de00d22d023c0b2b5df 100644 (file)
@@ -33,11 +33,11 @@ struct JuceMainMenuBarHolder : private DeletedAtShutdown
     JuceMainMenuBarHolder()\r
         : mainMenuBar ([[NSMenu alloc] initWithTitle: nsStringLiteral ("MainMenu")])\r
     {\r
-        auto item = [mainMenuBar addItemWithTitle: nsStringLiteral ("Apple")\r
-                                           action: nil\r
+        auto* item = [mainMenuBar addItemWithTitle: nsStringLiteral ("Apple")\r
+                                            action: nil\r
                                      keyEquivalent: nsEmptyString()];\r
 \r
-        auto appMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Apple")];\r
+        auto* appMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Apple")];\r
 \r
         [NSApp performSelector: @selector (setAppleMenu:) withObject: appMenu];\r
         [mainMenuBar setSubmenu: appMenu forItem: item];\r
@@ -277,9 +277,9 @@ public:
         }\r
         else\r
         {\r
-            auto item = [[NSMenuItem alloc] initWithTitle: text\r
-                                                   action: @selector (menuItemInvoked:)\r
-                                            keyEquivalent: nsEmptyString()];\r
+            auto* item = [[NSMenuItem alloc] initWithTitle: text\r
+                                                    action: @selector (menuItemInvoked:)\r
+                                             keyEquivalent: nsEmptyString()];\r
 \r
             [item setTag: topLevelIndex];\r
             [item setEnabled: i.isEnabled];\r
@@ -478,9 +478,9 @@ private:
     {\r
         if (isPositiveAndBelow (menuItemIndex, (int) [parentMenu numberOfItems]))\r
         {\r
-            auto menuItem = [parentMenu itemAtIndex:menuItemIndex];\r
+            auto* menuItem = [parentMenu itemAtIndex:menuItemIndex];\r
 \r
-            if (auto submenu = [menuItem submenu])\r
+            if (auto* submenu = [menuItem submenu])\r
                 removeItemRecursive (submenu);\r
 \r
             [parentMenu removeItem:menuItem];\r
@@ -706,7 +706,7 @@ namespace MainMenuHelpers
             {\r
                 if ([mainMenu numberOfItems] > 0)\r
                 {\r
-                    if (auto appMenu = [[mainMenu itemAtIndex: 0] submenu])\r
+                    if (auto* appMenu = [[mainMenu itemAtIndex:0] submenu])\r
                     {\r
                         [appMenu removeAllItems];\r
                         MainMenuHelpers::createStandardAppMenu (appMenu, app->getApplicationName(), extraItems);\r
@@ -765,7 +765,7 @@ const PopupMenu* MenuBarModel::getMacExtraAppleItemsMenu()
     return nullptr;\r
 }\r
 \r
-using MenuTrackingChangedCallback = void (*)(bool);\r
+typedef void (*MenuTrackingChangedCallback) (bool);\r
 extern MenuTrackingChangedCallback menuTrackingChangedCallback;\r
 \r
 static void mainMenuTrackingChanged (bool isTracking)\r
index 26a5c9bba09e8a28aa8afea5d4f7fa4001f8effa..c59f347b2763509dca31399a5171810c0cf5a362 100644 (file)
@@ -164,6 +164,11 @@ void MouseCursor::deleteMouseCursor (void* const cursorHandle, const bool /*isSt
     [((NSCursor*) cursorHandle) release];\r
 }\r
 \r
+void MouseCursor::showInAllWindows() const\r
+{\r
+    showInWindow (nullptr);\r
+}\r
+\r
 void MouseCursor::showInWindow (ComponentPeer*) const\r
 {\r
     auto c = (NSCursor*) getHandle();\r
@@ -179,6 +184,7 @@ void MouseCursor::showInWindow (ComponentPeer*) const
 void* CustomMouseCursorInfo::create() const                                              { return nullptr; }\r
 void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType)           { return nullptr; }\r
 void MouseCursor::deleteMouseCursor (void*, bool)                                        {}\r
+void MouseCursor::showInAllWindows() const                                               {}\r
 void MouseCursor::showInWindow (ComponentPeer*) const                                    {}\r
 \r
 #endif\r
index 5d1de18b3b5d06b4fa55b707b3b0a2efa1e409ed..520cb77b8069ec11d582dcc32af48f5f61b013c9 100644 (file)
@@ -64,6 +64,10 @@ static NSRect flippedScreenRect (NSRect r) noexcept
     return r;\r
 }\r
 \r
+#if JUCE_MODULE_AVAILABLE_juce_opengl\r
+void componentPeerAboutToChange (Component&, bool);\r
+#endif\r
+\r
 //==============================================================================\r
 class NSViewComponentPeer  : public ComponentPeer,\r
                              private Timer\r
@@ -71,7 +75,6 @@ class NSViewComponentPeer  : public ComponentPeer,
 public:\r
     NSViewComponentPeer (Component& comp, const int windowStyleFlags, NSView* viewToAttachTo)\r
         : ComponentPeer (comp, windowStyleFlags),\r
-          safeComponent (&comp),\r
           isSharedWindow (viewToAttachTo != nil),\r
           lastRepaintTime (Time::getMillisecondCounter())\r
     {\r
@@ -92,6 +95,24 @@ public:
                                     name: NSViewFrameDidChangeNotification\r
                                   object: view];\r
 \r
+        if (! isSharedWindow)\r
+        {\r
+            [notificationCenter  addObserver: view\r
+                                    selector: @selector (frameChanged:)\r
+                                        name: NSWindowDidMoveNotification\r
+                                      object: window];\r
+\r
+            [notificationCenter  addObserver: view\r
+                                    selector: @selector (frameChanged:)\r
+                                        name: NSWindowDidMiniaturizeNotification\r
+                                      object: window];\r
+\r
+            [notificationCenter  addObserver: view\r
+                                    selector: @selector (frameChanged:)\r
+                                        name: NSWindowDidDeminiaturizeNotification\r
+                                      object: window];\r
+        }\r
+\r
         [view setPostsFrameChangedNotifications: YES];\r
 \r
         if (isSharedWindow)\r
@@ -116,14 +137,7 @@ public:
            #else\r
             [window setDelegate: window];\r
            #endif\r
-\r
             [window setOpaque: component.isOpaque()];\r
-\r
-           #if defined (MAC_OS_X_VERSION_10_14)\r
-            if (! [window isOpaque])\r
-                [window setBackgroundColor: [NSColor clearColor]];\r
-           #endif\r
-\r
             [window setHasShadow: ((windowStyleFlags & windowHasDropShadow) != 0)];\r
 \r
             if (component.isAlwaysOnTop())\r
@@ -153,26 +167,6 @@ public:
             if ([window respondsToSelector: @selector (setTabbingMode:)])\r
                 [window setTabbingMode:NSWindowTabbingModeDisallowed];\r
            #endif\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: @selector (frameChanged:)\r
-                                        name: NSWindowDidMoveNotification\r
-                                      object: window];\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: @selector (frameChanged:)\r
-                                        name: NSWindowDidMiniaturizeNotification\r
-                                      object: window];\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: @selector (windowWillMiniaturize:)\r
-                                        name: NSWindowWillMiniaturizeNotification\r
-                                      object: window];\r
-\r
-            [notificationCenter  addObserver: view\r
-                                    selector: @selector (windowDidDeminiaturize:)\r
-                                        name: NSWindowDidDeminiaturizeNotification\r
-                                      object: window];\r
         }\r
 \r
         auto alpha = component.getAlpha();\r
@@ -222,10 +216,7 @@ public:
     {\r
         if (isSharedWindow)\r
         {\r
-            if (shouldBeVisible)\r
-                [view setHidden: false];\r
-            else if ([window firstResponder] != view || ([window firstResponder] == view && [window makeFirstResponder: nil]))\r
-                [view setHidden: true];\r
+            [view setHidden: ! shouldBeVisible];\r
         }\r
         else\r
         {\r
@@ -487,14 +478,10 @@ public:
     bool setAlwaysOnTop (bool alwaysOnTop) override\r
     {\r
         if (! isSharedWindow)\r
-        {\r
             [window setLevel: alwaysOnTop ? ((getStyleFlags() & windowIsTemporary) != 0 ? NSPopUpMenuWindowLevel\r
                                                                                         : NSFloatingWindowLevel)\r
                                           : NSNormalWindowLevel];\r
 \r
-            isAlwaysOnTop = alwaysOnTop;\r
-        }\r
-\r
         return true;\r
     }\r
 \r
@@ -718,11 +705,12 @@ public:
 \r
     void redirectWillMoveToWindow (NSWindow* newWindow)\r
     {\r
-        if (isSharedWindow && [view window] == window && newWindow == nullptr)\r
-        {\r
-            if (auto* comp = safeComponent.get())\r
-                comp->setVisible (false);\r
-        }\r
+       #if JUCE_MODULE_AVAILABLE_juce_opengl\r
+        if ([view window] == window)\r
+            componentPeerAboutToChange (getComponent(), newWindow == nullptr);\r
+       #else\r
+        ignoreUnused (newWindow);\r
+       #endif\r
     }\r
 \r
     void sendMouseEvent (NSEvent* ev)\r
@@ -792,7 +780,7 @@ public:
     {\r
         // (need to retain this in case a modal loop runs in handleKeyEvent and\r
         // our event object gets lost)\r
-        const std::unique_ptr<NSEvent, NSObjectDeleter> r ([ev retain]);\r
+        const NSObjectRetainer<NSEvent> r (ev);\r
 \r
         updateKeysDown (ev, true);\r
         bool used = handleKeyEvent (ev, true);\r
@@ -822,7 +810,7 @@ public:
     void redirectModKeyChange (NSEvent* ev)\r
     {\r
         // (need to retain this in case a modal loop runs and our event object gets lost)\r
-        const std::unique_ptr<NSEvent, NSObjectDeleter> r ([ev retain]);\r
+        const NSObjectRetainer<NSEvent> r (ev);\r
 \r
         keysCurrentlyDown.clear();\r
         handleKeyUpOrDown (true);\r
@@ -1058,15 +1046,7 @@ public:
     void viewMovedToWindow()\r
     {\r
         if (isSharedWindow)\r
-        {\r
-            auto newWindow = [view window];\r
-            bool shouldSetVisible = (window == nullptr && newWindow != nullptr);\r
-\r
-            window = newWindow;\r
-\r
-            if (shouldSetVisible)\r
-                getComponent().setVisible (true);\r
-        }\r
+            window = [view window];\r
     }\r
 \r
     void liveResizingStart()\r
@@ -1402,7 +1382,6 @@ public:
     //==============================================================================\r
     NSWindow* window = nil;\r
     NSView* view = nil;\r
-    WeakReference<Component> safeComponent;\r
     bool isSharedWindow = false, fullScreen = false;\r
     bool isWindowInKioskMode = false;\r
    #if USE_COREGRAPHICS_RENDERING\r
@@ -1413,7 +1392,6 @@ public:
     bool isZooming = false, isFirstLiveResize = false, textWasInserted = false;\r
     bool isStretchingTop = false, isStretchingLeft = false, isStretchingBottom = false, isStretchingRight = false;\r
     bool windowRepresentsFile = false;\r
-    bool isAlwaysOnTop = false, wasAlwaysOnTop = false;\r
     String stringBeingComposed;\r
     NSNotificationCenter* notificationCenter = nil;\r
 \r
@@ -1583,8 +1561,6 @@ struct JuceNSViewClass   : public ObjCClass<NSView>
         addMethod (@selector (magnifyWithEvent:),             magnify,                    "v@:@");\r
         addMethod (@selector (acceptsFirstMouse:),            acceptsFirstMouse,          "c@:@");\r
         addMethod (@selector (frameChanged:),                 frameChanged,               "v@:@");\r
-        addMethod (@selector (windowWillMiniaturize:),        windowWillMiniaturize,      "v@:@");\r
-        addMethod (@selector (windowDidDeminiaturize:),       windowDidDeminiaturize,     "v@:@");\r
         addMethod (@selector (wantsDefaultClipping:),         wantsDefaultClipping,       "c@:");\r
         addMethod (@selector (worksWhenModal),                worksWhenModal,             "c@:");\r
         addMethod (@selector (viewDidMoveToWindow),           viewDidMoveToWindow,        "v@:");\r
@@ -1680,32 +1656,6 @@ private:
     static void frameChanged (id self, SEL, NSNotification*)   { if (auto* p = getOwner (self)) p->redirectMovedOrResized(); }\r
     static void viewDidMoveToWindow (id self, SEL)             { if (auto* p = getOwner (self)) p->viewMovedToWindow(); }\r
 \r
-    static void windowWillMiniaturize (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* p = getOwner (self))\r
-        {\r
-            if (p->isAlwaysOnTop)\r
-            {\r
-                // there is a bug when restoring minimised always on top windows so we need\r
-                // to remove this behaviour before minimising and restore it afterwards\r
-                p->setAlwaysOnTop (false);\r
-                p->wasAlwaysOnTop = true;\r
-            }\r
-        }\r
-    }\r
-\r
-    static void windowDidDeminiaturize (id self, SEL, NSNotification*)\r
-    {\r
-        if (auto* p = getOwner (self))\r
-        {\r
-            if (p->wasAlwaysOnTop)\r
-            {\r
-                p->setAlwaysOnTop (true);\r
-                p->redirectMovedOrResized();\r
-            }\r
-        }\r
-    }\r
-\r
     static BOOL isOpaque (id self, SEL)\r
     {\r
         auto* owner = getOwner (self);\r
index a3e348b62ca69e76ae5caf30a4fc10707ba03954..dc77f04c12417a83ab20580aa94e2691dcba0415 100644 (file)
@@ -167,7 +167,7 @@ static NSRect getDragRect (NSView* view, NSEvent* event)
 static NSView* getNSViewForDragEvent (Component* sourceComp)\r
 {\r
     if (sourceComp == nullptr)\r
-        if (auto* draggingSource = Desktop::getInstance().getDraggingMouseSource (0))\r
+        if (auto* draggingSource = Desktop::getInstance().getDraggingMouseSource(0))\r
             sourceComp = draggingSource->getComponentUnderMouse();\r
 \r
     if (sourceComp != nullptr)\r
@@ -177,22 +177,14 @@ static NSView* getNSViewForDragEvent (Component* sourceComp)
     return nil;\r
 }\r
 \r
-struct NSDraggingSourceHelper   : public ObjCClass<NSObject<NSDraggingSource>>\r
+struct TextDragDataProviderClass   : public ObjCClass<NSObject>\r
 {\r
-    NSDraggingSourceHelper() : ObjCClass<NSObject<NSDraggingSource>> ("JUCENSDraggingSourceHelper_")\r
+    TextDragDataProviderClass()  : ObjCClass<NSObject> ("JUCE_NSTextDragDataProvider_")\r
     {\r
-        addIvar<std::function<void()>*> ("callback");\r
         addIvar<String*> ("text");\r
-        addIvar<NSDragOperation*> ("operation");\r
-\r
         addMethod (@selector (dealloc), dealloc, "v@:");\r
         addMethod (@selector (pasteboard:item:provideDataForType:), provideDataForType, "v@:@@@");\r
-\r
-        addMethod (@selector (draggingSession:sourceOperationMaskForDraggingContext:), sourceOperationMaskForDraggingContext, "c@:@@");\r
-        addMethod (@selector (draggingSession:endedAtPoint:operation:), draggingSessionEnded, "v@:@@@");\r
-\r
         addProtocol (@protocol (NSPasteboardItemDataProvider));\r
-\r
         registerClass();\r
     }\r
 \r
@@ -201,23 +193,10 @@ struct NSDraggingSourceHelper   : public ObjCClass<NSObject<NSDraggingSource>>
         object_setInstanceVariable (self, "text", new String (text));\r
     }\r
 \r
-    static void setCompletionCallback (id self, std::function<void()> cb)\r
-    {\r
-        object_setInstanceVariable (self, "callback", new std::function<void()> (cb));\r
-    }\r
-\r
-    static void setDragOperation (id self, NSDragOperation op)\r
-    {\r
-        object_setInstanceVariable (self, "operation", new NSDragOperation (op));\r
-    }\r
-\r
 private:\r
     static void dealloc (id self, SEL)\r
     {\r
         delete getIvar<String*> (self, "text");\r
-        delete getIvar<std::function<void()>*> (self, "callback");\r
-        delete getIvar<NSDragOperation*> (self, "operation");\r
-\r
         sendSuperclassMessage (self, @selector (dealloc));\r
     }\r
 \r
@@ -228,30 +207,9 @@ private:
                 [sender setData: [juceStringToNS (*text) dataUsingEncoding: NSUTF8StringEncoding]\r
                         forType: NSPasteboardTypeString];\r
     }\r
-\r
-    static NSDragOperation sourceOperationMaskForDraggingContext (id self, SEL, NSDraggingSession*, NSDraggingContext)\r
-    {\r
-        return *getIvar<NSDragOperation*> (self, "operation");\r
-    }\r
-\r
-    static void draggingSessionEnded (id self, SEL, NSDraggingSession*, NSPoint p, NSDragOperation)\r
-    {\r
-        // Our view doesn't receive a mouse up when the drag ends so we need to generate one here and send it...\r
-        if (auto* view = getNSViewForDragEvent (nullptr))\r
-        {\r
-            auto* cgEvent = CGEventCreateMouseEvent (nullptr, kCGEventLeftMouseUp, CGPointMake (p.x, p.y), kCGMouseButtonLeft);\r
-            [view mouseUp: [NSEvent eventWithCGEvent:cgEvent]];\r
-        }\r
-\r
-        if (auto* cb = getIvar<std::function<void()>*> (self, "callback"))\r
-            cb->operator()();\r
-    }\r
 };\r
 \r
-static NSDraggingSourceHelper draggingSourceHelper;\r
-\r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComponent,\r
-                                                          std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComponent)\r
 {\r
     if (text.isEmpty())\r
         return false;\r
@@ -260,33 +218,28 @@ bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Co
     {\r
         JUCE_AUTORELEASEPOOL\r
         {\r
-            if (auto event = [[view window] currentEvent])\r
+            if (auto* event = [[view window] currentEvent])\r
             {\r
-                id helper = [draggingSourceHelper.createInstance() init];\r
-                NSDraggingSourceHelper::setText (helper, text);\r
-                NSDraggingSourceHelper::setDragOperation (helper, NSDragOperationCopy);\r
+                static TextDragDataProviderClass dataProviderClass;\r
+                id delegate = [dataProviderClass.createInstance() init];\r
+                TextDragDataProviderClass::setText (delegate, text);\r
 \r
-                if (callback != nullptr)\r
-                    NSDraggingSourceHelper::setCompletionCallback (helper, callback);\r
-\r
-                auto pasteboardItem = [[NSPasteboardItem new] autorelease];\r
-                [pasteboardItem setDataProvider: helper\r
+                auto* pasteboardItem = [[NSPasteboardItem new] autorelease];\r
+                [pasteboardItem setDataProvider: delegate\r
                                        forTypes: [NSArray arrayWithObjects: NSPasteboardTypeString, nil]];\r
 \r
-                auto dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter: pasteboardItem] autorelease];\r
+                auto* dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter: pasteboardItem] autorelease];\r
 \r
                 NSImage* image = [[NSWorkspace sharedWorkspace] iconForFile: nsEmptyString()];\r
                 [dragItem setDraggingFrame: getDragRect (view, event) contents: image];\r
 \r
-                if (auto session = [view beginDraggingSessionWithItems: [NSArray arrayWithObject: dragItem]\r
-                                                                 event: event\r
-                                                                source: helper])\r
-                {\r
-                    session.animatesToStartingPositionsOnCancelOrFail = YES;\r
-                    session.draggingFormation = NSDraggingFormationNone;\r
+                auto* draggingSession = [view beginDraggingSessionWithItems: [NSArray arrayWithObject: dragItem]\r
+                                                                      event: event\r
+                                                                     source: delegate];\r
 \r
-                    return true;\r
-                }\r
+                draggingSession.animatesToStartingPositionsOnCancelOrFail = YES;\r
+                draggingSession.draggingFormation = NSDraggingFormationNone;\r
+                return true;\r
             }\r
         }\r
     }\r
@@ -294,8 +247,24 @@ bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Co
     return false;\r
 }\r
 \r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, bool canMoveFiles,\r
-                                                           Component* sourceComponent, std::function<void()> callback)\r
+struct NSDraggingSourceHelper   : public ObjCClass<NSObject<NSDraggingSource>>\r
+{\r
+    NSDraggingSourceHelper() : ObjCClass<NSObject<NSDraggingSource>> ("JUCENSDraggingSourceHelper_")\r
+    {\r
+        addMethod (@selector (draggingSession:sourceOperationMaskForDraggingContext:), sourceOperationMaskForDraggingContext, "c@:@@");\r
+        registerClass();\r
+    }\r
+\r
+    static NSDragOperation sourceOperationMaskForDraggingContext (id, SEL, NSDraggingSession*, NSDraggingContext)\r
+    {\r
+        return NSDragOperationCopy;\r
+    }\r
+};\r
+\r
+static NSDraggingSourceHelper draggingSourceHelper;\r
+\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, bool /*canMoveFiles*/,\r
+                                                           Component* sourceComponent)\r
 {\r
     if (files.isEmpty())\r
         return false;\r
@@ -304,20 +273,20 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi
     {\r
         JUCE_AUTORELEASEPOOL\r
         {\r
-            if (auto event = [[view window] currentEvent])\r
+            if (auto* event = [[view window] currentEvent])\r
             {\r
-                auto dragItems = [[[NSMutableArray alloc] init] autorelease];\r
+                auto* dragItems = [[[NSMutableArray alloc] init] autorelease];\r
 \r
                 for (auto& filename : files)\r
                 {\r
                     auto* nsFilename = juceStringToNS (filename);\r
-                    auto fileURL = [NSURL fileURLWithPath: nsFilename];\r
-                    auto dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL];\r
+                    auto* fileURL = [NSURL fileURLWithPath: nsFilename];\r
+                    auto* dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL];\r
 \r
                     auto eventPos = [event locationInWindow];\r
                     auto dragRect = [view convertRect: NSMakeRect (eventPos.x - 16.0f, eventPos.y - 16.0f, 32.0f, 32.0f)\r
                                              fromView: nil];\r
-                    auto dragImage = [[NSWorkspace sharedWorkspace] iconForFile: nsFilename];\r
+                    auto* dragImage = [[NSWorkspace sharedWorkspace] iconForFile: nsFilename];\r
                     [dragItem setDraggingFrame: dragRect\r
                                       contents: dragImage];\r
 \r
@@ -325,17 +294,11 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi
                     [dragItem release];\r
                 }\r
 \r
-                auto helper = [draggingSourceHelper.createInstance() autorelease];\r
-\r
-                if (callback != nullptr)\r
-                    NSDraggingSourceHelper::setCompletionCallback (helper, callback);\r
-\r
-                NSDraggingSourceHelper::setDragOperation (helper, canMoveFiles ? NSDragOperationMove\r
-                                                                               : NSDragOperationCopy);\r
+                auto* helper = [draggingSourceHelper.createInstance() autorelease];\r
 \r
                 return [view beginDraggingSessionWithItems: dragItems\r
                                                      event: event\r
-                                                    source: helper] != nullptr;\r
+                                                    source: helper];\r
             }\r
         }\r
     }\r
@@ -465,18 +428,18 @@ struct DisplaySettingsChangeCallback  : private DeletedAtShutdown
 {\r
     DisplaySettingsChangeCallback()\r
     {\r
-        CGDisplayRegisterReconfigurationCallback (displayReconfigurationCallBack, nullptr);\r
+        CGDisplayRegisterReconfigurationCallback (displayReconfigurationCallBack, 0);\r
     }\r
 \r
     ~DisplaySettingsChangeCallback()\r
     {\r
-        CGDisplayRemoveReconfigurationCallback (displayReconfigurationCallBack, nullptr);\r
+        CGDisplayRemoveReconfigurationCallback (displayReconfigurationCallBack, 0);\r
         clearSingletonInstance();\r
     }\r
 \r
     static void displayReconfigurationCallBack (CGDirectDisplayID, CGDisplayChangeSummaryFlags, void*)\r
     {\r
-        const_cast<Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+        const_cast<Desktop::Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
     }\r
 \r
     JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL (DisplaySettingsChangeCallback)\r
@@ -492,9 +455,9 @@ static Rectangle<int> convertDisplayRect (NSRect r, CGFloat mainScreenBottom)
     return convertToRectInt (r);\r
 }\r
 \r
-static Displays::Display getDisplayFromScreen (NSScreen* s, CGFloat& mainScreenBottom, const float masterScale)\r
+static Desktop::Displays::Display getDisplayFromScreen (NSScreen* s, CGFloat& mainScreenBottom, const float masterScale)\r
 {\r
-    Displays::Display d;\r
+    Desktop::Displays::Display d;\r
 \r
     d.isMain = (mainScreenBottom == 0);\r
 \r
@@ -516,7 +479,7 @@ static Displays::Display getDisplayFromScreen (NSScreen* s, CGFloat& mainScreenB
     return d;\r
 }\r
 \r
-void Displays::findDisplays (const float masterScale)\r
+void Desktop::Displays::findDisplays (const float masterScale)\r
 {\r
     JUCE_AUTORELEASEPOOL\r
     {\r
index 7d7a6c9129d8d0f0370fccb6f40a24046d400f2f..5db2b1266a6a987f581e9ed5aa8241774cf89587 100644 (file)
@@ -241,112 +241,49 @@ namespace DragAndDropHelpers
         return hDrop;\r
     }\r
 \r
-    struct DragAndDropJob   : public ThreadPoolJob\r
+    bool performDragDrop (FORMATETC* const format, STGMEDIUM* const medium, const DWORD whatToDo)\r
     {\r
-        DragAndDropJob (FORMATETC f, STGMEDIUM m, DWORD d, std::function<void()> cb)\r
-            : ThreadPoolJob ("DragAndDrop"),\r
-              format (f), medium (m), whatToDo (d),\r
-              completionCallback (cb)\r
-        {\r
-        }\r
-\r
-        JobStatus runJob() override\r
-        {\r
-            OleInitialize (0);\r
-\r
-            auto source = new JuceDropSource();\r
-            auto data = new JuceDataObject (source, &format, &medium);\r
-\r
-            DWORD effect;\r
-            DoDragDrop (data, source, whatToDo, &effect);\r
-\r
-            data->Release();\r
-            source->Release();\r
-\r
-            if (completionCallback != nullptr)\r
-                MessageManager::callAsync (completionCallback);\r
-\r
-            return jobHasFinished;\r
-        }\r
-\r
-        FORMATETC format;\r
-        STGMEDIUM medium;\r
-        DWORD whatToDo;\r
-\r
-        std::function<void()> completionCallback;\r
-    };\r
+        auto source = new JuceDropSource();\r
+        auto data   = new JuceDataObject (source, format, medium);\r
 \r
-    class ThreadPoolHolder   : private DeletedAtShutdown\r
-    {\r
-    public:\r
-        ThreadPoolHolder() = default;\r
+        DWORD effect;\r
+        auto res = DoDragDrop (data, source, whatToDo, &effect);\r
 \r
-        ~ThreadPoolHolder()\r
-        {\r
-            // Wait forever if there's a job running. The user needs to cancel the transfer\r
-            // in the GUI.\r
-            pool.removeAllJobs (true, -1);\r
+        data->Release();\r
+        source->Release();\r
 \r
-            clearSingletonInstance();\r
-        }\r
-\r
-        juce_DeclareSingleton_SingleThreaded (ThreadPoolHolder, true)\r
-\r
-        // We need to make sure we don't do simultaneous text and file drag and drops,\r
-        // so use a pool that can only run a single job.\r
-        ThreadPool pool { 1 };\r
-    };\r
-\r
-    juce_ImplementSingleton_SingleThreaded (ThreadPoolHolder)\r
+        return res == DRAGDROP_S_DROP;\r
+    }\r
 }\r
 \r
 //==============================================================================\r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMove,\r
-                                                           Component*, std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMove, Component*)\r
 {\r
-    if (files.isEmpty())\r
-        return false;\r
-\r
     FORMATETC format = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r
     STGMEDIUM medium = { TYMED_HGLOBAL, { 0 }, 0 };\r
 \r
     medium.hGlobal = DragAndDropHelpers::createHDrop (files);\r
 \r
-    auto& pool = DragAndDropHelpers::ThreadPoolHolder::getInstance()->pool;\r
-    pool.addJob (new DragAndDropHelpers::DragAndDropJob (format, medium,\r
-                                                         canMove ? (DROPEFFECT_COPY | DROPEFFECT_MOVE) : DROPEFFECT_COPY,\r
-                                                         callback),\r
-                true);\r
-\r
-    return true;\r
+    return DragAndDropHelpers::performDragDrop (&format, &medium, canMove ? (DWORD) (DROPEFFECT_COPY | DROPEFFECT_MOVE)\r
+                                                                          : (DWORD) DROPEFFECT_COPY);\r
 }\r
 \r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component*, std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component*)\r
 {\r
-    if (text.isEmpty())\r
-        return false;\r
-\r
     FORMATETC format = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r
     STGMEDIUM medium = { TYMED_HGLOBAL, { 0 }, 0 };\r
 \r
     auto numBytes = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
 \r
     medium.hGlobal = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, numBytes + 2);\r
-    auto* data = static_cast<WCHAR*> (GlobalLock (medium.hGlobal));\r
+    WCHAR* const data = static_cast<WCHAR*> (GlobalLock (medium.hGlobal));\r
 \r
-    text.copyToUTF16 (data, numBytes + 2);\r
+    text.copyToUTF16 (data, numBytes);\r
     format.cfFormat = CF_UNICODETEXT;\r
 \r
     GlobalUnlock (medium.hGlobal);\r
 \r
-    auto& pool = DragAndDropHelpers::ThreadPoolHolder::getInstance()->pool;\r
-    pool.addJob (new DragAndDropHelpers::DragAndDropJob (format,\r
-                                                        medium,\r
-                                                        DROPEFFECT_COPY | DROPEFFECT_MOVE,\r
-                                                        callback),\r
-                 true);\r
-\r
-    return true;\r
+    return DragAndDropHelpers::performDragDrop (&format, &medium, DROPEFFECT_COPY | DROPEFFECT_MOVE);\r
 }\r
 \r
 } // namespace juce\r
index c216822112ba648395afc58ddd7d788efdd8d83a..84bb8ce84cd868799dd6d18810d00b4ebc161955 100644 (file)
  #include <juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h>\r
 #endif\r
 \r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
- #include <juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h>\r
-#endif\r
-\r
 namespace juce\r
 {\r
 \r
@@ -193,21 +189,21 @@ extern void* getUser32Function (const char*);
 \r
  struct POINTER_INFO\r
  {\r
-     POINTER_INPUT_TYPE         pointerType;\r
-     UINT32                     pointerId;\r
-     UINT32                     frameId;\r
-     POINTER_FLAGS              pointerFlags;\r
-     HANDLE                     sourceDevice;\r
-     HWND                       hwndTarget;\r
-     POINT                      ptPixelLocation;\r
-     POINT                      ptHimetricLocation;\r
-     POINT                      ptPixelLocationRaw;\r
-     POINT                      ptHimetricLocationRaw;\r
-     DWORD                      dwTime;\r
-     UINT32                     historyCount;\r
-     INT32                      InputData;\r
-     DWORD                      dwKeyStates;\r
-     UINT64                     PerformanceCount;\r
+     POINTER_INPUT_TYPE    pointerType;\r
+     UINT32          pointerId;\r
+     UINT32          frameId;\r
+     POINTER_FLAGS   pointerFlags;\r
+     HANDLE          sourceDevice;\r
+     HWND            hwndTarget;\r
+     POINT           ptPixelLocation;\r
+     POINT           ptHimetricLocation;\r
+     POINT           ptPixelLocationRaw;\r
+     POINT           ptHimetricLocationRaw;\r
+     DWORD           dwTime;\r
+     UINT32          historyCount;\r
+     INT32           InputData;\r
+     DWORD           dwKeyStates;\r
+     UINT64          PerformanceCount;\r
      POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;\r
  };\r
 \r
@@ -237,48 +233,37 @@ extern void* getUser32Function (const char*);
 #endif\r
 \r
 #ifndef MONITOR_DPI_TYPE\r
- enum Monitor_DPI_Type\r
- {\r
-     MDT_Effective_DPI = 0,\r
-     MDT_Angular_DPI   = 1,\r
-     MDT_Raw_DPI       = 2,\r
-     MDT_Default       = MDT_Effective_DPI\r
- };\r
-#endif\r
-\r
-#ifndef DPI_AWARENESS\r
- enum DPI_Awareness\r
- {\r
-     DPI_Awareness_Invalid           = -1,\r
-     DPI_Awareness_Unaware           = 0,\r
-     DPI_Awareness_System_Aware      = 1,\r
-     DPI_Awareness_Per_Monitor_Aware = 2\r
- };\r
-#endif\r
-\r
-#ifndef USER_DEFAULT_SCREEN_DPI\r
- #define USER_DEFAULT_SCREEN_DPI 96\r
+  enum Monitor_DPI_Type\r
+  {\r
+    MDT_Effective_DPI  = 0,\r
+    MDT_Angular_DPI    = 1,\r
+    MDT_Raw_DPI        = 2,\r
+    MDT_Default        = MDT_Effective_DPI\r
+  };\r
+\r
+  enum Process_DPI_Awareness\r
+  {\r
+    Process_DPI_Unaware            = 0,\r
+    Process_System_DPI_Aware       = 1,\r
+    Process_Per_Monitor_DPI_Aware  = 2\r
+  };\r
 #endif\r
 \r
-#ifndef _DPI_AWARENESS_CONTEXTS_\r
- typedef HANDLE DPI_AWARENESS_CONTEXT;\r
-\r
- #define DPI_AWARENESS_CONTEXT_UNAWARE              ((DPI_AWARENESS_CONTEXT) - 1)\r
- #define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE         ((DPI_AWARENESS_CONTEXT) - 2)\r
- #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE    ((DPI_AWARENESS_CONTEXT) - 3)\r
- #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT) - 4)\r
-#endif\r
-\r
-//==============================================================================\r
-typedef BOOL (WINAPI* RegisterTouchWindowFunc)   (HWND, ULONG);\r
-typedef BOOL (WINAPI* GetTouchInputInfoFunc)     (HTOUCHINPUT, UINT, TOUCHINPUT*, int);\r
+typedef BOOL (WINAPI* RegisterTouchWindowFunc) (HWND, ULONG);\r
+typedef BOOL (WINAPI* GetTouchInputInfoFunc) (HTOUCHINPUT, UINT, TOUCHINPUT*, int);\r
 typedef BOOL (WINAPI* CloseTouchInputHandleFunc) (HTOUCHINPUT);\r
-typedef BOOL (WINAPI* GetGestureInfoFunc)        (HGESTUREINFO, GESTUREINFO*);\r
-\r
-static RegisterTouchWindowFunc   registerTouchWindow   = nullptr;\r
-static GetTouchInputInfoFunc     getTouchInputInfo     = nullptr;\r
-static CloseTouchInputHandleFunc closeTouchInputHandle = nullptr;\r
-static GetGestureInfoFunc        getGestureInfo        = nullptr;\r
+typedef BOOL (WINAPI* GetGestureInfoFunc) (HGESTUREINFO, GESTUREINFO*);\r
+typedef BOOL (WINAPI* SetProcessDPIAwareFunc)();\r
+typedef BOOL (WINAPI* SetProcessDPIAwarenessFunc) (Process_DPI_Awareness);\r
+typedef HRESULT (WINAPI* GetDPIForMonitorFunc) (HMONITOR, Monitor_DPI_Type, UINT*, UINT*);\r
+\r
+static RegisterTouchWindowFunc    registerTouchWindow = nullptr;\r
+static GetTouchInputInfoFunc      getTouchInputInfo = nullptr;\r
+static CloseTouchInputHandleFunc  closeTouchInputHandle = nullptr;\r
+static GetGestureInfoFunc         getGestureInfo = nullptr;\r
+static SetProcessDPIAwareFunc     setProcessDPIAware = nullptr;\r
+static SetProcessDPIAwarenessFunc setProcessDPIAwareness = nullptr;\r
+static GetDPIForMonitorFunc       getDPIForMonitor = nullptr;\r
 \r
 static bool hasCheckedForMultiTouch = false;\r
 \r
@@ -297,304 +282,105 @@ static bool canUseMultiTouch()
     return registerTouchWindow != nullptr;\r
 }\r
 \r
-//==============================================================================\r
-typedef BOOL (WINAPI* GetPointerTypeFunc)      (UINT32, POINTER_INPUT_TYPE*);\r
+typedef BOOL (WINAPI* GetPointerTypeFunc) (UINT32, POINTER_INPUT_TYPE*);\r
 typedef BOOL (WINAPI* GetPointerTouchInfoFunc) (UINT32, POINTER_TOUCH_INFO*);\r
-typedef BOOL (WINAPI* GetPointerPenInfoFunc)   (UINT32, POINTER_PEN_INFO*);\r
+typedef BOOL (WINAPI* GetPointerPenInfoFunc) (UINT32, POINTER_PEN_INFO*);\r
 \r
 static GetPointerTypeFunc      getPointerTypeFunction = nullptr;\r
-static GetPointerTouchInfoFunc getPointerTouchInfo    = nullptr;\r
-static GetPointerPenInfoFunc   getPointerPenInfo      = nullptr;\r
+static GetPointerTouchInfoFunc getPointerTouchInfo = nullptr;\r
+static GetPointerPenInfoFunc   getPointerPenInfo = nullptr;\r
 \r
 static bool canUsePointerAPI = false;\r
 \r
 static void checkForPointerAPI()\r
 {\r
-    getPointerTypeFunction = (GetPointerTypeFunc)      getUser32Function ("GetPointerType");\r
+    getPointerTypeFunction = (GetPointerTypeFunc) getUser32Function ("GetPointerType");\r
     getPointerTouchInfo    = (GetPointerTouchInfoFunc) getUser32Function ("GetPointerTouchInfo");\r
-    getPointerPenInfo      = (GetPointerPenInfoFunc)   getUser32Function ("GetPointerPenInfo");\r
+    getPointerPenInfo      = (GetPointerPenInfoFunc) getUser32Function ("GetPointerPenInfo");\r
 \r
     canUsePointerAPI = (getPointerTypeFunction != nullptr\r
                      && getPointerTouchInfo    != nullptr\r
                      && getPointerPenInfo      != nullptr);\r
 }\r
 \r
-//==============================================================================\r
-typedef BOOL                  (WINAPI* SetProcessDPIAwareFunc)                  ();\r
-typedef BOOL                  (WINAPI* SetProcessDPIAwarenessContextFunc)       (DPI_AWARENESS_CONTEXT);\r
-typedef BOOL                  (WINAPI* SetProcessDPIAwarenessFunc)              (DPI_Awareness);\r
-typedef DPI_AWARENESS_CONTEXT (WINAPI* SetThreadDPIAwarenessContextFunc)        (DPI_AWARENESS_CONTEXT);\r
-typedef HRESULT               (WINAPI* GetDPIForMonitorFunc)                    (HMONITOR, Monitor_DPI_Type, UINT*, UINT*);\r
-typedef UINT                  (WINAPI* GetDPIForWindowFunc)                     (HWND);\r
-typedef HRESULT               (WINAPI* GetProcessDPIAwarenessFunc)              (HANDLE, DPI_Awareness*);\r
-typedef DPI_AWARENESS_CONTEXT (WINAPI* GetWindowDPIAwarenessContextFunc)        (HWND);\r
-typedef DPI_AWARENESS_CONTEXT (WINAPI* GetThreadDPIAwarenessContextFunc)        ();\r
-typedef DPI_Awareness         (WINAPI* GetAwarenessFromDpiAwarenessContextFunc) (DPI_AWARENESS_CONTEXT);\r
-typedef BOOL                  (WINAPI* EnableNonClientDPIScalingFunc)           (HWND);\r
-\r
-static SetProcessDPIAwareFunc                  setProcessDPIAware                  = nullptr;\r
-static SetProcessDPIAwarenessContextFunc       setProcessDPIAwarenessContext       = nullptr;\r
-static SetProcessDPIAwarenessFunc              setProcessDPIAwareness              = nullptr;\r
-static SetThreadDPIAwarenessContextFunc        setThreadDPIAwarenessContext        = nullptr;\r
-static GetDPIForMonitorFunc                    getDPIForMonitor                    = nullptr;\r
-static GetDPIForWindowFunc                     getDPIForWindow                     = nullptr;\r
-static GetProcessDPIAwarenessFunc              getProcessDPIAwareness              = nullptr;\r
-static GetWindowDPIAwarenessContextFunc        getWindowDPIAwarenessContext        = nullptr;\r
-static GetThreadDPIAwarenessContextFunc        getThreadDPIAwarenessContext        = nullptr;\r
-static GetAwarenessFromDpiAwarenessContextFunc getAwarenessFromDPIAwarenessContext = nullptr;\r
-static EnableNonClientDPIScalingFunc           enableNonClientDPIScaling           = nullptr;\r
-\r
-static bool hasCheckedForDPIAwareness = false;\r
-\r
-static void setDPIAwareness()\r
-{\r
-    if (hasCheckedForDPIAwareness)\r
-        return;\r
-\r
-    hasCheckedForDPIAwareness = true;\r
-\r
-   #if ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    if (! JUCEApplicationBase::isStandaloneApp())\r
-        return;\r
-   #endif\r
-\r
-    HMODULE shcoreModule = GetModuleHandleA ("SHCore.dll");\r
-\r
-    if (shcoreModule != 0)\r
-    {\r
-        getDPIForMonitor = (GetDPIForMonitorFunc) GetProcAddress (shcoreModule, "GetDpiForMonitor");\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        getDPIForWindow                     = (GetDPIForWindowFunc) getUser32Function ("GetDpiForWindow");\r
-        getProcessDPIAwareness              = (GetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "GetProcessDpiAwareness");\r
-        getWindowDPIAwarenessContext        = (GetWindowDPIAwarenessContextFunc) getUser32Function ("GetWindowDpiAwarenessContext");\r
-        getThreadDPIAwarenessContext        = (GetThreadDPIAwarenessContextFunc) getUser32Function ("GetThreadDpiAwarenessContext");\r
-        getAwarenessFromDPIAwarenessContext = (GetAwarenessFromDpiAwarenessContextFunc) getUser32Function ("GetAwarenessFromDpiAwarenessContext");\r
-        setThreadDPIAwarenessContext        = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext");\r
-\r
-        // Only set the DPI awareness context of the process if we are a standalone app\r
-        if (! JUCEApplicationBase::isStandaloneApp())\r
-            return;\r
-\r
-        setProcessDPIAwarenessContext = (SetProcessDPIAwarenessContextFunc) getUser32Function ("SetProcessDpiAwarenessContext");\r
-\r
-        if (setProcessDPIAwarenessContext != nullptr\r
-            && SUCCEEDED (setProcessDPIAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)))\r
-            return;\r
-\r
-        setProcessDPIAwareness    = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness");\r
-        enableNonClientDPIScaling = (EnableNonClientDPIScalingFunc) getUser32Function ("EnableNonClientDpiScaling");\r
-\r
-        if (setProcessDPIAwareness != nullptr && enableNonClientDPIScaling != nullptr\r
-            && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_Per_Monitor_Aware)))\r
-            return;\r
-       #endif\r
-\r
-        if (setProcessDPIAwareness == nullptr)\r
-            setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness");\r
-\r
-        if (setProcessDPIAwareness != nullptr && getDPIForMonitor != nullptr\r
-             && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_System_Aware)))\r
-            return;\r
-    }\r
-\r
-    // fallback for pre Windows 8.1 - equivalent to Process_System_DPI_Aware\r
-    setProcessDPIAware = (SetProcessDPIAwareFunc) getUser32Function ("SetProcessDPIAware");\r
-\r
-    if (setProcessDPIAware != nullptr)\r
-        setProcessDPIAware();\r
-}\r
-\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- static bool isPerMonitorDPIAwareProcess()\r
- {\r
-     static bool dpiAware = []() -> bool\r
-     {\r
-         setDPIAwareness();\r
-\r
-         if (getProcessDPIAwareness == nullptr)\r
-             return false;\r
-\r
-         DPI_Awareness context;\r
-         getProcessDPIAwareness (0, &context);\r
-\r
-         return context == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware;\r
-     }();\r
-\r
-     return dpiAware;\r
- }\r
-#endif\r
-\r
-static bool isPerMonitorDPIAwareWindow (HWND h)\r
-{\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    jassert (h != nullptr);\r
-\r
-    setDPIAwareness();\r
-\r
-    if (getWindowDPIAwarenessContext != nullptr && getAwarenessFromDPIAwarenessContext != nullptr)\r
-        return getAwarenessFromDPIAwarenessContext (getWindowDPIAwarenessContext (h)) == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware;\r
-\r
-    return isPerMonitorDPIAwareProcess();\r
-   #else\r
-    ignoreUnused (h);\r
-    return false;\r
-   #endif\r
-}\r
-\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- static bool isPerMonitorDPIAwareThread()\r
- {\r
-     setDPIAwareness();\r
-\r
-     if (getThreadDPIAwarenessContext != nullptr && getAwarenessFromDPIAwarenessContext != nullptr)\r
-         return getAwarenessFromDPIAwarenessContext (getThreadDPIAwarenessContext()) == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware;\r
-\r
-     return isPerMonitorDPIAwareProcess();\r
- }\r
-#endif\r
-\r
-static double getGlobalDPI()\r
-{\r
-    setDPIAwareness();\r
-\r
-    HDC dc = GetDC (0);\r
-    auto dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0;\r
-    ReleaseDC (0, dc);\r
-    return dpi;\r
-}\r
-\r
-//==============================================================================\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
- ScopedDPIAwarenessDisabler::ScopedDPIAwarenessDisabler()\r
- {\r
-     if (! isPerMonitorDPIAwareThread())\r
-         return;\r
-\r
-     if (setThreadDPIAwarenessContext != nullptr)\r
-         previousContext = setThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE);\r
- }\r
-\r
- ScopedDPIAwarenessDisabler::~ScopedDPIAwarenessDisabler()\r
- {\r
-     if (previousContext != nullptr)\r
-         setThreadDPIAwarenessContext ((DPI_AWARENESS_CONTEXT)previousContext);\r
- }\r
-#endif\r
-\r
-//==============================================================================\r
 typedef void (*SettingChangeCallbackFunc) (void);\r
 extern SettingChangeCallbackFunc settingChangeCallback;\r
 \r
-//==============================================================================\r
-static Rectangle<int> rectangleFromRECT (const RECT& r) noexcept    { return { r.left, r.top, r.right - r.left, r.bottom - r.top }; }\r
-static RECT RECTFromRectangle (const Rectangle<int>& r) noexcept    { return { r.getX(), r.getY(), r.getRight(), r.getBottom() }; }\r
-\r
-static Point<int> pointFromPOINT (const POINT& p) noexcept          { return { p.x, p.y }; }\r
-static POINT POINTFromPoint (const Point<int>& p) noexcept          { return { p.x, p.y }; }\r
-\r
-//==============================================================================\r
-static const Displays::Display* getCurrentDisplayFromScaleFactor (HWND hwnd);\r
-\r
-static Rectangle<int> convertPhysicalScreenRectangleToLogical (const Rectangle<int>& r, HWND h) noexcept\r
+static Rectangle<int> rectangleFromRECT (const RECT& r) noexcept\r
 {\r
-    if (isPerMonitorDPIAwareWindow (h))\r
-        return Desktop::getInstance().getDisplays().physicalToLogical (r, getCurrentDisplayFromScaleFactor (h));\r
-\r
-    return r;\r
+    return Rectangle<int>::leftTopRightBottom ((int) r.left, (int) r.top, (int) r.right, (int) r.bottom);\r
 }\r
 \r
-static Rectangle<int> convertLogicalScreenRectangleToPhysical (const Rectangle<int>& r, HWND h) noexcept\r
+static void setWindowPos (HWND hwnd, Rectangle<int> bounds, UINT flags)\r
 {\r
-    if (isPerMonitorDPIAwareWindow (h))\r
-        return Desktop::getInstance().getDisplays().logicalToPhysical (r, getCurrentDisplayFromScaleFactor (h));\r
-\r
-    return r;\r
+    SetWindowPos (hwnd, 0, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), flags);\r
 }\r
 \r
-static Point<int> convertPhysicalScreenPointToLogical (const Point<int>& p, HWND h) noexcept\r
+static RECT getWindowRect (HWND hwnd)\r
 {\r
-    if (isPerMonitorDPIAwareWindow (h))\r
-        return Desktop::getInstance().getDisplays().physicalToLogical (p, getCurrentDisplayFromScaleFactor (h));\r
-\r
-    return p;\r
+    RECT r;\r
+    GetWindowRect (hwnd, &r);\r
+    return r;\r
 }\r
 \r
-static double getScaleFactorForWindow (HWND h)\r
+static void setWindowZOrder (HWND hwnd, HWND insertAfter)\r
 {\r
-    if (isPerMonitorDPIAwareWindow (h) && getDPIForWindow != nullptr)\r
-        return (double) getDPIForWindow (h) / USER_DEFAULT_SCREEN_DPI;\r
-\r
-    return 1.0;\r
+    SetWindowPos (hwnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);\r
 }\r
 \r
 //==============================================================================\r
-static void setWindowPos (HWND hwnd, Rectangle<int> bounds, UINT flags, bool adjustTopLeft = false)\r
+static void setDPIAwareness()\r
 {\r
-    if (isPerMonitorDPIAwareWindow (hwnd))\r
+   #if ! JUCE_DISABLE_WIN32_DPI_AWARENESS\r
+    if (JUCEApplicationBase::isStandaloneApp())\r
     {\r
-        if (adjustTopLeft)\r
-            bounds = convertLogicalScreenRectangleToPhysical (bounds, hwnd)\r
-                      .withPosition (Desktop::getInstance().getDisplays().logicalToPhysical (bounds.getTopLeft()));\r
-        else\r
-            bounds = convertLogicalScreenRectangleToPhysical (bounds, hwnd);\r
-    }\r
+        if (setProcessDPIAwareness == nullptr)\r
+        {\r
+            HMODULE shcoreModule = GetModuleHandleA ("SHCore.dll");\r
 \r
-    SetWindowPos (hwnd, 0, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), flags);\r
-}\r
+            if (shcoreModule != 0)\r
+            {\r
+                setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness");\r
+                getDPIForMonitor = (GetDPIForMonitorFunc) GetProcAddress (shcoreModule, "GetDpiForMonitor");\r
 \r
-static RECT getWindowRect (HWND hwnd)\r
-{\r
-    RECT r;\r
-    GetWindowRect (hwnd, &r);\r
+                if (setProcessDPIAwareness != nullptr && getDPIForMonitor != nullptr\r
+//                     && SUCCEEDED (setProcessDPIAwareness (Process_Per_Monitor_DPI_Aware)))\r
+                     && SUCCEEDED (setProcessDPIAwareness (Process_System_DPI_Aware))) // (keep using this mode temporarily..)\r
+                    return;\r
+            }\r
 \r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    auto windowDPIAware = isPerMonitorDPIAwareWindow (hwnd);\r
-    auto threadDPIAware = isPerMonitorDPIAwareThread();\r
+            if (setProcessDPIAware == nullptr)\r
+            {\r
+                setProcessDPIAware = (SetProcessDPIAwareFunc) getUser32Function ("SetProcessDPIAware");\r
 \r
-    // If these don't match then we need to convert the RECT returned from GetWindowRect() as it depends\r
-    // on the DPI awareness of the calling thread\r
-    if (windowDPIAware != threadDPIAware)\r
-    {\r
-        if (! windowDPIAware)\r
-        {\r
-            // Thread is per-monitor DPI aware so RECT needs to be converted from physical to logical for\r
-            // the DPI unaware window\r
-            return RECTFromRectangle (Desktop::getInstance().getDisplays().physicalToLogical (rectangleFromRECT (r)));\r
-        }\r
-        else if (! threadDPIAware)\r
-        {\r
-            // Thread is DPI unaware so RECT needs to be converted from logical to physical for the per-monitor\r
-            // DPI aware window\r
-            return RECTFromRectangle (Desktop::getInstance().getDisplays().logicalToPhysical (rectangleFromRECT (r)));\r
+                if (setProcessDPIAware != nullptr)\r
+                    setProcessDPIAware();\r
+            }\r
         }\r
     }\r
    #endif\r
-\r
-    return r;\r
 }\r
 \r
-static void setWindowZOrder (HWND hwnd, HWND insertAfter)\r
+static double getGlobalDPI()\r
 {\r
-    SetWindowPos (hwnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);\r
+    setDPIAwareness();\r
+\r
+    HDC dc = GetDC (0);\r
+    const double dpi = (GetDeviceCaps (dc, LOGPIXELSX)\r
+                      + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0;\r
+    ReleaseDC (0, dc);\r
+    return dpi;\r
 }\r
 \r
-//==============================================================================\r
 double Desktop::getDefaultMasterScale()\r
 {\r
-    if (! JUCEApplicationBase::isStandaloneApp())\r
-        return 1.0;\r
-\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    if (isPerMonitorDPIAwareProcess())\r
-        return 1.0;\r
-   #endif\r
-\r
-    return getGlobalDPI() / USER_DEFAULT_SCREEN_DPI;\r
+    return JUCEApplicationBase::isStandaloneApp() ? getGlobalDPI() / 96.0\r
+                                                  : 1.0;\r
 }\r
 \r
-bool Desktop::canUseSemiTransparentWindows() noexcept { return true; }\r
+bool Desktop::canUseSemiTransparentWindows() noexcept       { return true; }\r
 \r
+//==============================================================================\r
 Desktop::DisplayOrientation Desktop::getCurrentOrientation() const\r
 {\r
     return upright;\r
@@ -1204,7 +990,7 @@ public:
     };\r
 \r
     //==============================================================================\r
-    HWNDComponentPeer (Component& comp, int windowStyleFlags, HWND parent, bool nonRepainting)\r
+    HWNDComponentPeer (Component& comp, const int windowStyleFlags, HWND parent, bool nonRepainting)\r
         : ComponentPeer (comp, windowStyleFlags),\r
           dontRepaint (nonRepainting),\r
           parentToAddTo (parent),\r
@@ -1213,7 +999,15 @@ public:
         callFunctionIfNotLocked (&createWindowCallback, this);\r
 \r
         setTitle (component.getName());\r
-        updateShadower();\r
+\r
+        if ((windowStyleFlags & windowHasDropShadow) != 0\r
+             && ((! hasTitleBar()) || SystemStats::getOperatingSystemType() < SystemStats::WinVista))\r
+        {\r
+            shadower.reset (component.getLookAndFeel().createDropShadowerForComponent (&component));\r
+\r
+            if (shadower != nullptr)\r
+                shadower->setOwner (&component);\r
+        }\r
 \r
         // make sure that the on-screen keyboard code is loaded\r
         OnScreenKeyboard::getInstance();\r
@@ -1275,7 +1069,7 @@ public:
     void setTitle (const String& title) override\r
     {\r
         // Unfortunately some ancient bits of win32 mean you can only perform this operation from the message thread.\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
+        jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
         SetWindowText (hwnd, title.toWideCharPointer());\r
     }\r
@@ -1292,10 +1086,10 @@ public:
         info.cbSize = sizeof (info);\r
 \r
         if (GetWindowInfo (hwnd, &info))\r
-            windowBorder = BorderSize<int> (roundToInt ((info.rcClient.top    - info.rcWindow.top)    / scaleFactor),\r
-                                            roundToInt ((info.rcClient.left   - info.rcWindow.left)   / scaleFactor),\r
-                                            roundToInt ((info.rcWindow.bottom - info.rcClient.bottom) / scaleFactor),\r
-                                            roundToInt ((info.rcWindow.right  - info.rcClient.right)  / scaleFactor));\r
+            windowBorder = BorderSize<int> (info.rcClient.top - info.rcWindow.top,\r
+                                            info.rcClient.left - info.rcWindow.left,\r
+                                            info.rcWindow.bottom - info.rcClient.bottom,\r
+                                            info.rcWindow.right - info.rcClient.right);\r
 \r
        #if JUCE_DIRECT2D\r
         if (direct2DContext != nullptr)\r
@@ -1313,13 +1107,12 @@ public:
         {\r
             if (auto parentHwnd = GetParent (hwnd))\r
             {\r
-                auto parentRect = convertPhysicalScreenRectangleToLogical (rectangleFromRECT (getWindowRect (parentHwnd)), hwnd);\r
-                newBounds.translate (parentRect.getX(), parentRect.getY());\r
+                auto parentRect = getWindowRect (parentHwnd);\r
+                newBounds.translate (parentRect.left, parentRect.top);\r
             }\r
         }\r
 \r
         auto oldBounds = getBounds();\r
-\r
         const bool hasMoved = (oldBounds.getPosition() != bounds.getPosition());\r
         const bool hasResized = (oldBounds.getWidth() != bounds.getWidth()\r
                                   || oldBounds.getHeight() != bounds.getHeight());\r
@@ -1328,7 +1121,7 @@ public:
         if (! hasMoved)    flags |= SWP_NOMOVE;\r
         if (! hasResized)  flags |= SWP_NOSIZE;\r
 \r
-        setWindowPos (hwnd, newBounds, flags, ! isInDPIChange);\r
+        setWindowPos (hwnd, newBounds, flags);\r
 \r
         if (hasResized && isValidPeer (this))\r
         {\r
@@ -1339,31 +1132,23 @@ public:
 \r
     Rectangle<int> getBounds() const override\r
     {\r
-        auto bounds = getWindowRect (hwnd);\r
+        auto bounds = rectangleFromRECT (getWindowRect (hwnd));\r
 \r
         if (auto parentH = GetParent (hwnd))\r
         {\r
             auto r = getWindowRect (parentH);\r
-            auto localBounds = Rectangle<int>::leftTopRightBottom (bounds.left, bounds.top,\r
-                                                                   bounds.right, bounds.bottom).translated (-r.left, -r.top);\r
-\r
-           #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            if (isPerMonitorDPIAwareWindow (hwnd))\r
-                localBounds = (localBounds.toDouble() / getPlatformScaleFactor()).toNearestInt();\r
-           #endif\r
-\r
-            return windowBorder.subtractedFrom (localBounds);\r
+            bounds.translate (-r.left, -r.top);\r
         }\r
 \r
-        return windowBorder.subtractedFrom (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (bounds), hwnd));\r
+        return windowBorder.subtractedFrom (bounds);\r
     }\r
 \r
     Point<int> getScreenPosition() const\r
     {\r
-        auto r = convertPhysicalScreenRectangleToLogical (rectangleFromRECT (getWindowRect (hwnd)), hwnd);\r
+        auto r = getWindowRect (hwnd);\r
 \r
-        return { r.getX() + windowBorder.getLeft(),\r
-                 r.getY() + windowBorder.getTop() };\r
+        return { r.left + windowBorder.getLeft(),\r
+                 r.top  + windowBorder.getTop() };\r
     }\r
 \r
     Point<float> localToGlobal (Point<float> relativePosition) override  { return relativePosition + getScreenPosition().toFloat(); }\r
@@ -1460,21 +1245,17 @@ public:
 \r
     bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override\r
     {\r
-        auto r = convertPhysicalScreenRectangleToLogical (rectangleFromRECT (getWindowRect (hwnd)), hwnd);\r
+        auto r = getWindowRect (hwnd);\r
 \r
-        if (! r.withZeroOrigin().contains (localPos))\r
+        if (! (isPositiveAndBelow (localPos.x, r.right - r.left)\r
+                && isPositiveAndBelow (localPos.y, r.bottom - r.top)))\r
             return false;\r
 \r
-        auto globalPos = localPos + getScreenPosition();\r
+        POINT p = { localPos.x + r.left + windowBorder.getLeft(),\r
+                    localPos.y + r.top  + windowBorder.getTop() };\r
 \r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (isPerMonitorDPIAwareThread() || isPerMonitorDPIAwareWindow (hwnd))\r
-            globalPos = Desktop::getInstance().getDisplays().logicalToPhysical (globalPos);\r
-       #endif\r
-\r
-        auto w = WindowFromPoint (POINTFromPoint (globalPos));\r
-\r
-        return  w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0));\r
+        HWND w = WindowFromPoint (p);\r
+        return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0));\r
     }\r
 \r
     BorderSize<int> getFrameSize() const override\r
@@ -1574,18 +1355,7 @@ public:
 \r
     void repaint (const Rectangle<int>& area) override\r
     {\r
-        auto scale = getPlatformScaleFactor();\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        // if the calling thread is DPI-aware but we are invalidating a non-DPI aware window RECT, we actually have to\r
-        // divide the bounds by the scale factor as it will get multiplied for the virtualised paint callback...\r
-        if (isPerMonitorDPIAwareThread() && ! isPerMonitorDPIAwareWindow (hwnd))\r
-            scale = 1.0 / Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
-       #endif\r
-\r
-        const RECT r = { roundToInt (area.getX()     * scale), roundToInt (area.getY()      * scale),\r
-                         roundToInt (area.getRight() * scale), roundToInt (area.getBottom() * scale) };\r
-\r
+        const RECT r = { area.getX(), area.getY(), area.getRight(), area.getBottom() };\r
         InvalidateRect (hwnd, &r, FALSE);\r
     }\r
 \r
@@ -1659,7 +1429,6 @@ public:
         JUCE_COMRESULT DragEnter (IDataObject* pDataObject, DWORD grfKeyState, POINTL mousePos, DWORD* pdwEffect) override\r
         {\r
             auto hr = updateFileList (pDataObject);\r
-\r
             if (FAILED (hr))\r
                 return hr;\r
 \r
@@ -1688,8 +1457,7 @@ public:
 \r
         JUCE_COMRESULT Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) override\r
         {\r
-            auto hr = updateFileList (pDataObject);\r
-\r
+            HRESULT hr = updateFileList (pDataObject);\r
             if (FAILED (hr))\r
                 return hr;\r
 \r
@@ -1707,8 +1475,9 @@ public:
         Point<float> getMousePos (POINTL mousePos) const\r
         {\r
             auto& comp = peer.getComponent();\r
-            return comp.getLocalPoint (nullptr, convertPhysicalScreenPointToLogical (pointFromPOINT ({ mousePos.x, mousePos.y }),\r
-                                                                                    (HWND) peer.getNativeHandle()).toFloat());\r
+            return comp.getLocalPoint (nullptr, ScalingHelpers::unscaledScreenPosToScaled (comp.getDesktopScaleFactor(),\r
+                                                                                           Point<float> (static_cast<float> (mousePos.x),\r
+                                                                                                         static_cast<float> (mousePos.y))));\r
         }\r
 \r
         template <typename CharType>\r
@@ -1717,8 +1486,7 @@ public:
             for (unsigned int i = 0;;)\r
             {\r
                 unsigned int len = 0;\r
-\r
-                while (i + len < totalLen && names[i + len] != 0)\r
+                while (i + len < totalLen && names [i + len] != 0)\r
                     ++len;\r
 \r
                 if (len == 0)\r
@@ -1768,7 +1536,7 @@ public:
 \r
                 if (SUCCEEDED (fileData.error))\r
                 {\r
-                    auto dropFiles = static_cast<const LPDROPFILES> (fileData.data);\r
+                    const LPDROPFILES dropFiles = static_cast<const LPDROPFILES> (fileData.data);\r
                     const void* const names = addBytesToPointer (dropFiles, sizeof (DROPFILES));\r
 \r
                     if (dropFiles->fWide)\r
@@ -1806,27 +1574,6 @@ public:
         return false;\r
     }\r
 \r
-    double getPlatformScaleFactor() const noexcept override\r
-    {\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (! isPerMonitorDPIAwareWindow (hwnd))\r
-            return 1.0;\r
-\r
-        if (auto* parentHWND = GetParent (hwnd))\r
-        {\r
-            if (auto* parentPeer = getOwnerOfWindow (parentHWND))\r
-                return parentPeer->getPlatformScaleFactor();\r
-\r
-            if (getDPIForWindow != nullptr)\r
-                return getScaleFactorForWindow (parentHWND);\r
-        }\r
-\r
-        return scaleFactor;\r
-       #else\r
-        return 1.0;\r
-       #endif\r
-    }\r
-\r
 private:\r
     HWND hwnd, parentToAddTo;\r
     std::unique_ptr<DropShadower> shadower;\r
@@ -1847,10 +1594,6 @@ private:
     ModifierKeyProvider* modProvider = nullptr;\r
    #endif\r
 \r
-    double scaleFactor = 1.0;\r
-    bool isInDPIChange = false;\r
-\r
-    //==============================================================================\r
     static MultiTouchMapper<DWORD> currentTouches;\r
 \r
     //==============================================================================\r
@@ -2084,21 +1827,6 @@ private:
                 registerTouchWindow (hwnd, 0);\r
 \r
             setDPIAwareness();\r
-\r
-           #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            if (isPerMonitorDPIAwareThread())\r
-            {\r
-                auto bounds = component.getBounds();\r
-\r
-                if (bounds.isEmpty())\r
-                    scaleFactor = Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
-                else\r
-                    scaleFactor = Desktop::getInstance().getDisplays().findDisplayForRect (bounds).scale;\r
-\r
-                scaleFactor /= Desktop::getInstance().getGlobalScaleFactor();\r
-            }\r
-           #endif\r
-\r
             setMessageFilter();\r
             updateBorderSize();\r
             checkForPointerAPI();\r
@@ -2122,22 +1850,10 @@ private:
         }\r
     }\r
 \r
-    static BOOL CALLBACK revokeChildDragDropCallback (HWND hwnd, LPARAM)    { RevokeDragDrop (hwnd); return TRUE; }\r
-\r
     static void* destroyWindowCallback (void* handle)\r
     {\r
-        auto hwnd = reinterpret_cast<HWND> (handle);\r
-\r
-        if (IsWindow (hwnd))\r
-        {\r
-            RevokeDragDrop (hwnd);\r
-\r
-            // NB: we need to do this before DestroyWindow() as child HWNDs will be invalid after\r
-            EnumChildWindows (hwnd, revokeChildDragDropCallback, 0);\r
-\r
-            DestroyWindow (hwnd);\r
-        }\r
-\r
+        RevokeDragDrop ((HWND) handle);\r
+        DestroyWindow ((HWND) handle);\r
         return nullptr;\r
     }\r
 \r
@@ -2171,17 +1887,6 @@ private:
 \r
     bool hasTitleBar() const noexcept        { return (styleFlags & windowHasTitleBar) != 0; }\r
 \r
-    void updateShadower()\r
-    {\r
-        if (! component.isCurrentlyModal() && (styleFlags & windowHasDropShadow) != 0\r
-            && ((! hasTitleBar()) || SystemStats::getOperatingSystemType() < SystemStats::WinVista))\r
-        {\r
-            shadower.reset (component.getLookAndFeel().createDropShadowerForComponent (&component));\r
-\r
-            if (shadower != nullptr)\r
-                shadower->setOwner (&component);\r
-        }\r
-    }\r
 \r
     void setIcon (const Image& newIcon)\r
     {\r
@@ -2224,7 +1929,7 @@ private:
         {\r
             auto& info = *(ChildWindowClippingInfo*) context;\r
 \r
-            auto parent = GetParent (hwnd);\r
+            HWND parent = GetParent (hwnd);\r
 \r
             if (parent == info.peer->hwnd)\r
             {\r
@@ -2259,10 +1964,9 @@ private:
             if (GetUpdateRect (hwnd, &r, false))\r
             {\r
                 direct2DContext->start();\r
-                direct2DContext->clipToRectangle (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (r), hwnd));\r
+                direct2DContext->clipToRectangle (rectangleFromRECT (r));\r
                 handlePaint (*direct2DContext);\r
                 direct2DContext->end();\r
-                ValidateRect (hwnd, &r);\r
             }\r
         }\r
         else\r
@@ -2278,7 +1982,6 @@ private:
             // if something in a paint handler calls, e.g. a message box, this can become reentrant and\r
             // corrupt the image it's using to paint into, so do a check here.\r
             static bool reentrant = false;\r
-\r
             if (! reentrant)\r
             {\r
                 const ScopedValueSetter<bool> setter (reentrant, true, false);\r
@@ -2390,8 +2093,6 @@ private:
                 {\r
                     std::unique_ptr<LowLevelGraphicsContext> context (component.getLookAndFeel()\r
                                                                         .createGraphicsContext (offscreenImage, Point<int> (-x, -y), contextClip));\r
-\r
-                    context->addTransform (AffineTransform::scale ((float) getPlatformScaleFactor()));\r
                     handlePaint (*context);\r
                 }\r
 \r
@@ -2521,8 +2222,8 @@ private:
         }\r
 \r
         static uint32 lastMouseTime = 0;\r
-        static auto minTimeBetweenMouses = getMinTimeBetweenMouseMoves();\r
-        auto now = Time::getMillisecondCounter();\r
+        static int minTimeBetweenMouses = getMinTimeBetweenMouseMoves();\r
+        const uint32 now = Time::getMillisecondCounter();\r
 \r
         if (! Desktop::getInstance().getMainMouseSource().isDragging())\r
             modsToSend = modsToSend.withoutMouseButtons();\r
@@ -2550,10 +2251,10 @@ private:
         {\r
             updateModifiersFromWParam (wParam);\r
 \r
-           #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client\r
+          #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client\r
             if (modProvider != nullptr)\r
                 ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withFlags (modProvider->getWin32Modifiers());\r
-           #endif\r
+          #endif\r
 \r
             isDragging = true;\r
 \r
@@ -2611,16 +2312,17 @@ private:
 \r
     ComponentPeer* findPeerUnderMouse (Point<float>& localPos)\r
     {\r
-        auto currentMousePos = getPOINTFromLParam (GetMessagePos());\r
+        auto globalPos = getCurrentMousePosGlobal().roundToInt();\r
 \r
         // Because Windows stupidly sends all wheel events to the window with the keyboard\r
         // focus, we have to redirect them here according to the mouse pos..\r
-        auto* peer = getOwnerOfWindow (WindowFromPoint (currentMousePos));\r
+        POINT p = { globalPos.x, globalPos.y };\r
+        auto* peer = getOwnerOfWindow (WindowFromPoint (p));\r
 \r
         if (peer == nullptr)\r
             peer = this;\r
 \r
-        localPos = peer->globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (currentMousePos), hwnd).toFloat());\r
+        localPos = peer->globalToLocal (globalPos.toFloat());\r
         return peer;\r
     }\r
 \r
@@ -2656,7 +2358,6 @@ private:
         wheel.isInertial = false;\r
 \r
         Point<float> localPos;\r
-\r
         if (auto* peer = findPeerUnderMouse (localPos))\r
             peer->handleMouseWheel (getPointerType (wParam), localPos, getMouseEventTime(), wheel);\r
     }\r
@@ -2730,8 +2431,7 @@ private:
 \r
         const auto touchIndex = currentTouches.getIndexOfTouch (this, touch.dwID);\r
         const auto time = getMouseEventTime();\r
-        const auto pos = globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT ({ roundToInt (touch.x / 100.0f),\r
-                                                                                               roundToInt (touch.y / 100.0f) }), hwnd).toFloat());\r
+        const auto pos = globalToLocal ({ touch.x / 100.0f, touch.y / 100.0f });\r
         const auto pressure = touchPressure;\r
         auto modsToSend = ModifierKeys::currentModifiers;\r
 \r
@@ -2795,7 +2495,6 @@ private:
         if (pointerType == MouseInputSource::InputSourceType::touch)\r
         {\r
             POINTER_TOUCH_INFO touchInfo;\r
-\r
             if (! getPointerTouchInfo (GET_POINTERID_WPARAM (wParam), &touchInfo))\r
                 return false;\r
 \r
@@ -2811,13 +2510,13 @@ private:
         else if (pointerType == MouseInputSource::InputSourceType::pen)\r
         {\r
             POINTER_PEN_INFO penInfo;\r
-\r
             if (! getPointerPenInfo (GET_POINTERID_WPARAM (wParam), &penInfo))\r
                 return false;\r
 \r
             const auto pressure = (penInfo.penMask & PEN_MASK_PRESSURE) ? penInfo.pressure / 1024.0f : MouseInputSource::invalidPressure;\r
 \r
-            if (! handlePenInput (penInfo, globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (getPOINTFromLParam (lParam)), hwnd).toFloat()),\r
+            if (! handlePenInput (penInfo, globalToLocal (Point<float> (static_cast<float> (GET_X_LPARAM(lParam)),\r
+                                                                        static_cast<float> (GET_Y_LPARAM(lParam)))),\r
                                   pressure, isDown, isUp))\r
                 return false;\r
         }\r
@@ -2831,19 +2530,11 @@ private:
 \r
     TOUCHINPUT emulateTouchEventFromPointer (LPARAM lParam, WPARAM wParam)\r
     {\r
-        Point<int> p (GET_X_LPARAM (lParam),\r
-                      GET_Y_LPARAM (lParam));\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (! isPerMonitorDPIAwareThread())\r
-            p = Desktop::getInstance().getDisplays().physicalToLogical (p);\r
-       #endif\r
-\r
         TOUCHINPUT touchInput;\r
 \r
         touchInput.dwID = GET_POINTERID_WPARAM (wParam);\r
-        touchInput.x = p.x * 100;\r
-        touchInput.y = p.y * 100;\r
+        touchInput.x = GET_X_LPARAM (lParam) * 100;\r
+        touchInput.y = GET_Y_LPARAM (lParam) * 100;\r
 \r
         return touchInput;\r
     }\r
@@ -3115,17 +2806,18 @@ private:
                 && ! isKioskMode();\r
     }\r
 \r
-    Rectangle<int> getCurrentScaledBounds() const\r
+    Rectangle<int> getCurrentScaledBounds (float scale) const\r
     {\r
-        return ScalingHelpers::unscaledScreenPosToScaled (component, windowBorder.addedTo (ScalingHelpers::scaledScreenPosToUnscaled (component, component.getBounds())));\r
+        return ScalingHelpers::unscaledScreenPosToScaled (scale, windowBorder.addedTo (ScalingHelpers::scaledScreenPosToUnscaled (scale, component.getBounds())));\r
     }\r
 \r
     LRESULT handleSizeConstraining (RECT& r, const WPARAM wParam)\r
     {\r
         if (isConstrainedNativeWindow())\r
         {\r
-            auto pos = ScalingHelpers::unscaledScreenPosToScaled (component, convertPhysicalScreenRectangleToLogical (rectangleFromRECT (r), hwnd));\r
-            auto current = getCurrentScaledBounds();\r
+            auto scale = getComponent().getDesktopScaleFactor();\r
+            auto pos = ScalingHelpers::unscaledScreenPosToScaled (scale, rectangleFromRECT (r));\r
+            auto current = getCurrentScaledBounds (scale);\r
 \r
             constrainer->checkBounds (pos, current,\r
                                       Desktop::getInstance().getDisplays().getTotalBounds (true),\r
@@ -3134,7 +2826,11 @@ private:
                                       wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT,\r
                                       wParam == WMSZ_RIGHT  || wParam == WMSZ_TOPRIGHT   || wParam == WMSZ_BOTTOMRIGHT);\r
 \r
-            r = RECTFromRectangle (convertLogicalScreenRectangleToPhysical (ScalingHelpers::scaledScreenPosToUnscaled (component, pos), hwnd));\r
+            pos = ScalingHelpers::scaledScreenPosToUnscaled (scale, pos);\r
+            r.left   = pos.getX();\r
+            r.top    = pos.getY();\r
+            r.right  = pos.getRight();\r
+            r.bottom = pos.getBottom();\r
         }\r
 \r
         return TRUE;\r
@@ -3145,11 +2841,11 @@ private:
         if (isConstrainedNativeWindow())\r
         {\r
             if ((wp.flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE)\r
-                 && (wp.x > -32000 && wp.y > -32000)\r
                  && ! Component::isMouseButtonDownAnywhere())\r
             {\r
-                auto pos = ScalingHelpers::unscaledScreenPosToScaled (component, convertPhysicalScreenRectangleToLogical (rectangleFromRECT ({ wp.x, wp.y, wp.x + wp.cx, wp.y + wp.cy }), hwnd));\r
-                auto current = getCurrentScaledBounds();\r
+                auto scale = getComponent().getDesktopScaleFactor();\r
+                auto pos = ScalingHelpers::unscaledScreenPosToScaled (scale, Rectangle<int> (wp.x, wp.y, wp.cx, wp.cy));\r
+                auto current = getCurrentScaledBounds (scale);\r
 \r
                 constrainer->checkBounds (pos, current,\r
                                           Desktop::getInstance().getDisplays().getTotalBounds (true),\r
@@ -3158,10 +2854,9 @@ private:
                                           pos.getY() == current.getY() && pos.getBottom() != current.getBottom(),\r
                                           pos.getX() == current.getX() && pos.getRight()  != current.getRight());\r
 \r
-                pos = convertLogicalScreenRectangleToPhysical (ScalingHelpers::scaledScreenPosToUnscaled (component, pos), hwnd);\r
-\r
-                wp.x  = pos.getX();\r
-                wp.y  = pos.getY();\r
+                pos = ScalingHelpers::scaledScreenPosToUnscaled (scale, pos);\r
+                wp.x = pos.getX();\r
+                wp.y = pos.getY();\r
                 wp.cx = pos.getWidth();\r
                 wp.cy = pos.getHeight();\r
             }\r
@@ -3189,62 +2884,9 @@ private:
         }\r
 \r
         handleMovedOrResized();\r
-\r
         return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly..\r
     }\r
 \r
-    LRESULT handleDPIChanging (int newDPI, RECT newRect)\r
-    {\r
-        auto newScale = (double) newDPI / USER_DEFAULT_SCREEN_DPI;\r
-\r
-        if (! approximatelyEqual (scaleFactor, newScale))\r
-        {\r
-            const ScopedValueSetter<bool> setter (isInDPIChange, true);\r
-\r
-            auto oldScale = scaleFactor;\r
-            scaleFactor = newScale;\r
-\r
-            auto scaleRatio = scaleFactor / oldScale;\r
-            EnumChildWindows (hwnd, scaleChildHWNDCallback, (LPARAM) &scaleRatio);\r
-\r
-            setBounds (windowBorder.subtractedFrom (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (newRect), hwnd)), false);\r
-            updateShadower();\r
-            InvalidateRect (hwnd, nullptr, FALSE);\r
-            scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (scaleFactor); });\r
-        }\r
-\r
-        return 0;\r
-    }\r
-\r
-    static BOOL CALLBACK scaleChildHWNDCallback (HWND hwnd, LPARAM context)\r
-    {\r
-        auto r = getWindowRect (hwnd);\r
-\r
-        POINT p { r.left, r.top };\r
-        ScreenToClient (GetParent (hwnd), &p);\r
-\r
-        auto ratio = *(double*) context;\r
-        SetWindowPos (hwnd, 0, roundToInt (p.x * ratio), roundToInt (p.y * ratio),\r
-                      roundToInt ((r.right - r.left) * ratio), roundToInt ((r.bottom - r.top) * ratio),\r
-                      SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER);\r
-\r
-        if (auto* peer = getOwnerOfWindow (hwnd))\r
-            peer->handleChildDPIChanging();\r
-\r
-        return TRUE;\r
-    }\r
-\r
-    void handleChildDPIChanging()\r
-    {\r
-        const ScopedValueSetter<bool> setter (isInDPIChange, true);\r
-\r
-        scaleFactor = getScaleFactorForWindow (parentToAddTo);\r
-\r
-        updateShadower();\r
-        InvalidateRect (hwnd, nullptr, FALSE);\r
-        scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (scaleFactor); });\r
-    }\r
-\r
     void handleAppActivation (const WPARAM wParam)\r
     {\r
         modifiersAtLastCallback = -1;\r
@@ -3344,13 +2986,22 @@ private:
         forceDisplayUpdate();\r
 \r
         if (fullScreen && ! isMinimised())\r
-            setWindowPos (hwnd, Desktop::getInstance().getDisplays().findDisplayForRect (component.getScreenBounds()).userArea,\r
+        {\r
+            auto& display = Desktop::getInstance().getDisplays()\r
+                           .getDisplayContaining (component.getScreenBounds().getCentre());\r
+\r
+            setWindowPos (hwnd, display.userArea * display.scale,\r
                           SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOSENDCHANGING);\r
+        }\r
     }\r
 \r
     static void forceDisplayUpdate()\r
     {\r
-        const_cast<Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+        const_cast<Desktop::Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+    }\r
+\r
+    void handleDPIChange() // happens when a window moves to a screen with a different DPI.\r
+    {\r
     }\r
 \r
     //==============================================================================\r
@@ -3370,11 +3021,6 @@ private:
 public:\r
     static LRESULT CALLBACK windowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)\r
     {\r
-        // Ensure that non-client areas are scaled for per-monitor DPI awareness v1 - can't\r
-        // do this in peerWindowProc as we have no window at this point\r
-        if (message == WM_NCCREATE && enableNonClientDPIScaling != nullptr)\r
-            enableNonClientDPIScaling (h);\r
-\r
         if (auto* peer = getOwnerOfWindow (h))\r
         {\r
             jassert (isValidPeer (peer));\r
@@ -3395,32 +3041,20 @@ private:
         return mm.callFunctionOnMessageThread (callback, userData);\r
     }\r
 \r
-    static POINT getPOINTFromLParam (LPARAM lParam) noexcept\r
+    static Point<float> getPointFromLParam (LPARAM lParam) noexcept\r
     {\r
-        return { GET_X_LPARAM (lParam), GET_Y_LPARAM (lParam) };\r
+        return { static_cast<float> (GET_X_LPARAM (lParam)),\r
+                 static_cast<float> (GET_Y_LPARAM (lParam)) };\r
     }\r
 \r
-    Point<float> getPointFromLocalLParam (LPARAM lParam) noexcept\r
+    static Point<float> getCurrentMousePosGlobal() noexcept\r
     {\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (isPerMonitorDPIAwareWindow (hwnd))\r
-        {\r
-            // LPARAM is relative to this window's top-left but may be on a different monitor so we need to calculate the\r
-            // physical screen position and then convert this to local logical coordinates\r
-            auto localPos = getPOINTFromLParam (lParam);\r
-            auto r = getWindowRect (hwnd);\r
-\r
-            return globalToLocal (Desktop::getInstance().getDisplays().physicalToLogical (pointFromPOINT ({ r.left + localPos.x + roundToInt (windowBorder.getLeft() * scaleFactor),\r
-                                                                                                            r.top  + localPos.y + roundToInt (windowBorder.getTop()  * scaleFactor) })).toFloat());\r
-        }\r
-       #endif\r
-\r
-        return { static_cast<float> (GET_X_LPARAM (lParam)), static_cast<float> (GET_Y_LPARAM (lParam)) };\r
+        return getPointFromLParam (GetMessagePos());\r
     }\r
 \r
     Point<float> getCurrentMousePos() noexcept\r
     {\r
-        return globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (getPOINTFromLParam (GetMessagePos())), hwnd).toFloat());\r
+        return globalToLocal (getCurrentMousePosGlobal());\r
     }\r
 \r
     LRESULT peerWindowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)\r
@@ -3474,18 +3108,18 @@ private:
                 break;\r
 \r
             //==============================================================================\r
-            case WM_MOUSEMOVE:          doMouseMove (getPointFromLocalLParam (lParam), false); return 0;\r
+            case WM_MOUSEMOVE:          doMouseMove (getPointFromLParam (lParam), false); return 0;\r
 \r
             case WM_POINTERLEAVE:\r
             case WM_MOUSELEAVE:         doMouseExit(); return 0;\r
 \r
             case WM_LBUTTONDOWN:\r
             case WM_MBUTTONDOWN:\r
-            case WM_RBUTTONDOWN:        doMouseDown (getPointFromLocalLParam (lParam), wParam); return 0;\r
+            case WM_RBUTTONDOWN:        doMouseDown (getPointFromLParam (lParam), wParam); return 0;\r
 \r
             case WM_LBUTTONUP:\r
             case WM_MBUTTONUP:\r
-            case WM_RBUTTONUP:          doMouseUp (getPointFromLocalLParam (lParam), wParam); return 0;\r
+            case WM_RBUTTONUP:          doMouseUp (getPointFromLParam (lParam), wParam); return 0;\r
 \r
             case WM_POINTERWHEEL:\r
             case 0x020A: /* WM_MOUSEWHEEL */   doMouseWheel (wParam, true);  return 0;\r
@@ -3515,16 +3149,15 @@ private:
                 break;\r
 \r
             //==============================================================================\r
-            case WM_SIZING:                  return handleSizeConstraining (*(RECT*) lParam, wParam);\r
-            case WM_WINDOWPOSCHANGING:       return handlePositionChanging (*(WINDOWPOS*) lParam);\r
-            case 0x2e0: /* WM_DPICHANGED */  return handleDPIChanging ((int) HIWORD (wParam), *(RECT*) lParam);\r
+            case WM_SIZING:                return handleSizeConstraining (*(RECT*) lParam, wParam);\r
+            case WM_WINDOWPOSCHANGING:     return handlePositionChanging (*(WINDOWPOS*) lParam);\r
 \r
             case WM_WINDOWPOSCHANGED:\r
             {\r
                 const WINDOWPOS& wPos = *reinterpret_cast<WINDOWPOS*> (lParam);\r
 \r
                 if ((wPos.flags & SWP_NOMOVE) != 0 && (wPos.flags & SWP_NOSIZE) != 0)\r
-                    startTimer (100);\r
+                    startTimer(100);\r
                 else\r
                     if (handlePositionChanged())\r
                         return 0;\r
@@ -3659,6 +3292,10 @@ private:
                 doSettingChange();\r
                 break;\r
 \r
+            case 0x2e0: // WM_DPICHANGED\r
+                handleDPIChange();\r
+                break;\r
+\r
             case WM_INITMENU:\r
                 initialiseSysMenu ((HMENU) wParam);\r
                 break;\r
@@ -3938,7 +3575,7 @@ private:
                             break;\r
 \r
                     for (selectionEnd = selectionStart; selectionEnd < attributeSizeBytes; ++selectionEnd)\r
-                        if (attributes[selectionEnd] != ATTR_TARGET_CONVERTED && attributes[selectionEnd] != ATTR_TARGET_NOTCONVERTED)\r
+                        if (attributes [selectionEnd] != ATTR_TARGET_CONVERTED && attributes[selectionEnd] != ATTR_TARGET_NOTCONVERTED)\r
                             break;\r
                 }\r
             }\r
@@ -3975,7 +3612,7 @@ private:
 \r
                     if (ImmGetCompositionString (hImc, GCS_COMPCLAUSE, clauseData, (DWORD) clauseDataSizeBytes) > 0)\r
                         for (size_t i = 0; i + 1 < numItems; ++i)\r
-                            result.add (Range<int> ((int) clauseData[i], (int) clauseData[i + 1]) + compositionRange.getStart());\r
+                            result.add (Range<int> ((int) clauseData [i], (int) clauseData [i + 1]) + compositionRange.getStart());\r
                 }\r
             }\r
 \r
@@ -4022,11 +3659,6 @@ JUCE_API ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& compo
                                   (HWND) parentHWND, true);\r
 }\r
 \r
-JUCE_API bool shouldScaleGLWindow (void* hwnd)\r
-{\r
-    return isPerMonitorDPIAwareWindow ((HWND) hwnd);\r
-}\r
-\r
 JUCE_IMPLEMENT_SINGLETON (HWNDComponentPeer::WindowClassHolder)\r
 \r
 //==============================================================================\r
@@ -4052,8 +3684,8 @@ bool KeyPress::isKeyCurrentlyDown (const int keyCode)
                                            (SHORT) ']', VK_OEM_6 };\r
 \r
         for (int i = 0; i < numElementsInArray (translatedValues); i += 2)\r
-            if (k == translatedValues[i])\r
-                k = translatedValues[i + 1];\r
+            if (k == translatedValues [i])\r
+                k = translatedValues [i + 1];\r
     }\r
 \r
     return HWNDComponentPeer::isKeyDown (k);\r
@@ -4153,11 +3785,6 @@ private:
     {\r
         UINT flags = MB_TASKMODAL | MB_SETFOREGROUND;\r
 \r
-        // this window can get lost behind JUCE windows which are set to be alwaysOnTop\r
-        // so if there are any set it to be topmost\r
-        if (juce_areThereAnyAlwaysOnTopWindows())\r
-            flags |= MB_TOPMOST;\r
-\r
         switch (iconType)\r
         {\r
             case AlertWindow::QuestionIcon:  flags |= MB_ICONQUESTION; break;\r
@@ -4259,28 +3886,13 @@ Point<float> MouseInputSource::getCurrentRawMousePosition()
 {\r
     POINT mousePos;\r
     GetCursorPos (&mousePos);\r
-\r
-    auto p = pointFromPOINT (mousePos);\r
-\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    if (isPerMonitorDPIAwareThread())\r
-        p = Desktop::getInstance().getDisplays().physicalToLogical (p);\r
-   #endif\r
-\r
-    return p.toFloat();\r
+    return { (float) mousePos.x, (float) mousePos.y };\r
 }\r
 \r
 void MouseInputSource::setRawMousePosition (Point<float> newPosition)\r
 {\r
-    auto newPositionInt = newPosition.roundToInt();\r
-\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    if (isPerMonitorDPIAwareThread())\r
-        newPositionInt = Desktop::getInstance().getDisplays().logicalToPhysical (newPositionInt);\r
-   #endif\r
-\r
-    auto point = POINTFromPoint (newPositionInt);\r
-    SetCursorPos (point.x, point.y);\r
+    SetCursorPos (roundToInt (newPosition.x),\r
+                  roundToInt (newPosition.y));\r
 }\r
 \r
 //==============================================================================\r
@@ -4388,66 +4000,15 @@ void Desktop::setKioskComponent (Component* kioskModeComp, bool enableOrDisable,
 \r
 void Desktop::allowedOrientationsChanged() {}\r
 \r
-//==============================================================================\r
-static const Displays::Display* getCurrentDisplayFromScaleFactor (HWND hwnd)\r
-{\r
-    Array<Displays::Display*> candidateDisplays;\r
-    double scaleToLookFor = -1.0;\r
-\r
-    if (auto* peer = HWNDComponentPeer::getOwnerOfWindow (hwnd))\r
-        scaleToLookFor = peer->getPlatformScaleFactor();\r
-    else\r
-        scaleToLookFor = getScaleFactorForWindow (hwnd);\r
-\r
-    auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
-    for (auto& d : Desktop::getInstance().getDisplays().displays)\r
-        if (approximatelyEqual (d.scale / globalScale, scaleToLookFor))\r
-            candidateDisplays.add (&d);\r
-\r
-    if (candidateDisplays.size() > 0)\r
-    {\r
-        if (candidateDisplays.size() == 1)\r
-            return candidateDisplays[0];\r
-\r
-        Rectangle<int> bounds;\r
-\r
-        if (auto* peer = HWNDComponentPeer::getOwnerOfWindow (hwnd))\r
-            bounds = peer->getComponent().getTopLevelComponent()->getBounds();\r
-        else\r
-            bounds = Desktop::getInstance().getDisplays().physicalToLogical (rectangleFromRECT (getWindowRect (hwnd)));\r
-\r
-        Displays::Display* retVal = nullptr;\r
-        int maxArea = -1;\r
-\r
-        for (auto* d : candidateDisplays)\r
-        {\r
-            auto intersection = d->totalArea.getIntersection (bounds);\r
-            auto area = intersection.getWidth() * intersection.getHeight();\r
-\r
-            if (area > maxArea)\r
-            {\r
-                maxArea = area;\r
-                retVal = d;\r
-            }\r
-        }\r
-\r
-        if (retVal != nullptr)\r
-            return retVal;\r
-    }\r
-\r
-    return &Desktop::getInstance().getDisplays().getMainDisplay();\r
-}\r
-\r
 //==============================================================================\r
 struct MonitorInfo\r
 {\r
-    MonitorInfo (bool main, RECT rect, double d) noexcept\r
-        : isMain (main), bounds (rect), dpi (d) {}\r
+    MonitorInfo (Rectangle<int> rect, bool main, double d) noexcept\r
+        : bounds (rect), dpi (d), isMain (main) {}\r
 \r
-    bool isMain;\r
-    RECT bounds;\r
+    Rectangle<int> bounds;\r
     double dpi;\r
+    bool isMain;\r
 };\r
 \r
 static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userInfo)\r
@@ -4455,9 +4016,8 @@ static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userIn
     MONITORINFO info = { 0 };\r
     info.cbSize = sizeof (info);\r
     GetMonitorInfo (hm, &info);\r
-\r
-    auto isMain = (info.dwFlags & 1 /* MONITORINFOF_PRIMARY */) != 0;\r
-    auto dpi = 0.0;\r
+    const bool isMain = (info.dwFlags & 1 /* MONITORINFOF_PRIMARY */) != 0;\r
+    double dpi = 0;\r
 \r
     if (getDPIForMonitor != nullptr)\r
     {\r
@@ -4467,89 +4027,60 @@ static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userIn
             dpi = (dpiX + dpiY) / 2.0;\r
     }\r
 \r
-    ((Array<MonitorInfo>*) userInfo)->add ({ isMain, *r, dpi });\r
+    ((Array<MonitorInfo>*) userInfo)->add (MonitorInfo (rectangleFromRECT (*r), isMain, dpi));\r
+\r
     return TRUE;\r
 }\r
 \r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
 {\r
     setDPIAwareness();\r
 \r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    DPI_AWARENESS_CONTEXT prevContext = nullptr;\r
-\r
-    if (setThreadDPIAwarenessContext != nullptr && getAwarenessFromDPIAwarenessContext != nullptr && getThreadDPIAwarenessContext != nullptr\r
-        && getAwarenessFromDPIAwarenessContext (getThreadDPIAwarenessContext()) != DPI_Awareness::DPI_Awareness_Per_Monitor_Aware)\r
-    {\r
-        prevContext = setThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);\r
-    }\r
-   #endif\r
-\r
     Array<MonitorInfo> monitors;\r
     EnumDisplayMonitors (0, 0, &enumMonitorsProc, (LPARAM) &monitors);\r
 \r
-    auto globalDPI = getGlobalDPI();\r
+    const double globalDPI = getGlobalDPI();\r
 \r
     if (monitors.size() == 0)\r
-        monitors.add ({ true, getWindowRect (GetDesktopWindow()), globalDPI });\r
+        monitors.add (MonitorInfo (rectangleFromRECT (getWindowRect (GetDesktopWindow())), true, globalDPI));\r
 \r
     // make sure the first in the list is the main monitor\r
     for (int i = 1; i < monitors.size(); ++i)\r
-        if (monitors.getReference (i).isMain)\r
+        if (monitors.getReference(i).isMain)\r
             monitors.swap (i, 0);\r
 \r
-    for (auto& monitor : monitors)\r
+    RECT workArea;\r
+    SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0);\r
+\r
+    for (int i = 0; i < monitors.size(); ++i)\r
     {\r
         Display d;\r
-\r
-        d.isMain = monitor.isMain;\r
-        d.dpi = monitor.dpi;\r
+        d.userArea  = d.totalArea = monitors.getReference(i).bounds / masterScale;\r
+        d.isMain    = monitors.getReference(i).isMain;\r
+        d.dpi       = monitors.getReference(i).dpi;\r
 \r
         if (d.dpi == 0)\r
         {\r
-            d.dpi = globalDPI;\r
             d.scale = masterScale;\r
+            d.dpi = globalDPI;\r
         }\r
         else\r
         {\r
-            d.scale = (d.dpi / USER_DEFAULT_SCREEN_DPI) * (masterScale / Desktop::getDefaultMasterScale());\r
+            d.scale = d.dpi / 96.0;\r
         }\r
 \r
-        d.userArea = d.totalArea = Rectangle<int>::leftTopRightBottom (monitor.bounds.left, monitor.bounds.top,\r
-                                                                       monitor.bounds.right, monitor.bounds.bottom);\r
-\r
         if (d.isMain)\r
-        {\r
-            RECT workArea;\r
-            SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0);\r
-\r
-            d.userArea = d.userArea.getIntersection (Rectangle<int>::leftTopRightBottom (workArea.left, workArea.top,\r
-                                                                                         workArea.right, workArea.bottom));\r
-        }\r
+            d.userArea = d.userArea.getIntersection (rectangleFromRECT (workArea) / masterScale);\r
 \r
         displays.add (d);\r
     }\r
-\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    updateToLogical();\r
-\r
-    // Reset the DPI awareness context if it was overridden earlier\r
-    if (prevContext != nullptr)\r
-        setThreadDPIAwarenessContext (prevContext);\r
-   #else\r
-    for (auto& d : displays)\r
-    {\r
-        d.totalArea /= masterScale;\r
-        d.userArea  /= masterScale;\r
-    }\r
-   #endif\r
 }\r
 \r
 //==============================================================================\r
 static HICON extractFileHICON (const File& file)\r
 {\r
     WORD iconNum = 0;\r
-    WCHAR name[MAX_PATH * 2];\r
+    WCHAR name [MAX_PATH * 2];\r
     file.getFullPathName().copyToUTF16 (name, sizeof (name));\r
 \r
     return ExtractAssociatedIcon ((HINSTANCE) Process::getCurrentModuleInstanceHandle(),\r
@@ -4670,10 +4201,12 @@ void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorT
             jassertfalse; break;\r
     }\r
 \r
-    if (auto cursorH = LoadCursor (0, cursorName))\r
-        return cursorH;\r
+    HCURSOR cursorH = LoadCursor (0, cursorName);\r
 \r
-    return LoadCursor (0, IDC_ARROW);\r
+    if (cursorH == 0)\r
+        cursorH = LoadCursor (0, IDC_ARROW);\r
+\r
+    return cursorH;\r
 }\r
 \r
 //==============================================================================\r
@@ -4689,4 +4222,9 @@ void MouseCursor::showInWindow (ComponentPeer*) const
     SetCursor (c);\r
 }\r
 \r
+void MouseCursor::showInAllWindows() const\r
+{\r
+    showInWindow (nullptr);\r
+}\r
+\r
 } // namespace juce\r
index c534c08f4f88a59c0dce8777c658e02dfd004d98..b1ab4849abee63b74db011a198c2917f0daee3b6 100644 (file)
@@ -41,12 +41,12 @@ public:
     RelativeCoordinatePositionerBase (Component&);\r
     ~RelativeCoordinatePositionerBase();\r
 \r
-    void componentMovedOrResized (Component&, bool, bool) override;\r
-    void componentParentHierarchyChanged (Component&) override;\r
-    void componentChildrenChanged (Component&) override;\r
-    void componentBeingDeleted (Component&) override;\r
-    void markersChanged (MarkerList*) override;\r
-    void markerListBeingDeleted (MarkerList*) override;\r
+    void componentMovedOrResized (Component&, bool, bool);\r
+    void componentParentHierarchyChanged (Component&);\r
+    void componentChildrenChanged (Component&);\r
+    void componentBeingDeleted (Component&);\r
+    void markersChanged (MarkerList*);\r
+    void markerListBeingDeleted (MarkerList*);\r
 \r
     void apply();\r
 \r
@@ -63,9 +63,9 @@ public:
         // Suppress a VS2013 compiler warning\r
         ComponentScope& operator= (const ComponentScope&) = delete;\r
 \r
-        Expression getSymbolValue (const String& symbol) const override;\r
-        void visitRelativeScope (const String& scopeName, Visitor&) const override;\r
-        String getScopeUID() const override;\r
+        Expression getSymbolValue (const String& symbol) const;\r
+        void visitRelativeScope (const String& scopeName, Visitor&) const;\r
+        String getScopeUID() const;\r
 \r
     protected:\r
         Component& component;\r
index 813d6af41f05e4ad11f112cea2f4e7b1b4991ad5..ddcda847089dfe0222d6f656d299ed7d14a319b9 100644 (file)
@@ -99,9 +99,9 @@ public:
     {\r
     public:\r
         StartSubPath (const RelativePoint& pos);\r
-        void addToPath (Path& path, Expression::Scope*) const override;\r
-        RelativePoint* getControlPoints (int& numPoints) override;\r
-        ElementBase* clone() const override;\r
+        void addToPath (Path& path, Expression::Scope*) const;\r
+        RelativePoint* getControlPoints (int& numPoints);\r
+        ElementBase* clone() const;\r
 \r
         RelativePoint startPos;\r
 \r
@@ -115,9 +115,9 @@ public:
     {\r
     public:\r
         CloseSubPath();\r
-        void addToPath (Path& path, Expression::Scope*) const override;\r
-        RelativePoint* getControlPoints (int& numPoints) override;\r
-        ElementBase* clone() const override;\r
+        void addToPath (Path& path, Expression::Scope*) const;\r
+        RelativePoint* getControlPoints (int& numPoints);\r
+        ElementBase* clone() const;\r
 \r
     private:\r
         JUCE_DECLARE_NON_COPYABLE (CloseSubPath)\r
@@ -146,9 +146,9 @@ public:
     public:\r
         QuadraticTo (const RelativePoint& controlPoint, const RelativePoint& endPoint);\r
         ValueTree createTree() const;\r
-        void addToPath (Path& path, Expression::Scope*) const override;\r
-        RelativePoint* getControlPoints (int& numPoints) override;\r
-        ElementBase* clone() const override;\r
+        void addToPath (Path& path, Expression::Scope*) const;\r
+        RelativePoint* getControlPoints (int& numPoints);\r
+        ElementBase* clone() const;\r
 \r
         RelativePoint controlPoints[2];\r
 \r
@@ -163,9 +163,9 @@ public:
     public:\r
         CubicTo (const RelativePoint& controlPoint1, const RelativePoint& controlPoint2, const RelativePoint& endPoint);\r
         ValueTree createTree() const;\r
-        void addToPath (Path& path, Expression::Scope*) const override;\r
-        RelativePoint* getControlPoints (int& numPoints) override;\r
-        ElementBase* clone() const override;\r
+        void addToPath (Path& path, Expression::Scope*) const;\r
+        RelativePoint* getControlPoints (int& numPoints);\r
+        ElementBase* clone() const;\r
 \r
         RelativePoint controlPoints[3];\r
 \r
index 67b85eba6cea3ad6770dc7bf4a61765ad41ea930..66885f239a13b134df05edfcb162fc9e861f0982 100644 (file)
@@ -66,7 +66,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    void refresh() override;\r
+    void refresh();\r
 \r
 private:\r
     TextButton button;\r
index 9e1d7277c94c6720f89aa6c0d18470268a84d66b..197451488acc14b791050bbaeea28174c5888c61 100644 (file)
@@ -73,9 +73,9 @@ class ChoicePropertyComponent::RemapperValueSourceWithDefault    : public Value:
                                                                    private Value::Listener\r
 {\r
 public:\r
-    RemapperValueSourceWithDefault (ValueWithDefault* vwd, const Array<var>& map)\r
+    RemapperValueSourceWithDefault (ValueWithDefault& vwd, const Array<var>& map)\r
         : valueWithDefault (vwd),\r
-          sourceValue (valueWithDefault->getPropertyAsValue()),\r
+          sourceValue (valueWithDefault.getPropertyAsValue()),\r
           mappings (map)\r
     {\r
         sourceValue.addListener (this);\r
@@ -83,7 +83,7 @@ public:
 \r
     var getValue() const override\r
     {\r
-        if (valueWithDefault->isUsingDefault())\r
+        if (valueWithDefault.isUsingDefault())\r
             return -1;\r
 \r
         auto targetValue = sourceValue.getValue();\r
@@ -101,24 +101,24 @@ public:
 \r
         if (newValueInt == -1)\r
         {\r
-            valueWithDefault->resetToDefault();\r
+            valueWithDefault.resetToDefault();\r
         }\r
         else\r
         {\r
             auto remappedVal = mappings [newValueInt - 1];\r
 \r
             if (! remappedVal.equalsWithSameType (sourceValue))\r
-                *valueWithDefault = remappedVal;\r
+                valueWithDefault = remappedVal;\r
         }\r
     }\r
 \r
 private:\r
-    void valueChanged (Value&) override { sendChangeMessage (true); }\r
-\r
-    ValueWithDefault* valueWithDefault = nullptr;\r
+    ValueWithDefault& valueWithDefault;\r
     Value sourceValue;\r
     Array<var> mappings;\r
 \r
+    void valueChanged (Value&) override    { sendChangeMessage (true); }\r
+\r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RemapperValueSourceWithDefault)\r
 };\r
@@ -161,19 +161,17 @@ ChoicePropertyComponent::ChoicePropertyComponent (ValueWithDefault& valueToContr
                                                   const Array<var>& correspondingValues)\r
     : ChoicePropertyComponent (name, choiceList, correspondingValues)\r
 {\r
-    valueWithDefault = &valueToControl;\r
+    createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueToControl.getDefault())]);\r
 \r
-    createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueWithDefault->getDefault())]);\r
-\r
-    comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueWithDefault,\r
+    comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueToControl,\r
                                                                                         correspondingValues)));\r
 \r
-    valueWithDefault->onDefaultChange = [this, choiceList, correspondingValues]\r
+    valueToControl.onDefaultChange = [this, &valueToControl, choiceList, correspondingValues]\r
     {\r
         auto selectedId = comboBox.getSelectedId();\r
 \r
         comboBox.clear();\r
-        createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueWithDefault->getDefault())]);\r
+        createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueToControl.getDefault())]);\r
 \r
         comboBox.setSelectedId (selectedId);\r
     };\r
@@ -184,19 +182,17 @@ ChoicePropertyComponent::ChoicePropertyComponent (ValueWithDefault& valueToContr
     : PropertyComponent (name),\r
       choices ({ "Enabled", "Disabled" })\r
 {\r
-    valueWithDefault = &valueToControl;\r
-\r
-    createComboBoxWithDefault (valueWithDefault->getDefault() ? "Enabled" : "Disabled");\r
+    createComboBoxWithDefault (valueToControl.getDefault() ? "Enabled" : "Disabled");\r
 \r
-    comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueWithDefault,\r
+    comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueToControl,\r
                                                                                        { true, false })));\r
 \r
-    valueWithDefault->onDefaultChange = [this]\r
+    valueToControl.onDefaultChange = [this, &valueToControl]\r
     {\r
         auto selectedId = comboBox.getSelectedId();\r
 \r
         comboBox.clear();\r
-        createComboBoxWithDefault (valueWithDefault->getDefault() ? "Enabled" : "Disabled");\r
+        createComboBoxWithDefault (valueToControl.getDefault() ? "Enabled" : "Disabled");\r
 \r
         comboBox.setSelectedId (selectedId);\r
     };\r
@@ -204,8 +200,6 @@ ChoicePropertyComponent::ChoicePropertyComponent (ValueWithDefault& valueToContr
 \r
 ChoicePropertyComponent::~ChoicePropertyComponent()\r
 {\r
-    if (valueWithDefault != nullptr)\r
-        valueWithDefault->onDefaultChange = nullptr;\r
 }\r
 \r
 //==============================================================================\r
index 8f0406aa720608845234549c661b55eee9aa661f..eacbc2cbfc6af32ec1aa6d81f36b08416fff5ae8 100644 (file)
@@ -50,10 +50,6 @@ namespace juce
 */\r
 class JUCE_API  ChoicePropertyComponent    : public PropertyComponent\r
 {\r
-private:\r
-    /** Delegating constructor. */\r
-    ChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
-\r
 protected:\r
     /** Creates the component.\r
         Your subclass's constructor must add a list of options to the choices member variable.\r
@@ -83,8 +79,7 @@ public:
     /** Creates the component using a ValueWithDefault object. This will add an item to the ComboBox for the\r
         default value with an ID of -1.\r
 \r
-        @param valueToControl       the ValueWithDefault object that contains the Value object that the combo box will read and control.\r
-                                    NB: this object must outlive the ChoicePropertyComponent.\r
+        @param valueToControl       the ValueWithDefault object that contains the Value object that the combo box will read and control\r
         @param propertyName         the name of the property\r
         @param choices              the list of possible values that the drop-down list will contain\r
         @param correspondingValues  a list of values corresponding to each item in the 'choices' StringArray.\r
@@ -140,23 +135,20 @@ protected:
     StringArray choices;\r
 \r
 private:\r
-    //==============================================================================\r
+    /** Delegating constructor. */\r
+    ChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
+\r
+    ComboBox comboBox;\r
+    bool isCustomClass = false;\r
+\r
     class RemapperValueSource;\r
     class RemapperValueSourceWithDefault;\r
 \r
-    //==============================================================================\r
     void createComboBox();\r
     void createComboBoxWithDefault (const String&);\r
 \r
     void changeIndex();\r
 \r
-    //==============================================================================\r
-    ComboBox comboBox;\r
-    bool isCustomClass = false;\r
-\r
-    ValueWithDefault* valueWithDefault = nullptr;\r
-\r
-    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChoicePropertyComponent)\r
 };\r
 \r
index 0bc7bc1bbced5f315608ab42313d9d432e185ade..d9c314bda0cfa27027f260b1af1c291e75a8d790 100644 (file)
@@ -106,10 +106,10 @@ class MultiChoicePropertyComponent::MultiChoiceRemapperSourceWithDefault    : pu
                                                                               private Value::Listener\r
 {\r
 public:\r
-    MultiChoiceRemapperSourceWithDefault (ValueWithDefault* vwd, var v, int c, ToggleButton* b)\r
+    MultiChoiceRemapperSourceWithDefault (ValueWithDefault& vwd, var v, int c, ToggleButton* b)\r
         : valueWithDefault (vwd),\r
           varToControl (v),\r
-          sourceValue (valueWithDefault->getPropertyAsValue()),\r
+          sourceValue (valueWithDefault.getPropertyAsValue()),\r
           maxChoices (c),\r
           buttonToControl (b)\r
     {\r
@@ -118,7 +118,7 @@ public:
 \r
     var getValue() const override\r
     {\r
-        auto v = valueWithDefault->get();\r
+        auto v = valueWithDefault.get();\r
 \r
         if (auto* arr = v.getArray())\r
         {\r
@@ -134,11 +134,11 @@ public:
 \r
     void setValue (const var& newValue) override\r
     {\r
-        auto v = valueWithDefault->get();\r
+        auto v = valueWithDefault.get();\r
 \r
         OptionalScopedPointer<Array<var>> arrayToControl;\r
 \r
-        if (valueWithDefault->isUsingDefault())\r
+        if (valueWithDefault.isUsingDefault())\r
             arrayToControl.set (new Array<var>(), true); // use an empty array so the default values are overwritten\r
         else\r
             arrayToControl.set (v.getArray(), false);\r
@@ -149,7 +149,7 @@ public:
 \r
             bool newState = newValue;\r
 \r
-            if (valueWithDefault->isUsingDefault())\r
+            if (valueWithDefault.isUsingDefault())\r
             {\r
                 if (auto* defaultArray = v.getArray())\r
                 {\r
@@ -171,34 +171,33 @@ public:
             StringComparator c;\r
             temp.sort (c);\r
 \r
-            *valueWithDefault = temp;\r
+            valueWithDefault = temp;\r
 \r
             if (temp.size() == 0)\r
-                valueWithDefault->resetToDefault();\r
+                valueWithDefault.resetToDefault();\r
         }\r
     }\r
 \r
 private:\r
+    ValueWithDefault& valueWithDefault;\r
+    var varToControl;\r
+    Value sourceValue;\r
+\r
+    int maxChoices;\r
+\r
+    ToggleButton* buttonToControl;\r
+\r
     //==============================================================================\r
-    void valueChanged (Value&) override { sendChangeMessage (true); }\r
+    void valueChanged (Value&) override    { sendChangeMessage (true); }\r
 \r
     void updateButtonTickColour() const noexcept\r
     {\r
-        auto alpha = valueWithDefault->isUsingDefault() ? 0.4f : 1.0f;\r
+        auto alpha = valueWithDefault.isUsingDefault() ? 0.4f : 1.0f;\r
         auto baseColour = buttonToControl->findColour (ToggleButton::tickColourId);\r
 \r
         buttonToControl->setColour (ToggleButton::tickColourId, baseColour.withAlpha (alpha));\r
     }\r
 \r
-    //==============================================================================\r
-    ValueWithDefault* valueWithDefault = nullptr;\r
-    var varToControl;\r
-    Value sourceValue;\r
-\r
-    int maxChoices;\r
-\r
-    ToggleButton* buttonToControl;\r
-\r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiChoiceRemapperSourceWithDefault)\r
 };\r
@@ -255,24 +254,16 @@ MultiChoicePropertyComponent::MultiChoicePropertyComponent (ValueWithDefault& va
                                                             int maxChoices)\r
     : MultiChoicePropertyComponent (propertyName, choices, correspondingValues)\r
 {\r
-    valueWithDefault = &valueToControl;\r
-\r
     // The value to control must be an array!\r
-    jassert (valueWithDefault->get().isArray());\r
+    jassert (valueToControl.get().isArray());\r
 \r
     for (int i = 0; i < choiceButtons.size(); ++i)\r
-        choiceButtons[i]->getToggleStateValue().referTo (Value (new MultiChoiceRemapperSourceWithDefault (valueWithDefault,\r
+        choiceButtons[i]->getToggleStateValue().referTo (Value (new MultiChoiceRemapperSourceWithDefault (valueToControl,\r
                                                                                                           correspondingValues[i],\r
                                                                                                           maxChoices,\r
                                                                                                           choiceButtons[i])));\r
 \r
-    valueWithDefault->onDefaultChange = [this] { repaint(); };\r
-}\r
-\r
-MultiChoicePropertyComponent::~MultiChoicePropertyComponent()\r
-{\r
-    if (valueWithDefault != nullptr)\r
-        valueWithDefault->onDefaultChange = nullptr;\r
+    valueToControl.onDefaultChange = [this] { repaint(); };\r
 }\r
 \r
 void MultiChoicePropertyComponent::paint (Graphics& g)\r
index 894290a68dfd49acdd406e89416d413236f3c4c8..2a4b3fb4153317ddbac0b632f9efbb39b5663569 100644 (file)
@@ -41,10 +41,6 @@ namespace juce
 */\r
 class MultiChoicePropertyComponent    : public PropertyComponent\r
 {\r
-private:\r
-    /** Delegating constructor. */\r
-    MultiChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
-\r
 public:\r
     /** Creates the component. Note that the underlying var object that the Value refers to must be an array.\r
 \r
@@ -66,8 +62,7 @@ public:
 \r
     /** Creates the component using a ValueWithDefault object. This will select the default options.\r
 \r
-        @param valueToControl       the ValueWithDefault object that contains the Value object that the ToggleButtons will read and control.\r
-                                    NB: This object must outlive the MultiChoicePropertyComponent.\r
+        @param valueToControl       the ValueWithDefault object that contains the Value object that the ToggleButtons will read and control\r
         @param propertyName         the name of the property\r
         @param choices              the list of possible values that will be represented\r
         @param correspondingValues  a list of values corresponding to each item in the 'choices' StringArray.\r
@@ -83,8 +78,6 @@ public:
                                   const Array<var>& correspondingValues,\r
                                   int maxChoices = -1);\r
 \r
-    ~MultiChoicePropertyComponent();\r
-\r
     //==============================================================================\r
     /** Returns true if the list of options is expanded. */\r
     bool isExpanded() const noexcept    { return expanded; }\r
@@ -111,7 +104,8 @@ public:
     void refresh() override {}\r
 \r
 private:\r
-    //==============================================================================\r
+    MultiChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
+\r
     class MultiChoiceRemapperSource;\r
     class MultiChoiceRemapperSourceWithDefault;\r
 \r
@@ -119,8 +113,6 @@ private:
     void lookAndFeelChanged() override;\r
 \r
     //==============================================================================\r
-    ValueWithDefault* valueWithDefault = nullptr;\r
-\r
     int maxHeight = 0;\r
     int numHidden = 0;\r
     bool expanded = false;\r
index 54419a95e3421d38a72c90d373aab0e11133dd8c..19136a5e7628eb37f88beecbebe016b6783e512f 100644 (file)
@@ -27,8 +27,8 @@
 namespace juce\r
 {\r
 \r
-PropertyComponent::PropertyComponent (const String& name, int height)\r
-    : Component (name), preferredHeight (height)\r
+PropertyComponent::PropertyComponent (const String& name, const int preferredHeight_)\r
+    : Component (name), preferredHeight (preferredHeight_)\r
 {\r
     jassert (name.isNotEmpty());\r
 }\r
@@ -37,7 +37,7 @@ PropertyComponent::~PropertyComponent() {}
 \r
 void PropertyComponent::paint (Graphics& g)\r
 {\r
-    auto& lf = getLookAndFeel();\r
+    LookAndFeel& lf = getLookAndFeel();\r
 \r
     lf.drawPropertyComponentBackground (g, getWidth(), getHeight(), *this);\r
     lf.drawPropertyComponentLabel      (g, getWidth(), getHeight(), *this);\r
@@ -45,7 +45,7 @@ void PropertyComponent::paint (Graphics& g)
 \r
 void PropertyComponent::resized()\r
 {\r
-    if (auto c = getChildComponent(0))\r
+    if (Component* const c = getChildComponent(0))\r
         c->setBounds (getLookAndFeel().getPropertyComponentContentPosition (*this));\r
 }\r
 \r
index 240c5f179364753e6716883829112d763ded326b..e814fc80c6604fc909adde7bdf3dd8ba7e337675 100644 (file)
@@ -92,7 +92,7 @@ public:
 \r
     //==============================================================================\r
     /** @internal */\r
-    void refresh() override;\r
+    void refresh();\r
 \r
 protected:\r
     /** The slider component being used in this component.\r
index 8960a64355ae02a208b7242bd0545ca331e23295..109b5425db7a60d73365191b9a69b218d02251ec 100644 (file)
@@ -96,9 +96,8 @@ public:
     {\r
         if (getText().isEmpty() && ! isBeingEdited())\r
         {\r
-            auto& lf = owner.getLookAndFeel();\r
-            auto textArea = lf.getLabelBorderSize (*this).subtractedFrom (getLocalBounds());\r
-            auto labelFont = lf.getLabelFont (*this);\r
+            auto textArea = getBorderSize().subtractedFrom (getLocalBounds());\r
+            auto labelFont = owner.getLookAndFeel().getLabelFont (*this);\r
 \r
             g.setColour (owner.findColour (TextPropertyComponent::textColourId).withAlpha (alphaToUseForEmptyText));\r
             g.setFont (labelFont);\r
@@ -124,26 +123,26 @@ private:
 class TextPropertyComponent::RemapperValueSourceWithDefault    : public Value::ValueSource\r
 {\r
 public:\r
-    RemapperValueSourceWithDefault (ValueWithDefault* vwd)\r
+    RemapperValueSourceWithDefault (const ValueWithDefault& vwd)\r
         : valueWithDefault (vwd)\r
     {\r
     }\r
 \r
     var getValue() const override\r
     {\r
-        return valueWithDefault->isUsingDefault() ? var() : valueWithDefault->get();\r
+        return valueWithDefault.isUsingDefault() ? var() : valueWithDefault.get();\r
     }\r
 \r
     void setValue (const var& newValue) override\r
     {\r
         if (newValue.toString().isEmpty())\r
-            valueWithDefault->resetToDefault();\r
+            valueWithDefault.resetToDefault();\r
         else\r
-            *valueWithDefault = newValue;\r
+            valueWithDefault = newValue;\r
     }\r
 \r
 private:\r
-    ValueWithDefault* valueWithDefault = nullptr;\r
+    ValueWithDefault valueWithDefault;\r
 \r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RemapperValueSourceWithDefault)\r
@@ -160,33 +159,35 @@ TextPropertyComponent::TextPropertyComponent (const String& name,
     createEditor (maxNumChars, isEditable);\r
 }\r
 \r
-TextPropertyComponent::TextPropertyComponent (const Value& valueToControl, const String& name,\r
-                                              int maxNumChars, bool multiLine, bool isEditable)\r
-    : TextPropertyComponent (name, maxNumChars, multiLine, isEditable)\r
+TextPropertyComponent::TextPropertyComponent (const Value& valueToControl,\r
+                                              const String& name,\r
+                                              int maxNumChars,\r
+                                              bool isMultiLine,\r
+                                              bool isEditable)\r
+    : TextPropertyComponent (name, maxNumChars, isMultiLine, isEditable)\r
 {\r
     textEditor->getTextValue().referTo (valueToControl);\r
 }\r
 \r
-TextPropertyComponent::TextPropertyComponent (ValueWithDefault& valueToControl, const String& name,\r
-                                              int maxNumChars, bool multiLine, bool isEditable)\r
-    : TextPropertyComponent (name, maxNumChars, multiLine, isEditable)\r
+TextPropertyComponent::TextPropertyComponent (ValueWithDefault& valueToControl,\r
+                                              const String& name,\r
+                                              int maxNumChars,\r
+                                              bool isMultiLine,\r
+                                              bool isEditable)\r
+    : TextPropertyComponent (name, maxNumChars, isMultiLine, isEditable)\r
 {\r
-    valueWithDefault = &valueToControl;\r
-\r
-    textEditor->getTextValue().referTo (Value (new RemapperValueSourceWithDefault (valueWithDefault)));\r
-    textEditor->setTextToDisplayWhenEmpty (valueWithDefault->getDefault(), 0.5f);\r
+    textEditor->getTextValue().referTo (Value (new RemapperValueSourceWithDefault (valueToControl)));\r
+    textEditor->setTextToDisplayWhenEmpty (valueToControl.getDefault(), 0.5f);\r
 \r
-    valueWithDefault->onDefaultChange = [this]\r
+    valueToControl.onDefaultChange = [this, &valueToControl]\r
     {\r
-        textEditor->setTextToDisplayWhenEmpty (valueWithDefault->getDefault(), 0.5f);\r
+        textEditor->setTextToDisplayWhenEmpty (valueToControl.getDefault(), 0.5f);\r
         repaint();\r
     };\r
 }\r
 \r
 TextPropertyComponent::~TextPropertyComponent()\r
 {\r
-    if (valueWithDefault != nullptr)\r
-        valueWithDefault->onDefaultChange = nullptr;\r
 }\r
 \r
 void TextPropertyComponent::setText (const String& newText)\r
index fb67ef5dfc0d000fa019c5818b9a40eacf2a46ea..e8ee51b6cf1e745a8601cb989009d3ed64130611 100644 (file)
@@ -74,8 +74,7 @@ public:
 \r
     /** Creates a text property component with a default value.\r
 \r
-        @param valueToControl The ValueWithDefault that is controlled by the TextPropertyComponent.\r
-                              NB: this object must outlive the TextPropertyComponent.\r
+        @param valueToControl The ValueWithDefault that is controlled by the TextPropertyComponent\r
         @param propertyName   The name of the property\r
         @param maxNumChars    If not zero, then this specifies the maximum allowable length of\r
                               the string. If zero, then the string will have no length limit.\r
@@ -169,23 +168,19 @@ public:
     virtual void textWasEdited();\r
 \r
 private:\r
+    bool isMultiLine;\r
+\r
     class RemapperValueSourceWithDefault;\r
+\r
     class LabelComp;\r
     friend class LabelComp;\r
 \r
-    //==============================================================================\r
-    void callListeners();\r
-    void createEditor (int maxNumChars, bool isEditable);\r
-\r
-    //==============================================================================\r
-    bool isMultiLine;\r
-\r
     std::unique_ptr<LabelComp> textEditor;\r
     ListenerList<Listener> listenerList;\r
 \r
-    ValueWithDefault* valueWithDefault = nullptr;\r
+    void callListeners();\r
+    void createEditor (int maxNumChars, bool isEditable);\r
 \r
-    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextPropertyComponent)\r
 };\r
 \r
index cf59fa85742399d1bb3651674fa61b8aea59f300..c7bec333327155709768f370d602b4eb5a6b64c3 100644 (file)
@@ -369,8 +369,16 @@ void ComboBox::paint (Graphics& g)
                                    label->getRight(), 0, getWidth() - label->getRight(), getHeight(),\r
                                    *this);\r
 \r
-    if (textWhenNothingSelected.isNotEmpty() && label->getText().isEmpty() && ! label->isBeingEdited())\r
-        getLookAndFeel().drawComboBoxTextWhenNothingSelected (g, *this, *label);\r
+    if (textWhenNothingSelected.isNotEmpty()\r
+         && label->getText().isEmpty()\r
+         && ! label->isBeingEdited())\r
+    {\r
+        g.setColour (findColour (textColourId).withMultipliedAlpha (0.5f));\r
+        g.setFont (label->getLookAndFeel().getLabelFont (*label));\r
+        g.drawFittedText (textWhenNothingSelected, label->getBounds().reduced (2, 1),\r
+                          label->getJustificationType(),\r
+                          jmax (1, (int) (label->getHeight() / label->getFont().getHeight())));\r
+    }\r
 }\r
 \r
 void ComboBox::resized()\r
@@ -515,9 +523,6 @@ static void comboBoxPopupMenuFinishedCallback (int result, ComboBox* combo)
 \r
 void ComboBox::showPopup()\r
 {\r
-    if (! menuActive)\r
-        menuActive = true;\r
-\r
     auto menu = currentMenu;\r
 \r
     if (menu.getNumItems() > 0)\r
@@ -537,10 +542,12 @@ void ComboBox::showPopup()
         menu.addItem (1, noChoicesMessage, false, false);\r
     }\r
 \r
-    auto& lf = getLookAndFeel();\r
-\r
-    menu.setLookAndFeel (&lf);\r
-    menu.showMenuAsync (lf.getOptionsForComboBoxPopupMenu (*this, *label),\r
+    menu.setLookAndFeel (&getLookAndFeel());\r
+    menu.showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
+                                            .withItemThatMustBeVisible (getSelectedId())\r
+                                            .withMinimumWidth (getWidth())\r
+                                            .withMaximumNumColumns (1)\r
+                                            .withStandardItemHeight (label->getHeight()),\r
                         ModalCallbackFunction::forComponent (comboBoxPopupMenuFinishedCallback, this));\r
 }\r
 \r
index f6d51d88d736e28cd90a7ce988da108062cad0f7..68cd9c0914167280c9af5f10ffd589f29693b0f4 100644 (file)
@@ -240,7 +240,7 @@ public:
 \r
         The text passed-in will be set as the current text regardless of whether\r
         it is one of the items in the list. If the current text isn't one of the\r
-        items, then getSelectedId() will return 0, otherwise it wil return\r
+        items, then getSelectedId() will return -1, otherwise it wil return\r
         the approriate ID.\r
 \r
         @param newText          the text to select\r
@@ -376,10 +376,6 @@ public:
         virtual Label* createComboBoxTextBox (ComboBox&) = 0;\r
 \r
         virtual void positionComboBoxText (ComboBox&, Label& labelToPosition) = 0;\r
-\r
-        virtual PopupMenu::Options getOptionsForComboBoxPopupMenu (ComboBox&, Label&) = 0;\r
-\r
-        virtual void drawComboBoxTextWhenNothingSelected (Graphics&, ComboBox&, Label&) = 0;\r
     };\r
 \r
     //==============================================================================\r
index 254b47bbc0fbdcff8b4d38a0a492c071b5d4ecf7..c353a773bb57d859772bac87698750a6645f698f 100644 (file)
@@ -131,17 +131,16 @@ void Label::setBorderSize (BorderSize<int> newBorder)
 //==============================================================================\r
 Component* Label::getAttachedComponent() const\r
 {\r
-    return ownerComponent.get();\r
+    return static_cast<Component*> (ownerComponent);\r
 }\r
 \r
 void Label::attachToComponent (Component* owner, bool onLeft)\r
 {\r
-    jassert (owner != this); // Not a great idea to try to attach it to itself!\r
-\r
     if (ownerComponent != nullptr)\r
         ownerComponent->removeComponentListener (this);\r
 \r
     ownerComponent = owner;\r
+\r
     leftOfOwnerComp = onLeft;\r
 \r
     if (ownerComponent != nullptr)\r
@@ -155,21 +154,19 @@ void Label::attachToComponent (Component* owner, bool onLeft)
 \r
 void Label::componentMovedOrResized (Component& component, bool /*wasMoved*/, bool /*wasResized*/)\r
 {\r
-    auto& lf = getLookAndFeel();\r
-    auto f = lf.getLabelFont (*this);\r
-    auto borderSize = lf.getLabelBorderSize (*this);\r
+    auto f = getLookAndFeel().getLabelFont (*this);\r
 \r
     if (leftOfOwnerComp)\r
     {\r
         auto width = jmin (roundToInt (f.getStringWidthFloat (textValue.toString()) + 0.5f)\r
-                             + borderSize.getLeftAndRight(),\r
+                             + getBorderSize().getLeftAndRight(),\r
                            component.getX());\r
 \r
         setBounds (component.getX() - width, component.getY(), width, component.getHeight());\r
     }\r
     else\r
     {\r
-        auto height = borderSize.getTopAndBottom() + 6 + roundToInt (f.getHeight() + 0.5f);\r
+        auto height = getBorderSize().getTopAndBottom() + 6 + roundToInt (f.getHeight() + 0.5f);\r
 \r
         setBounds (component.getX(), component.getY() - height, component.getWidth(), height);\r
     }\r
index e6f1bf2318d28860b8f96507efadf3462bd624be..084bbe3e18783d98453df8e1a506a204a3057e01 100644 (file)
@@ -280,7 +280,6 @@ public:
 \r
         virtual void drawLabel (Graphics&, Label&) = 0;\r
         virtual Font getLabelFont (Label&) = 0;\r
-        virtual BorderSize<int> getLabelBorderSize (Label&) = 0;\r
     };\r
 \r
 protected:\r
index 378d7aa1dfd908de5a3d467e2e82eee039971d06..504b0db615780c6a42555ea811ddc0666f154725 100644 (file)
@@ -88,18 +88,6 @@ public:
             || style == LinearBarVertical;\r
     }\r
 \r
-    bool isTwoValue() const noexcept\r
-    {\r
-        return style == TwoValueHorizontal\r
-            || style == TwoValueVertical;\r
-    }\r
-\r
-    bool isThreeValue() const noexcept\r
-    {\r
-        return style == ThreeValueHorizontal\r
-            || style == ThreeValueVertical;\r
-    }\r
-\r
     bool incDecDragDirectionIsHorizontal() const noexcept\r
     {\r
         return incDecButtonMode == incDecButtonsDraggable_Horizontal\r
@@ -662,7 +650,10 @@ public:
 \r
     int getThumbIndexAt (const MouseEvent& e)\r
     {\r
-        if (isTwoValue() || isThreeValue())\r
+        bool isTwoValue   = (style == TwoValueHorizontal   || style == TwoValueVertical);\r
+        bool isThreeValue = (style == ThreeValueHorizontal || style == ThreeValueVertical);\r
+\r
+        if (isTwoValue || isThreeValue)\r
         {\r
             auto mousePos = isVertical() ? e.position.y : e.position.x;\r
 \r
@@ -670,7 +661,7 @@ public:
             auto minPosDistance    = std::abs (getLinearSliderPos (valueMin.getValue()) + (isVertical() ? 0.1f : -0.1f) - mousePos);\r
             auto maxPosDistance    = std::abs (getLinearSliderPos (valueMax.getValue()) + (isVertical() ? -0.1f : 0.1f) - mousePos);\r
 \r
-            if (isTwoValue())\r
+            if (isTwoValue)\r
                 return maxPosDistance <= minPosDistance ? 2 : 1;\r
 \r
             if (normalPosDistance >= minPosDistance && maxPosDistance >= minPosDistance)\r
@@ -843,10 +834,9 @@ public:
 \r
                 minMaxDiff = static_cast<double> (valueMax.getValue()) - static_cast<double> (valueMin.getValue());\r
 \r
-                if (! isTwoValue())\r
-                    lastAngle = rotaryParams.startAngleRadians\r
-                                    + (rotaryParams.endAngleRadians - rotaryParams.startAngleRadians)\r
-                                         * owner.valueToProportionOfLength (currentValue.getValue());\r
+                lastAngle = rotaryParams.startAngleRadians\r
+                                + (rotaryParams.endAngleRadians - rotaryParams.startAngleRadians)\r
+                                     * owner.valueToProportionOfLength (currentValue.getValue());\r
 \r
                 valueWhenLastDragged = (sliderBeingDragged == 2 ? valueMax\r
                                                                 : (sliderBeingDragged == 1 ? valueMin\r
@@ -965,14 +955,17 @@ public:
 \r
     void mouseMove()\r
     {\r
+        auto isTwoValue   = (style == TwoValueHorizontal   || style == TwoValueVertical);\r
+        auto isThreeValue = (style == ThreeValueHorizontal || style == ThreeValueVertical);\r
+\r
         // this is a workaround for a bug where the popup display being dismissed triggers\r
         // a mouse move causing it to never be hidden\r
         auto shouldShowPopup = showPopupOnHover\r
                                 && (Time::getMillisecondCounterHiRes() - lastPopupDismissal) > 250;\r
 \r
         if (shouldShowPopup\r
-             && ! isTwoValue()\r
-             && ! isThreeValue())\r
+             && ! isTwoValue\r
+             && ! isThreeValue)\r
         {\r
             if (owner.isMouseOver (true))\r
             {\r
@@ -997,14 +990,12 @@ public:
 \r
         if (popupDisplay == nullptr)\r
         {\r
-            popupDisplay.reset (new PopupDisplayComponent (owner, parentForPopupDisplay == nullptr));\r
+            popupDisplay.reset (new PopupDisplayComponent (owner));\r
 \r
             if (parentForPopupDisplay != nullptr)\r
                 parentForPopupDisplay->addChildComponent (popupDisplay.get());\r
             else\r
-                popupDisplay->addToDesktop (ComponentPeer::windowIsTemporary\r
-                                            | ComponentPeer::windowIgnoresKeyPresses\r
-                                            | ComponentPeer::windowIgnoresMouseClicks);\r
+                popupDisplay->addToDesktop (ComponentPeer::windowIsTemporary);\r
 \r
             if (style == SliderStyle::TwoValueHorizontal\r
                 || style == SliderStyle::TwoValueVertical)\r
@@ -1284,13 +1275,10 @@ public:
     struct PopupDisplayComponent  : public BubbleComponent,\r
                                     public Timer\r
     {\r
-        PopupDisplayComponent (Slider& s, bool isOnDesktop)\r
+        PopupDisplayComponent (Slider& s)\r
             : owner (s),\r
               font (s.getLookAndFeel().getSliderPopupFont (s))\r
         {\r
-            if (isOnDesktop)\r
-                setTransform (AffineTransform::scale (getApproximateScaleFactor (&s)));\r
-\r
             setAlwaysOnTop (true);\r
             setAllowedPlacement (owner.getLookAndFeel().getSliderPopupPlacement (s));\r
             setLookAndFeel (&s.getLookAndFeel());\r
@@ -1298,8 +1286,7 @@ public:
 \r
         ~PopupDisplayComponent()\r
         {\r
-            if (owner.pimpl != nullptr)\r
-                owner.pimpl->lastPopupDismissal = Time::getMillisecondCounterHiRes();\r
+            owner.pimpl->lastPopupDismissal = Time::getMillisecondCounterHiRes();\r
         }\r
 \r
         void paintContent (Graphics& g, int w, int h) override\r
@@ -1329,22 +1316,6 @@ public:
         }\r
 \r
     private:\r
-        static float getApproximateScaleFactor (Component* targetComponent)\r
-        {\r
-            AffineTransform transform;\r
-\r
-            for (Component* target = targetComponent; target != nullptr; target = target->getParentComponent())\r
-            {\r
-                transform = transform.followedBy (target->getTransform());\r
-\r
-                if (target->isOnDesktop())\r
-                    transform = transform.scaled (target->getDesktopScaleFactor());\r
-            }\r
-\r
-            return (transform.getScaleFactor() / Desktop::getInstance().getGlobalScaleFactor());\r
-        }\r
-\r
-        //==============================================================================\r
         Slider& owner;\r
         Font font;\r
         String text;\r
@@ -1632,8 +1603,6 @@ bool Slider::isHorizontal() const noexcept                  { return pimpl->isHo
 bool Slider::isVertical() const noexcept                    { return pimpl->isVertical(); }\r
 bool Slider::isRotary() const noexcept                      { return pimpl->isRotary(); }\r
 bool Slider::isBar() const noexcept                         { return pimpl->isBar(); }\r
-bool Slider::isTwoValue() const noexcept                    { return pimpl->isTwoValue(); }\r
-bool Slider::isThreeValue() const noexcept                  { return pimpl->isThreeValue(); }\r
 \r
 float Slider::getPositionOfValue (double value) const       { return pimpl->getPositionOfValue (value); }\r
 \r
index 51896dc7a396ac91d392409e07fc28d7604873cc..c759b45a3cd239f967f01f63dd7fec2b59c80199 100644 (file)
@@ -843,10 +843,6 @@ public:
     bool isRotary() const noexcept;\r
     /** True if the slider is in a linear bar mode. */\r
     bool isBar() const noexcept;\r
-    /** True if the slider has two thumbs. */\r
-    bool isTwoValue() const noexcept;\r
-    /** True if the slider has three thumbs. */\r
-    bool isThreeValue() const noexcept;\r
 \r
     //==============================================================================\r
     /** A set of colour IDs to use to change the colour of various aspects of the slider.\r
@@ -977,6 +973,8 @@ public:
 private:\r
     //==============================================================================\r
     JUCE_PUBLIC_IN_DLL_BUILD (class Pimpl)\r
+    friend class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     void init (SliderStyle, TextEntryBoxPosition);\r
index ac064df304097b9d484a27df59667e5bec12c8da..fdf3c7f6992588f9ff34db1354450551a248ba04 100644 (file)
@@ -156,7 +156,7 @@ void TableHeaderComponent::moveColumn (const int columnId, int newIndex)
     auto currentIndex = getIndexOfColumnId (columnId, false);\r
     newIndex = visibleIndexToTotalIndex (newIndex);\r
 \r
-    if (columns[currentIndex] != nullptr && currentIndex != newIndex)\r
+    if (columns [currentIndex] != 0 && currentIndex != newIndex)\r
     {\r
         columns.move (currentIndex, newIndex);\r
         sendColumnsChanged();\r
@@ -436,42 +436,40 @@ String TableHeaderComponent::toString() const
 \r
 void TableHeaderComponent::restoreFromString (const String& storedVersion)\r
 {\r
-    if (auto storedXML = parseXML (storedVersion))\r
+    std::unique_ptr<XmlElement> storedXml (XmlDocument::parse (storedVersion));\r
+    int index = 0;\r
+\r
+    if (storedXml != nullptr && storedXml->hasTagName ("TABLELAYOUT"))\r
     {\r
-        if (storedXML->hasTagName ("TABLELAYOUT"))\r
+        forEachXmlChildElement (*storedXml, col)\r
         {\r
-            int index = 0;\r
+            auto tabId = col->getIntAttribute ("id");\r
 \r
-            forEachXmlChildElement (*storedXML, col)\r
+            if (auto* ci = getInfoForId (tabId))\r
             {\r
-                auto tabId = col->getIntAttribute ("id");\r
-\r
-                if (auto* ci = getInfoForId (tabId))\r
-                {\r
-                    columns.move (columns.indexOf (ci), index);\r
-                    ci->width = col->getIntAttribute ("width");\r
-                    setColumnVisible (tabId, col->getBoolAttribute ("visible"));\r
-                }\r
-\r
-                ++index;\r
+                columns.move (columns.indexOf (ci), index);\r
+                ci->width = col->getIntAttribute ("width");\r
+                setColumnVisible (tabId, col->getBoolAttribute ("visible"));\r
             }\r
 \r
-            columnsResized = true;\r
-            sendColumnsChanged();\r
-\r
-            setSortColumnId (storedXML->getIntAttribute ("sortedCol"),\r
-                             storedXML->getBoolAttribute ("sortForwards", true));\r
+            ++index;\r
         }\r
+\r
+        columnsResized = true;\r
+        sendColumnsChanged();\r
+\r
+        setSortColumnId (storedXml->getIntAttribute ("sortedCol"),\r
+                         storedXml->getBoolAttribute ("sortForwards", true));\r
     }\r
 }\r
 \r
 //==============================================================================\r
-void TableHeaderComponent::addListener (Listener* newListener)\r
+void TableHeaderComponent::addListener (Listener* const newListener)\r
 {\r
     listeners.addIfNotAlreadyThere (newListener);\r
 }\r
 \r
-void TableHeaderComponent::removeListener (Listener* listenerToRemove)\r
+void TableHeaderComponent::removeListener (Listener* const listenerToRemove)\r
 {\r
     listeners.removeFirstMatchingValue (listenerToRemove);\r
 }\r
@@ -501,11 +499,11 @@ void TableHeaderComponent::reactToMenuItem (const int menuReturnId, const int /*
 \r
 void TableHeaderComponent::paint (Graphics& g)\r
 {\r
-    auto& lf = getLookAndFeel();\r
+    LookAndFeel& lf = getLookAndFeel();\r
 \r
     lf.drawTableHeaderBackground (g, *this);\r
 \r
-    auto clip = g.getClipBounds();\r
+    const Rectangle<int> clip (g.getClipBounds());\r
 \r
     int x = 0;\r
 \r
index 7c4e1faa4001f42de398661779537344d9954fdb..f7363eb6c8ad8df6942e892cdc67a039002fcb47 100644 (file)
@@ -711,13 +711,13 @@ struct TextEditor::InsertAction  : public UndoableAction
 \r
     bool perform() override\r
     {\r
-        owner.insert (text, insertIndex, font, colour, nullptr, newCaretPos);\r
+        owner.insert (text, insertIndex, font, colour, 0, newCaretPos);\r
         return true;\r
     }\r
 \r
     bool undo() override\r
     {\r
-        owner.remove ({ insertIndex, insertIndex + text.length() }, nullptr, oldCaretPos);\r
+        owner.remove ({ insertIndex, insertIndex + text.length() }, 0, oldCaretPos);\r
         return true;\r
     }\r
 \r
@@ -751,7 +751,7 @@ struct TextEditor::RemoveAction  : public UndoableAction
 \r
     bool perform() override\r
     {\r
-        owner.remove (range, nullptr, newCaretPos);\r
+        owner.remove (range, 0, newCaretPos);\r
         return true;\r
     }\r
 \r
@@ -1171,7 +1171,7 @@ void TextEditor::setText (const String& newText, bool sendTextChangeMessage)
         bool cursorWasAtEnd = oldCursorPos >= getTotalNumChars();\r
 \r
         clearInternal (nullptr);\r
-        insert (newText, 0, currentFont, findColour (textColourId), nullptr, caretPosition);\r
+        insert (newText, 0, currentFont, findColour (textColourId), 0, caretPosition);\r
 \r
         // if you're adding text with line-feeds to a single-line text editor, it\r
         // ain't gonna look right!\r
index 48ec7afca7365ea9ebfdd0522caf74d1ee8d4f78..53dba843fdb4ef483131447583ac5ecbe9eb73d7 100644 (file)
@@ -900,12 +900,15 @@ public:
     void itemDropped (const SourceDetails&) override;\r
 \r
 private:\r
-    friend class TreeViewItem;\r
-\r
     class ContentComponent;\r
     class TreeViewport;\r
     class InsertPointHighlight;\r
     class TargetGroupHighlight;\r
+    friend class TreeViewItem;\r
+    friend class ContentComponent;\r
+    friend struct ContainerDeletePolicy<TreeViewport>;\r
+    friend struct ContainerDeletePolicy<InsertPointHighlight>;\r
+    friend struct ContainerDeletePolicy<TargetGroupHighlight>;\r
 \r
     std::unique_ptr<TreeViewport> viewport;\r
     CriticalSection nodeAlterationLock;\r
index 755d1dc0eefe7706e44b39fda5c6e18900ce6019..c55c7aa8f8fa4352da70c9099156d4e97e4c6f2d 100644 (file)
@@ -108,7 +108,7 @@ void AlertWindow::addButton (const String& name,
 \r
     b->setWantsKeyboardFocus (true);\r
     b->setMouseClickGrabsKeyboardFocus (false);\r
-    b->setCommandToTrigger (nullptr, returnValue, false);\r
+    b->setCommandToTrigger (0, returnValue, false);\r
     b->addShortcut (shortcutKey1);\r
     b->addShortcut (shortcutKey2);\r
     b->onClick = [this, b] { exitAlert (b); };\r
index b772533b18fb9d0370470e25d37b883a38894424..f637acca25620723764b55a05d908f61cf069aa5 100644 (file)
@@ -42,7 +42,8 @@ CallOutBox::CallOutBox (Component& c, Rectangle<int> area, Component* const pare
     {\r
         setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows());\r
 \r
-        updatePosition (area, Desktop::getInstance().getDisplays().findDisplayForRect (area).userArea);\r
+        updatePosition (area, Desktop::getInstance().getDisplays()\r
+                                .getDisplayContaining (area.getCentre()).userArea);\r
 \r
         addToDesktop (ComponentPeer::windowIsTemporary);\r
 \r
index 62f7cc7a12e8b2cad700a6538fee42fa8b58baaa..79293921f6a5d8ed8406fa173f1a922adf2b6a51 100644 (file)
@@ -82,7 +82,7 @@ public:
     ~CallOutBox();\r
 \r
     //==============================================================================\r
-    /** Changes the base width of the arrow. */\r
+    /** Changes the length of the arrow. */\r
     void setArrowSize (float newSize);\r
 \r
     /** Updates the position and size of the box.\r
index d6540444df28f9b29cd32b9815b3e408a3035a1e..11ce90757497c3779b10f9113cad0db452c17e64 100644 (file)
@@ -109,15 +109,11 @@ void ComponentPeer::handlePaint (LowLevelGraphicsContext& contextToPaintTo)
         g.addTransform (component.getTransform());\r
 \r
     auto peerBounds = getBounds();\r
-    auto componentBounds = component.getLocalBounds();\r
 \r
-    if (component.isTransformed())\r
-        componentBounds = componentBounds.transformedBy (component.getTransform());\r
-\r
-    if (peerBounds.getWidth() != componentBounds.getWidth() || peerBounds.getHeight() != componentBounds.getHeight())\r
+    if (peerBounds.getWidth() != component.getWidth() || peerBounds.getHeight() != component.getHeight())\r
         // Tweak the scaling so that the component's integer size exactly aligns with the peer's scaled size\r
-        g.addTransform (AffineTransform::scale (peerBounds.getWidth()  / (float) componentBounds.getWidth(),\r
-                                                peerBounds.getHeight() / (float) componentBounds.getHeight()));\r
+        g.addTransform (AffineTransform::scale (peerBounds.getWidth()  / (float) component.getWidth(),\r
+                                                peerBounds.getHeight() / (float) component.getHeight()));\r
 \r
   #if JUCE_ENABLE_REPAINT_DEBUGGING\r
    #ifdef JUCE_IS_REPAINT_DEBUGGING_ACTIVE\r
index 714b9ee6ea25ed92a879ab061fa30d501f5c2149..1440597d89ad3fc095f176f2816abea04e617846 100644 (file)
@@ -377,36 +377,6 @@ public:
     */\r
     static ModifierKeys getCurrentModifiersRealtime() noexcept;\r
 \r
-    //==============================================================================\r
-    /**  Used to receive callbacks when the OS scale factor of this ComponentPeer changes.\r
-\r
-         This is used internally by some native JUCE windows on Windows and Linux and you\r
-         shouldn't need to worry about it in your own code unless you are dealing directly\r
-         with native windows.\r
-    */\r
-    struct JUCE_API  ScaleFactorListener\r
-    {\r
-        /** Destructor. */\r
-        virtual ~ScaleFactorListener() {}\r
-\r
-        /** Called when the scale factor changes. */\r
-        virtual void nativeScaleFactorChanged (double newScaleFactor) = 0;\r
-    };\r
-\r
-    /** Adds a scale factor listener. */\r
-    void addScaleFactorListener (ScaleFactorListener* listenerToAdd)          { scaleFactorListeners.add (listenerToAdd); }\r
-\r
-    /** Removes a scale factor listener. */\r
-    void removeScaleFactorListener (ScaleFactorListener* listenerToRemove)    { scaleFactorListeners.remove (listenerToRemove);  }\r
-\r
-    //==============================================================================\r
-    /** On Windows and Linux this will return the OS scaling factor currently being applied\r
-        to the native window. This is used to convert between physical and logical pixels\r
-        at the OS API level and you shouldn't need to use it in your own code unless you\r
-        are dealing directly with the native window.\r
-    */\r
-    virtual double getPlatformScaleFactor() const noexcept    { return 1.0; }\r
-\r
 protected:\r
     //==============================================================================\r
     Component& component;\r
@@ -414,7 +384,6 @@ protected:
     Rectangle<int> lastNonFullscreenBounds;\r
     ComponentBoundsConstrainer* constrainer = nullptr;\r
     static std::function<ModifierKeys()> getNativeRealtimeModifiers;\r
-    ListenerList<ScaleFactorListener> scaleFactorListeners;\r
 \r
 private:\r
     //==============================================================================\r
index eabcffdc3ad5da434e25b192a9bf97922e62f42b..e5ef3a4b95ad1b17197bb692e6990ab71e0f8645 100644 (file)
@@ -153,7 +153,7 @@ public:
     //==============================================================================\r
     /** Easy way of quickly showing a dialog box containing a given component.\r
 \r
-        Note: This method has been superceded by the DialogWindow::LaunchOptions structure,\r
+        Note: this method has been superceded by the DialogWindow::LaunchOptions structure,\r
         which does the same job with some extra flexibility. The showDialog method is here\r
         for backwards compatibility, but please use DialogWindow::LaunchOptions in new code.\r
 \r
@@ -199,7 +199,7 @@ public:
    #if JUCE_MODAL_LOOPS_PERMITTED || DOXYGEN\r
     /** Easy way of quickly showing a dialog box containing a given component.\r
 \r
-        Note: This method has been superceded by the DialogWindow::LaunchOptions structure,\r
+        Note: this method has been superceded by the DialogWindow::LaunchOptions structure,\r
         which does the same job with some extra flexibility. The showDialog method is here\r
         for backwards compatibility, but please use DialogWindow::LaunchOptions in new code.\r
 \r
index 2a3bcf84a41aeea8d709a27cdec541bea03522ac..ab6372054edc5636553edfa816188178ba68b4c6 100644 (file)
@@ -212,7 +212,7 @@ void DocumentWindow::paint (Graphics& g)
                                                  titleBarArea.getHeight(),\r
                                                  titleSpaceX1,\r
                                                  jmax (1, titleSpaceX2 - titleSpaceX1),\r
-                                                 titleBarIcon.isValid() ? &titleBarIcon : nullptr,\r
+                                                 titleBarIcon.isValid() ? &titleBarIcon : 0,\r
                                                  ! drawTitleTextCentred);\r
 }\r
 \r
index 31c17d51202f86c6354fadbcdad7559949505f4b..dd7b4c8169ad34cb8a5f3d36d5c77d6e866c0913 100644 (file)
@@ -286,6 +286,7 @@ private:
     MenuBarModel* menuBarModel = nullptr;\r
 \r
     class ButtonListenerProxy;\r
+    friend struct ContainerDeletePolicy<ButtonListenerProxy>;\r
     std::unique_ptr<ButtonListenerProxy> buttonListener;\r
 \r
     void repaintTitleBar();\r
index dc46a229d738d0bbfbea1675ab31296d1340cb41..6123b577ea260e5252e6fad53971aa0de1970ed6 100644 (file)
@@ -565,7 +565,7 @@ bool ResizableWindow::restoreWindowStateFromString (const String& s)
 \r
         if (onScreenArea.getWidth() * onScreenArea.getHeight() < 32 * 32)\r
         {\r
-            auto screen = desktop.getDisplays().findDisplayForRect (newPos).userArea;\r
+            auto screen = desktop.getDisplays().getDisplayContaining (newPos.getCentre()).userArea;\r
 \r
             newPos.setSize (jmin (newPos.getWidth(),  screen.getWidth()),\r
                             jmin (newPos.getHeight(), screen.getHeight()));\r
index 346ae7d42efee6ea66983dd0a08b617e98667721..0c568e8838fcae3a3b75b9e35e2111a4fb89f385 100644 (file)
@@ -59,7 +59,7 @@ ThreadWithProgressWindow::~ThreadWithProgressWindow()
 \r
 void ThreadWithProgressWindow::launchThread (int priority)\r
 {\r
-    JUCE_ASSERT_MESSAGE_THREAD\r
+    jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
     startThread (priority);\r
     startTimer (100);\r
@@ -87,7 +87,7 @@ void ThreadWithProgressWindow::timerCallback()
 {\r
     bool threadStillRunning = isThreadRunning();\r
 \r
-    if (! (threadStillRunning && alertWindow->isCurrentlyModal (false)))\r
+    if (! (threadStillRunning && alertWindow->isCurrentlyModal()))\r
     {\r
         stopTimer();\r
         stopThread (timeOutMsWhenCancelling);\r
index e992311438b38cb7d850b01c56ef5e9fa0561ebe..8bd5d8e9f35fb83477c46c1fcbc87095ec8317f1 100644 (file)
@@ -92,7 +92,8 @@ void TooltipWindow::displayTip (Point<int> screenPos, const String& tip)
         }\r
         else\r
         {\r
-            updatePosition (tip, screenPos, Desktop::getInstance().getDisplays().findDisplayForPoint (screenPos).userArea);\r
+            updatePosition (tip, screenPos, Desktop::getInstance().getDisplays()\r
+                                                .getDisplayContaining (screenPos).userArea);\r
 \r
             addToDesktop (ComponentPeer::windowHasDropShadow\r
                             | ComponentPeer::windowIsTemporary\r
@@ -108,8 +109,7 @@ void TooltipWindow::displayTip (Point<int> screenPos, const String& tip)
             if (w != this && w->tipShowing == tipShowing)\r
             {\r
                 // Looks like you have more than one TooltipWindow showing the same tip..\r
-                // Be careful not to create more than one instance of this class with the\r
-                // same parent component!\r
+                // Be careful not to create more than one instance of this class!\r
                 jassertfalse;\r
             }\r
         }\r
@@ -153,55 +153,50 @@ void TooltipWindow::timerCallback()
     auto now = Time::getApproximateMillisecondCounter();\r
 \r
     auto* newComp = mouseSource.isTouch() ? nullptr : mouseSource.getComponentUnderMouse();\r
-    auto* parent = getParentComponent();\r
+    auto newTip = newComp != nullptr ? getTipFor (*newComp) : String();\r
+    bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
+    lastComponentUnderMouse = newComp;\r
+    lastTipUnderMouse = newTip;\r
 \r
-    if (newComp == nullptr || parent == nullptr || parent == newComp || parent->isParentOf (newComp))\r
-    {\r
-        auto newTip = newComp != nullptr ? getTipFor (*newComp) : String();\r
-        bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
-        lastComponentUnderMouse = newComp;\r
-        lastTipUnderMouse = newTip;\r
-\r
-        auto clickCount = desktop.getMouseButtonClickCounter();\r
-        auto wheelCount = desktop.getMouseWheelMoveCounter();\r
-        bool mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves);\r
-        mouseClicks = clickCount;\r
-        mouseWheelMoves = wheelCount;\r
+    auto clickCount = desktop.getMouseButtonClickCounter();\r
+    auto wheelCount = desktop.getMouseWheelMoveCounter();\r
+    bool mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves);\r
+    mouseClicks = clickCount;\r
+    mouseWheelMoves = wheelCount;\r
 \r
-        auto mousePos = mouseSource.getScreenPosition();\r
-        bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12;\r
-        lastMousePos = mousePos;\r
+    auto mousePos = mouseSource.getScreenPosition();\r
+    bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12;\r
+    lastMousePos = mousePos;\r
 \r
-        if (tipChanged || mouseWasClicked || mouseMovedQuickly)\r
-            lastCompChangeTime = now;\r
+    if (tipChanged || mouseWasClicked || mouseMovedQuickly)\r
+        lastCompChangeTime = now;\r
 \r
-        if (isVisible() || now < lastHideTime + 500)\r
+    if (isVisible() || now < lastHideTime + 500)\r
+    {\r
+        // if a tip is currently visible (or has just disappeared), update to a new one\r
+        // immediately if needed..\r
+        if (newComp == nullptr || mouseWasClicked || newTip.isEmpty())\r
         {\r
-            // if a tip is currently visible (or has just disappeared), update to a new one\r
-            // immediately if needed..\r
-            if (newComp == nullptr || mouseWasClicked || newTip.isEmpty())\r
+            if (isVisible())\r
             {\r
-                if (isVisible())\r
-                {\r
-                    lastHideTime = now;\r
-                    hideTip();\r
-                }\r
-            }\r
-            else if (tipChanged)\r
-            {\r
-                displayTip (mousePos.roundToInt(), newTip);\r
+                lastHideTime = now;\r
+                hideTip();\r
             }\r
         }\r
-        else\r
+        else if (tipChanged)\r
         {\r
-            // if there isn't currently a tip, but one is needed, only let it\r
-            // appear after a timeout..\r
-            if (newTip.isNotEmpty()\r
-                 && newTip != tipShowing\r
-                 && now > lastCompChangeTime + (uint32) millisecondsBeforeTipAppears)\r
-            {\r
-                displayTip (mousePos.roundToInt(), newTip);\r
-            }\r
+            displayTip (mousePos.roundToInt(), newTip);\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // if there isn't currently a tip, but one is needed, only let it\r
+        // appear after a timeout..\r
+        if (newTip.isNotEmpty()\r
+             && newTip != tipShowing\r
+             && now > lastCompChangeTime + (uint32) millisecondsBeforeTipAppears)\r
+        {\r
+            displayTip (mousePos.roundToInt(), newTip);\r
         }\r
     }\r
 }\r
index cbdc16989d0c8a282980cc0e4b955a31c8b9ee23..a73f0f750c18fe70af6c5f1496755b363a2c231c 100644 (file)
@@ -32,15 +32,11 @@ namespace juce
     A window that displays a pop-up tooltip when the mouse hovers over another component.\r
 \r
     To enable tooltips in your app, just create a single instance of a TooltipWindow\r
-    object. Note that if you instantiate more than one instance of this class with the\r
-    same parentComponent (even if both TooltipWindow's parentComponent is nil), you'll\r
-    end up with multiple tooltips being shown! To avoid this use a SharedResourcePointer\r
-    to instantiate the TooltipWindow only once.\r
-\r
-    For audio plug-ins (which should not be opening native windows) it is better\r
-    to add a TooltipWindow as a member variable to the editor and ensure that the\r
-    editor is the parentComponent of your TooltipWindow. This will ensure that your\r
-    TooltipWindow is scaled according to your editor and the DAWs scaling setting.\r
+    object. Note that if you instantiate more than one instance of this class, you'll\r
+    end up with multiple tooltips being shown! This is a common problem when compiling\r
+    audio plug-ins with JUCE: depending on the way you instantiate TooltipWindow,\r
+    you may end up with a TooltipWindow for each plug-in instance. To avoid this use a\r
+    SharedResourcePointer to instantiate the TooltipWindow only once.\r
 \r
     The TooltipWindow object will then stay invisible, waiting until the mouse\r
     hovers for the specified length of time - it will then see if it's currently\r
index 6fce1baa790f77fa2cc160439f7eb31448a42666..706024efc56a56dbfb9404a0ff4116fa08bf597e 100644 (file)
@@ -101,7 +101,7 @@ struct CppTokeniserFunctions
                 break;\r
         }\r
 \r
-        for (int i = 0; k[i] != nullptr; ++i)\r
+        for (int i = 0; k[i] != 0; ++i)\r
             if (token.compare (CharPointer_ASCII (k[i])) == 0)\r
                 return true;\r
 \r
index 165a405f378ba25ff84a9f558e4c87d5c054fd0f..bfe6d0e6f3a9dcd611c67ca992a444d5cce7f6c5 100644 (file)
@@ -755,8 +755,8 @@ void CodeDocument::checkLastLineStatus()
 }\r
 \r
 //==============================================================================\r
-void CodeDocument::addListener    (CodeDocument::Listener* l)   { listeners.add (l); }\r
-void CodeDocument::removeListener (CodeDocument::Listener* l)   { listeners.remove (l); }\r
+void CodeDocument::addListener    (CodeDocument::Listener* l) noexcept   { listeners.add (l); }\r
+void CodeDocument::removeListener (CodeDocument::Listener* l) noexcept   { listeners.remove (l); }\r
 \r
 //==============================================================================\r
 struct CodeDocument::InsertAction   : public UndoableAction\r
index 43eeccdf8ae13fcddff7910a393a4450aeee9d0c..99ad87a770dcae78dd3172d0861adb171cc15d4c 100644 (file)
@@ -340,12 +340,12 @@ public:
         If the listener is already registered, this method has no effect.\r
         @see removeListener\r
     */\r
-    void addListener (Listener* listener);\r
+    void addListener (Listener* listener) noexcept;\r
 \r
     /** Deregisters a listener.\r
         @see addListener\r
     */\r
-    void removeListener (Listener* listener);\r
+    void removeListener (Listener* listener) noexcept;\r
 \r
     //==============================================================================\r
     /** Iterates the text in a CodeDocument.\r
index c1db3976a6664394b63aa1dec971f7ece6806bff..c171a6bc5fdd51cf19d6bbbe8bfdef40734f5f1a 100644 (file)
@@ -382,9 +382,13 @@ private:
     ApplicationCommandManager* appCommandManager = nullptr;\r
 \r
     class Pimpl;\r
+    friend class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     class GutterComponent;\r
+    friend class GutterComponent;\r
+    friend struct ContainerDeletePolicy<GutterComponent>;\r
     std::unique_ptr<GutterComponent> gutter;\r
 \r
     enum DragType\r
index b8e7d0b284b006ac865141f7b99e819be37d84b5..91c0b556080f04f613e71e703f81622bdcad9f9b 100644 (file)
@@ -68,7 +68,7 @@ struct LuaTokeniserFunctions
                 break;\r
         }\r
 \r
-        for (int i = 0; k[i] != nullptr; ++i)\r
+        for (int i = 0; k[i] != 0; ++i)\r
             if (token.compare (CharPointer_ASCII (k[i])) == 0)\r
                 return true;\r
 \r
index 89d53723f2b5c5ab037676e72c4b8d0ff859a930..0bf9ef51a7e9c969b167fbc2d31b48312dc3355c 100644 (file)
@@ -118,6 +118,7 @@ public:
 \r
 private:\r
     class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> control;\r
     bool mouseEventsAllowed = true;\r
 \r
index 89e0623b32429800f49f5d4a3f6c90b76b3f0917..ec70611c57783717d939a02ad5b1c6bc6c20c807 100644 (file)
@@ -57,14 +57,14 @@ public:
         The view will be retained and released by this component for as long as\r
         it is needed. To remove the current view, just call setView (nullptr).\r
 \r
-        Note: A void* is used here to avoid including the cocoa headers as\r
+        Note: a void* is used here to avoid including the cocoa headers as\r
         part of the juce.h, but the method expects an NSView*.\r
     */\r
     void setView (void* nsView);\r
 \r
     /** Returns the current NSView.\r
 \r
-        Note: A void* is returned here to avoid the needing to include the cocoa\r
+        Note: a void* is returned here to avoid the needing to include the cocoa\r
         headers, so you should just cast the return value to an NSView*.\r
     */\r
     void* getView() const;\r
diff --git a/modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h b/modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h
deleted file mode 100644 (file)
index a769fba..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2017 - ROLI Ltd.\r
-\r
-   JUCE is an open source library subject to commercial or open-source\r
-   licensing.\r
-\r
-   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
-   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
-   27th April 2017).\r
-\r
-   End User License Agreement: www.juce.com/juce-5-licence\r
-   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
-   Or: You may also use this code under the terms of the GPL v3 (see\r
-   www.gnu.org/licenses).\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if (JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE) || DOXYGEN\r
-\r
-//==============================================================================\r
-/**\r
-    A Windows-specific class that temporarily sets the DPI awareness context of\r
-    the current thread to be DPI unaware and resets it to the previous context\r
-    when it goes out of scope.\r
-\r
-    If you create one of these before creating a top-level window, the window\r
-    will be DPI unaware and bitmap strectched by the OS on a display with >100%\r
-    scaling.\r
-\r
-    You shouldn't use this unless you really know what you are doing and\r
-    are dealing with native HWNDs.\r
-*/\r
-class JUCE_API  ScopedDPIAwarenessDisabler\r
-{\r
-public:\r
-    ScopedDPIAwarenessDisabler();\r
-    ~ScopedDPIAwarenessDisabler();\r
-\r
-private:\r
-    void* previousContext = nullptr;\r
-};\r
-#endif\r
-\r
-} // namespace juce\r
index ed04812f849367ea554558243e710010bf823d94..cb34180fc98812cf6cd5d1c34531a7b71dd0723b 100644 (file)
@@ -57,14 +57,14 @@ public:
         The view will be retained and released by this component for as long as\r
         it is needed. To remove the current view, just call setView (nullptr).\r
 \r
-        Note: A void* is used here to avoid including the cocoa headers as\r
+        Note: a void* is used here to avoid including the cocoa headers as\r
         part of the juce.h, but the method expects an UIView*.\r
     */\r
     void setView (void* uiView);\r
 \r
     /** Returns the current UIView.\r
 \r
-        Note: A void* is returned here to avoid the needing to include the cocoa\r
+        Note: a void* is returned here to avoid the needing to include the cocoa\r
         headers, so you should just cast the return value to an UIView*.\r
     */\r
     void* getView() const;\r
@@ -80,6 +80,7 @@ public:
 \r
 private:\r
     class Pimpl;\r
+    friend class Pimpl;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIViewComponent)\r
index 97aebcdb4f485b1e0ba0e1627c580c5fd31d98e9..cc2f6c4fa6d57e595391e71e71a4206f1be328c5 100644 (file)
@@ -107,6 +107,7 @@ private:
     friend unsigned long juce_getCurrentFocusWindow (ComponentPeer*);\r
 \r
     class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 };\r
 \r
index e107705425d5aa7e50be77eef330c3e079c02a60..49b2d6b4222b4a1e1ab4937a5bef4b484c8cdcd5 100644 (file)
   #include <unistd.h>\r
   #include <fcntl.h>\r
   #include <sys/wait.h>\r
-\r
-  #if JUCE_GCC && __GNUC__ > 7\r
-   #pragma GCC diagnostic push\r
-   #pragma GCC diagnostic ignored "-Wparentheses"\r
-  #endif\r
-\r
   #include <gtk/gtk.h>\r
-\r
-  #if JUCE_GCC && __GNUC__ > 7\r
-   #pragma GCC diagnostic pop\r
-  #endif\r
-\r
   #include <gtk/gtkx.h>\r
   #include <glib-unix.h>\r
   #include <webkit2/webkit2.h>\r
index 47b12c4ddf05ce7255eed42f50ca6947e5d879a1..c637f4c7a5ba966893e15a102df19b69d6d39976 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_gui_extra\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE extended GUI classes\r
   description:      Miscellaneous GUI classes for specialised tasks.\r
   website:          http://www.juce.com/juce\r
 #endif\r
 \r
 /** Config: JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
-    This lets you turn on the JUCE_ENABLE_LIVE_CONSTANT_EDITOR support (desktop only). By default\r
-    this will be enabled for debug builds and disabled for release builds. See the documentation\r
+    This lets you turn on the JUCE_ENABLE_LIVE_CONSTANT_EDITOR support. See the documentation\r
     for that macro for more details.\r
 */\r
 #ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
- #if JUCE_DEBUG && ! (JUCE_IOS || JUCE_ANDROID)\r
+ #if JUCE_DEBUG\r
   #define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 1\r
  #endif\r
 #endif\r
@@ -88,7 +87,6 @@
 #include "embedding/juce_NSViewComponent.h"\r
 #include "embedding/juce_UIViewComponent.h"\r
 #include "embedding/juce_XEmbedComponent.h"\r
-#include "embedding/juce_ScopedDPIAwarenessDisabler.h"\r
 #include "misc/juce_AppleRemote.h"\r
 #include "misc/juce_BubbleMessageComponent.h"\r
 #include "misc/juce_ColourSelector.h"\r
index 56e5d685d5938f77f439cd20eacada67e5981d76..0a1f728bb542dc3ff578191fb06e65d5a32e0507 100644 (file)
 namespace juce\r
 {\r
 \r
-struct ColourComponentSlider  : public Slider\r
+class ColourSelector::ColourComponentSlider  : public Slider\r
 {\r
-    ColourComponentSlider (const String& name)  : Slider (name)\r
+public:\r
+    ColourComponentSlider (const String& name)\r
+        : Slider (name)\r
     {\r
         setRange (0.0, 255.0, 1.0);\r
     }\r
 \r
-    String getTextFromValue (double value) override\r
+    String getTextFromValue (double value)\r
     {\r
         return String::toHexString ((int) value).toUpperCase().paddedLeft ('0', 2);\r
     }\r
 \r
-    double getValueFromText (const String& text) override\r
+    double getValueFromText (const String& text)\r
     {\r
         return (double) text.getHexValue32();\r
     }\r
+\r
+    JUCE_DECLARE_NON_COPYABLE (ColourComponentSlider)\r
+};\r
+\r
+//==============================================================================\r
+class ColourSelector::ColourSpaceMarker  : public Component\r
+{\r
+public:\r
+    ColourSpaceMarker()\r
+    {\r
+        setInterceptsMouseClicks (false, false);\r
+    }\r
+\r
+    void paint (Graphics& g) override\r
+    {\r
+        g.setColour (Colour::greyLevel (0.1f));\r
+        g.drawEllipse (1.0f, 1.0f, getWidth() - 2.0f, getHeight() - 2.0f, 1.0f);\r
+        g.setColour (Colour::greyLevel (0.9f));\r
+        g.drawEllipse (2.0f, 2.0f, getWidth() - 4.0f, getHeight() - 4.0f, 1.0f);\r
+    }\r
+\r
+    JUCE_DECLARE_NON_COPYABLE (ColourSpaceMarker)\r
 };\r
 \r
 //==============================================================================\r
@@ -50,7 +74,7 @@ class ColourSelector::ColourSpaceView  : public Component
 {\r
 public:\r
     ColourSpaceView (ColourSelector& cs, float& hue, float& sat, float& val, int edgeSize)\r
-        : owner (cs), h (hue), s (sat), v (val), edge (edgeSize)\r
+        : owner (cs), h (hue), s (sat), v (val), lastHue (0.0f), edge (edgeSize)\r
     {\r
         addAndMakeVisible (marker);\r
         setMouseCursor (MouseCursor::CrosshairCursor);\r
@@ -104,7 +128,7 @@ public:
         if (lastHue != h)\r
         {\r
             lastHue = h;\r
-            colours = {};\r
+            colours = Image();\r
             repaint();\r
         }\r
 \r
@@ -113,7 +137,7 @@ public:
 \r
     void resized() override\r
     {\r
-        colours = {};\r
+        colours = Image();\r
         updateMarker();\r
     }\r
 \r
@@ -122,38 +146,53 @@ private:
     float& h;\r
     float& s;\r
     float& v;\r
-    float lastHue = 0;\r
+    float lastHue;\r
+    ColourSpaceMarker marker;\r
     const int edge;\r
     Image colours;\r
 \r
-    struct ColourSpaceMarker  : public Component\r
+    void updateMarker()\r
     {\r
-        ColourSpaceMarker()\r
-        {\r
-            setInterceptsMouseClicks (false, false);\r
-        }\r
+        marker.setBounds (roundToInt ((getWidth() - edge * 2) * s),\r
+                          roundToInt ((getHeight() - edge * 2) * (1.0f - v)),\r
+                          edge * 2, edge * 2);\r
+    }\r
 \r
-        void paint (Graphics& g) override\r
-        {\r
-            g.setColour (Colour::greyLevel (0.1f));\r
-            g.drawEllipse (1.0f, 1.0f, getWidth() - 2.0f, getHeight() - 2.0f, 1.0f);\r
-            g.setColour (Colour::greyLevel (0.9f));\r
-            g.drawEllipse (2.0f, 2.0f, getWidth() - 4.0f, getHeight() - 4.0f, 1.0f);\r
-        }\r
-    };\r
+    JUCE_DECLARE_NON_COPYABLE (ColourSpaceView)\r
+};\r
 \r
-    ColourSpaceMarker marker;\r
+//==============================================================================\r
+class ColourSelector::HueSelectorMarker  : public Component\r
+{\r
+public:\r
+    HueSelectorMarker()\r
+    {\r
+        setInterceptsMouseClicks (false, false);\r
+    }\r
 \r
-    void updateMarker()\r
+    void paint (Graphics& g) override\r
     {\r
-        auto markerSize = jmax (14, edge * 2);\r
-        auto area = getLocalBounds().reduced (edge);\r
+        auto cw = (float) getWidth();\r
+        auto ch = (float) getHeight();\r
+\r
+        Path p;\r
+        p.addTriangle (1.0f, 1.0f,\r
+                       cw * 0.3f, ch * 0.5f,\r
+                       1.0f, ch - 1.0f);\r
+\r
+        p.addTriangle (cw - 1.0f, 1.0f,\r
+                       cw * 0.7f, ch * 0.5f,\r
+                       cw - 1.0f, ch - 1.0f);\r
 \r
-        marker.setBounds (Rectangle<int> (markerSize, markerSize)\r
-                            .withCentre (area.getRelativePoint (s, 1.0f - v)));\r
+        g.setColour (Colours::white.withAlpha (0.75f));\r
+        g.fillPath (p);\r
+\r
+        g.setColour (Colours::black.withAlpha (0.75f));\r
+        g.strokePath (p, PathStrokeType (1.2f));\r
     }\r
 \r
-    JUCE_DECLARE_NON_COPYABLE (ColourSpaceView)\r
+private:\r
+    JUCE_DECLARE_NON_COPYABLE (HueSelectorMarker)\r
 };\r
 \r
 //==============================================================================\r
@@ -182,11 +221,7 @@ public:
 \r
     void resized() override\r
     {\r
-        auto markerSize = jmax (14, edge * 2);\r
-        auto area = getLocalBounds().reduced (edge);\r
-\r
-        marker.setBounds (Rectangle<int> (getWidth(), markerSize)\r
-                            .withCentre (area.getRelativePoint (0.5f, h)));\r
+        marker.setBounds (0, roundToInt ((getHeight() - edge * 2) * h), getWidth(), edge * 2);\r
     }\r
 \r
     void mouseDown (const MouseEvent& e) override\r
@@ -207,38 +242,8 @@ public:
 private:\r
     ColourSelector& owner;\r
     float& h;\r
-    const int edge;\r
-\r
-    struct HueSelectorMarker  : public Component\r
-    {\r
-        HueSelectorMarker()\r
-        {\r
-            setInterceptsMouseClicks (false, false);\r
-        }\r
-\r
-        void paint (Graphics& g) override\r
-        {\r
-            auto cw = (float) getWidth();\r
-            auto ch = (float) getHeight();\r
-\r
-            Path p;\r
-            p.addTriangle (1.0f, 1.0f,\r
-                           cw * 0.3f, ch * 0.5f,\r
-                           1.0f, ch - 1.0f);\r
-\r
-            p.addTriangle (cw - 1.0f, 1.0f,\r
-                           cw * 0.7f, ch * 0.5f,\r
-                           cw - 1.0f, ch - 1.0f);\r
-\r
-            g.setColour (Colours::white.withAlpha (0.75f));\r
-            g.fillPath (p);\r
-\r
-            g.setColour (Colours::black.withAlpha (0.75f));\r
-            g.strokePath (p, PathStrokeType (1.2f));\r
-        }\r
-    };\r
-\r
     HueSelectorMarker marker;\r
+    const int edge;\r
 \r
     JUCE_DECLARE_NON_COPYABLE (HueSelectorComp)\r
 };\r
@@ -280,8 +285,10 @@ private:
     {\r
         if (comp != nullptr)\r
         {\r
-            if (result == 1)  comp->setColourFromSwatch();\r
-            if (result == 2)  comp->setSwatchFromColour();\r
+            if (result == 1)\r
+                comp->setColourFromSwatch();\r
+            else if (result == 2)\r
+                comp->setSwatchFromColour();\r
         }\r
     }\r
 \r
@@ -327,16 +334,14 @@ ColourSelector::ColourSelector (int sectionsToShow, int edge, int gapAroundColou
 \r
         sliders[3]->setVisible ((flags & showAlphaChannel) != 0);\r
 \r
-        for (auto& slider : sliders)\r
-        { // braces needed here to avoid a VS2013 compiler bug\r
-            slider->onValueChange = [this] { changeColour(); };\r
-        }\r
+        for (int i = 4; --i >= 0;)\r
+            sliders[i]->onValueChange = [this] { changeColour(); };\r
     }\r
 \r
     if ((flags & showColourspace) != 0)\r
     {\r
         colourSpace.reset (new ColourSpaceView (*this, h, s, v, gapAroundColourSpaceComponent));\r
-        hueSelector.reset (new HueSelectorComp (*this, h, gapAroundColourSpaceComponent));\r
+        hueSelector.reset (new HueSelectorComp (*this, h,  gapAroundColourSpaceComponent));\r
 \r
         addAndMakeVisible (colourSpace.get());\r
         addAndMakeVisible (hueSelector.get());\r
@@ -450,12 +455,12 @@ void ColourSelector::paint (Graphics& g)
         g.setColour (findColour (labelTextColourId));\r
         g.setFont (11.0f);\r
 \r
-        for (auto& slider : sliders)\r
+        for (int i = 4; --i >= 0;)\r
         {\r
-            if (slider->isVisible())\r
-                g.drawText (slider->getName() + ":",\r
-                            0, slider->getY(),\r
-                            slider->getX() - 8, slider->getHeight(),\r
+            if (sliders[i]->isVisible())\r
+                g.drawText (sliders[i]->getName() + ":",\r
+                            0, sliders[i]->getY(),\r
+                            sliders[i]->getX() - 8, sliders[i]->getHeight(),\r
                             Justification::centredRight, false);\r
         }\r
     }\r
index 8fbe4d4d7463ed72840eab3a938e4f8a90f560af..24b8a6a1ebe1342842c5cd2960fb689f8acfb454 100644 (file)
@@ -133,14 +133,19 @@ public:
         labelTextColourId               = 0x1007001     /**< the colour used for the labels next to the sliders. */\r
     };\r
 \r
-    //==============================================================================\r
-    // These need to be public otherwise the Projucer's live-build engine will complain\r
-    class ColourSpaceView;\r
-    class HueSelectorComp;\r
 \r
 private:\r
     //==============================================================================\r
+    class ColourSpaceView;\r
+    class HueSelectorComp;\r
     class SwatchComponent;\r
+    class ColourComponentSlider;\r
+    class ColourSpaceMarker;\r
+    class HueSelectorMarker;\r
+    friend class ColourSpaceView;\r
+    friend struct ContainerDeletePolicy<ColourSpaceView>;\r
+    friend class HueSelectorComp;\r
+    friend struct ContainerDeletePolicy<HueSelectorComp>;\r
 \r
     Colour colour;\r
     float h, s, v;\r
index 7ea4d94f17ab196c25e9708fb5f58f5731dba49f..2bae03212d80c29e1608d9aa375211e849396aab 100644 (file)
@@ -125,6 +125,9 @@ private:
     class MappingItem;\r
     class CategoryItem;\r
     class ItemComponent;\r
+    friend class TopLevelItem;\r
+    friend struct ContainerDeletePolicy<ChangeKeyButton>;\r
+    friend struct ContainerDeletePolicy<TopLevelItem>;\r
     std::unique_ptr<TopLevelItem> treeItem;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KeyMappingEditorComponent)\r
index 5a4ec36745d29159f24cd4b7e0b632c23a83f653..0be9335678784ce6405af657fc9e364d8976560f 100644 (file)
@@ -280,7 +280,7 @@ public:
 \r
     void resized() override\r
     {\r
-        auto r = getLocalBounds().reduced (2, 0);\r
+        Rectangle<int> r (getLocalBounds().reduced (2, 0));\r
 \r
         for (int i = 0; i < editors.size(); ++i)\r
             editors.getUnchecked(i)->setBounds (r.removeFromTop (itemHeight));\r
index 7a2ccd2f18663ed5ce88d92381d767725bba0765..a0a483946b1d95d5930e967ab10963178e2ed2c5 100644 (file)
@@ -204,13 +204,17 @@ namespace LiveConstantEditor
         LiveValue<Type>& getValue (const char* file, int line, const Type& initialValue)\r
         {\r
             const ScopedLock sl (lock);\r
-            using ValueType = LiveValue<Type>;\r
+            typedef LiveValue<Type> ValueType;\r
+\r
+            for (int i = 0; i < values.size(); ++i)\r
+            {\r
+                LiveValueBase* v = values.getUnchecked(i);\r
 \r
-            for (auto* v : values)\r
                 if (v->sourceLine == line && v->sourceFile == file)\r
                     return *static_cast<ValueType*> (v);\r
+            }\r
 \r
-            auto v = new ValueType (file, line, initialValue);\r
+            ValueType* v = new ValueType (file, line, initialValue);\r
             addValue (v);\r
             return *v;\r
         }\r
@@ -220,6 +224,8 @@ namespace LiveConstantEditor
         OwnedArray<CodeDocument> documents;\r
         Array<File> documentFiles;\r
         class EditorWindow;\r
+        friend class EditorWindow;\r
+        friend struct ContainerDeletePolicy<EditorWindow>;\r
         Component::SafePointer<EditorWindow> editorWindow;\r
         CriticalSection lock;\r
 \r
index 2115bd7a1800d45a5fd2a19f59f84705462da049..e6f781504a83e41351e0c7213191053c1abf7340 100644 (file)
@@ -142,7 +142,7 @@ public:
                                   file, then the URL should be "sounds/my_sound.caf".\r
 \r
                                   For a custom sound on Android, set URL to the name of a raw resource file\r
-                                  (without an extension) that was included when exporting an Android project in\r
+                                  (without an extention) that was included when exporting an Android project in\r
                                   Projucer (see "Extra Android Raw Resources" setting). */\r
 \r
         var properties;      /**< Optional: collection of additional properties that may be passed as a dictionary. */\r
@@ -396,7 +396,7 @@ public:
         */\r
         struct Category\r
         {\r
-            juce::String identifier;         /**< unique identifier */\r
+            juce::String identifier;         /**< unique indentifier */\r
             juce::Array<Action> actions;     /**< optional list of actions within this category */\r
             bool sendDismissAction = false;  /**< whether dismiss action will be sent to the app (from iOS 10 only) */\r
         };\r
@@ -615,7 +615,7 @@ public:
             notification was received when the app was in the foreground already. On iOS 10 it will be\r
             called when a user presses on a notification\r
 \r
-            Note: On Android, if remote notification was received while the app was in the background and\r
+            Note: on Android, if remote notification was received while the app was in the background and\r
             then user pressed on it, the notification object received in this callback will contain only\r
             "properties" member set. Hence, if you want to know what was the notification title, content\r
             etc, you need to set them as additional properties, so that you will be able to restore them\r
index 9fd53d9c72da9cee4dacea9c0d168d6b1b2c0f24..54a748e2532daeaa1909a3143fcc5757bf266774 100644 (file)
@@ -158,14 +158,14 @@ void RecentlyOpenedFilesList::forgetRecentFileNatively (const File& file)
         // from the recent list, so we clear them all and add them back excluding\r
         // the specified file\r
 \r
-        auto sharedDocController = [NSDocumentController sharedDocumentController];\r
-        auto recentDocumentURLs  = [sharedDocController recentDocumentURLs];\r
+        auto* sharedDocController = [NSDocumentController sharedDocumentController];\r
+        auto* recentDocumentURLs =  [sharedDocController recentDocumentURLs];\r
 \r
         [sharedDocController clearRecentDocuments: nil];\r
 \r
         auto* nsFile = createNSURLFromFile (file);\r
 \r
-        auto reverseEnumerator = [recentDocumentURLs reverseObjectEnumerator];\r
+        auto* reverseEnumerator = [recentDocumentURLs reverseObjectEnumerator];\r
 \r
         for (NSURL* url : reverseEnumerator)\r
             if (! [url isEqual:nsFile])\r
index 7024b8a35ff130518dd4ded1751b44ff7196f5c0..42cfc352b762047a401ae4d5509e808c2c5db107 100644 (file)
@@ -122,7 +122,7 @@ private:
             if (embedAsSiblingRatherThanChild)\r
             {\r
                 // This is a workaround for a bug in a web browser component where\r
-                // scrolling would be very slow and occasionally would scroll in\r
+                // scrolling would be very slow and occassionally would scroll in\r
                 // opposite direction to dragging direction. In normal circumstances,\r
                 // the native view should be a child of peerView instead.\r
                 auto parentView = LocalRef<jobject> (env->CallObjectMethod (peerView, AndroidView.getParent));\r
index bf132b647f0195862ad2e3cdec7e1a25fb7e0e08..b6d6217db02892b2fa1f27f0318dc1246baf8bbb 100644 (file)
 namespace juce\r
 {\r
 \r
+#if __ANDROID_API__ >= 21\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
+  METHOD (build,          "build",          "()Landroid/media/AudioAttributes;") \\r
+  METHOD (constructor,    "<init>",         "()V") \\r
+  METHOD (setContentType, "setContentType", "(I)Landroid/media/AudioAttributes$Builder;") \\r
+  METHOD (setUsage,       "setUsage",       "(I)Landroid/media/AudioAttributes$Builder;")\r
+\r
+DECLARE_JNI_CLASS (AudioAttributesBuilder, "android/media/AudioAttributes$Builder")\r
+#undef JNI_CLASS_MEMBERS\r
+#endif\r
+\r
 #if __ANDROID_API__ >= 26\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor,             "<init>",                  "(Ljava/lang/String;Ljava/lang/CharSequence;I)V") \\r
@@ -42,13 +53,13 @@ namespace juce
   METHOD (setSound,                "setSound",                "(Landroid/net/Uri;Landroid/media/AudioAttributes;)V") \\r
   METHOD (setVibrationPattern,     "setVibrationPattern",     "([J)V")\r
 \r
-DECLARE_JNI_CLASS (NotificationChannel, "android/app/NotificationChannel")\r
+DECLARE_JNI_CLASS (NotificationChannel, "android/app/NotificationChannel");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor, "<init>", "(Ljava/lang/String;Ljava/lang/CharSequence;)V")\r
 \r
-DECLARE_JNI_CLASS (NotificationChannelGroup, "android/app/NotificationChannelGroup")\r
+DECLARE_JNI_CLASS (NotificationChannelGroup, "android/app/NotificationChannelGroup");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -56,7 +67,7 @@ DECLARE_JNI_CLASS (NotificationChannelGroup, "android/app/NotificationChannelGro
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   FIELD (extras, "extras", "Landroid/os/Bundle;")\r
 \r
-DECLARE_JNI_CLASS (AndroidNotification, "android/app/Notification")\r
+DECLARE_JNI_CLASS (AndroidNotification, "android/app/Notification");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -67,7 +78,7 @@ DECLARE_JNI_CLASS (AndroidNotification, "android/app/Notification")
   METHOD (constructor,    "<init>",         "(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V") \\r
   METHOD (build,          "build",          "()Landroid/app/Notification$Action;")\r
 \r
-DECLARE_JNI_CLASS (NotificationActionBuilder, "android/app/Notification$Action$Builder")\r
+DECLARE_JNI_CLASS (NotificationActionBuilder, "android/app/Notification$Action$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -92,7 +103,7 @@ DECLARE_JNI_CLASS (NotificationActionBuilder, "android/app/Notification$Action$B
   METHOD (setVibrate,       "setVibrate",       "([J)Landroid/app/Notification$Builder;") \\r
   METHOD (setWhen,          "setWhen",          "(J)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderBase, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderBase, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #if __ANDROID_API__ >= 16\r
@@ -103,7 +114,7 @@ DECLARE_JNI_CLASS (NotificationBuilderBase, "android/app/Notification$Builder")
    METHOD (setSubText,         "setSubText",         "(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;") \\r
    METHOD (setUsesChronometer, "setUsesChronometer", "(Z)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderApi16, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi16, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -111,7 +122,7 @@ DECLARE_JNI_CLASS (NotificationBuilderApi16, "android/app/Notification$Builder")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
     METHOD (setShowWhen, "setShowWhen", "(Z)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderApi17, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi17, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -124,7 +135,7 @@ DECLARE_JNI_CLASS (NotificationBuilderApi17, "android/app/Notification$Builder")
   METHOD (setGroupSummary, "setGroupSummary", "(Z)Landroid/app/Notification$Builder;") \\r
   METHOD (setSortKey,      "setSortKey",      "(Ljava/lang/String;)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderApi20, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi20, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -136,7 +147,7 @@ DECLARE_JNI_CLASS (NotificationBuilderApi20, "android/app/Notification$Builder")
   METHOD (setPublicVersion, "setPublicVersion", "(Landroid/app/Notification;)Landroid/app/Notification$Builder;") \\r
   METHOD (setVisibility,    "setVisibility",    "(I)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderApi21, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi21, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -144,7 +155,7 @@ DECLARE_JNI_CLASS (NotificationBuilderApi21, "android/app/Notification$Builder")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (setChronometerCountDown, "setChronometerCountDown", "(Z)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderApi24, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi24, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -154,7 +165,7 @@ DECLARE_JNI_CLASS (NotificationBuilderApi24, "android/app/Notification$Builder")
   METHOD (setGroupAlertBehavior, "setGroupAlertBehavior", "(I)Landroid/app/Notification$Builder;") \\r
   METHOD (setTimeoutAfter,       "setTimeoutAfter",       "(J)Landroid/app/Notification$Builder;")\r
 \r
-DECLARE_JNI_CLASS (NotificationBuilderApi26, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi26, "android/app/Notification$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -163,14 +174,14 @@ DECLARE_JNI_CLASS (NotificationBuilderApi26, "android/app/Notification$Builder")
   METHOD (cancelAll, "cancelAll", "()V") \\r
   METHOD (notify,    "notify",    "(Ljava/lang/String;ILandroid/app/Notification;)V")\r
 \r
-DECLARE_JNI_CLASS (NotificationManagerBase, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerBase, "android/app/NotificationManager");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #if __ANDROID_API__ >= 23\r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (getActiveNotifications, "getActiveNotifications", "()[Landroid/service/notification/StatusBarNotification;")\r
 \r
-DECLARE_JNI_CLASS (NotificationManagerApi23, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerApi23, "android/app/NotificationManager");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -178,7 +189,7 @@ DECLARE_JNI_CLASS (NotificationManagerApi23, "android/app/NotificationManager")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (areNotificationsEnabled, "areNotificationsEnabled", "()Z")\r
 \r
-DECLARE_JNI_CLASS (NotificationManagerApi24, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerApi24, "android/app/NotificationManager");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -187,7 +198,7 @@ DECLARE_JNI_CLASS (NotificationManagerApi24, "android/app/NotificationManager")
   METHOD (createNotificationChannel,      "createNotificationChannel",      "(Landroid/app/NotificationChannel;)V") \\r
   METHOD (createNotificationChannelGroup, "createNotificationChannelGroup", "(Landroid/app/NotificationChannelGroup;)V")\r
 \r
-DECLARE_JNI_CLASS (NotificationManagerApi26, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerApi26, "android/app/NotificationManager");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -195,7 +206,7 @@ DECLARE_JNI_CLASS (NotificationManagerApi26, "android/app/NotificationManager")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (getResultsFromIntent, "getResultsFromIntent", "(Landroid/content/Intent;)Landroid/os/Bundle;")\r
 \r
-DECLARE_JNI_CLASS (RemoteInput, "android/app/RemoteInput")\r
+DECLARE_JNI_CLASS (RemoteInput, "android/app/RemoteInput");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -205,7 +216,7 @@ DECLARE_JNI_CLASS (RemoteInput, "android/app/RemoteInput")
   METHOD (setChoices,            "setChoices",            "([Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;") \\r
   METHOD (setLabel,              "setLabel",              "(Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;")\r
 \r
-DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")\r
+DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -213,7 +224,7 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")
  #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
    METHOD (getNotification, "getNotification", "()Landroid/app/Notification;")\r
 \r
- DECLARE_JNI_CLASS (StatusBarNotification, "android/service/notification/StatusBarNotification")\r
+ DECLARE_JNI_CLASS (StatusBarNotification, "android/service/notification/StatusBarNotification");\r
  #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -223,7 +234,7 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")
    STATICMETHOD (getInstance, "getInstance", "()Lcom/google/firebase/iid/FirebaseInstanceId;") \\r
    METHOD (getToken, "getToken", "()Ljava/lang/String;")\r
 \r
- DECLARE_JNI_CLASS (FirebaseInstanceId, "com/google/firebase/iid/FirebaseInstanceId")\r
+ DECLARE_JNI_CLASS (FirebaseInstanceId, "com/google/firebase/iid/FirebaseInstanceId");\r
  #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -234,7 +245,7 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")
    METHOD (subscribeToTopic,     "subscribeToTopic",     "(Ljava/lang/String;)V") \\r
    METHOD (unsubscribeFromTopic, "unsubscribeFromTopic", "(Ljava/lang/String;)V") \\r
 \r
- DECLARE_JNI_CLASS (FirebaseMessaging, "com/google/firebase/messaging/FirebaseMessaging")\r
+ DECLARE_JNI_CLASS (FirebaseMessaging, "com/google/firebase/messaging/FirebaseMessaging");\r
  #undef JNI_CLASS_MEMBERS\r
 \r
  #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -248,7 +259,7 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")
    METHOD (getTo,           "getTo",           "()Ljava/lang/String;") \\r
    METHOD (getTtl,          "getTtl",          "()I")\r
 \r
- DECLARE_JNI_CLASS (RemoteMessage, "com/google/firebase/messaging/RemoteMessage")\r
+ DECLARE_JNI_CLASS (RemoteMessage, "com/google/firebase/messaging/RemoteMessage");\r
  #undef JNI_CLASS_MEMBERS\r
 \r
   #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -260,7 +271,7 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")
    METHOD (setMessageType, "setMessageType", "(Ljava/lang/String;)Lcom/google/firebase/messaging/RemoteMessage$Builder;") \\r
    METHOD (setTtl,         "setTtl",         "(I)Lcom/google/firebase/messaging/RemoteMessage$Builder;")\r
 \r
- DECLARE_JNI_CLASS (RemoteMessageBuilder, "com/google/firebase/messaging/RemoteMessage$Builder")\r
+ DECLARE_JNI_CLASS (RemoteMessageBuilder, "com/google/firebase/messaging/RemoteMessage$Builder");\r
  #undef JNI_CLASS_MEMBERS\r
 \r
  #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -277,7 +288,7 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")
    METHOD (getTitleLocalizationArgs, "getTitleLocalizationArgs", "()[Ljava/lang/String;") \\r
    METHOD (getTitleLocalizationKey,  "getTitleLocalizationKey",  "()Ljava/lang/String;")\r
 \r
- DECLARE_JNI_CLASS (RemoteMessageNotification, "com/google/firebase/messaging/RemoteMessage$Notification")\r
+ DECLARE_JNI_CLASS (RemoteMessageNotification, "com/google/firebase/messaging/RemoteMessage$Notification");\r
  #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -419,7 +430,7 @@ struct PushNotifications::Pimpl
 \r
             if (remoteInputResult.get() != 0)\r
             {\r
-                auto charSequence      = LocalRef<jobject> (env->CallObjectMethod (remoteInputResult, AndroidBundle.getCharSequence, resultKeyString.get()));\r
+                auto charSequence      = LocalRef<jobject> (env->CallObjectMethod (remoteInputResult, JavaBundle.getCharSequence, resultKeyString.get()));\r
                 auto responseStringRef = LocalRef<jstring> ((jstring) env->CallObjectMethod (charSequence, JavaCharSequence.toString));\r
                 responseString = juceString (responseStringRef.get());\r
             }\r
@@ -741,40 +752,40 @@ struct PushNotifications::Pimpl
     {\r
         auto* env = getEnv();\r
 \r
-        auto bundle = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
-\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("identifier")              .get(), javaString (n.identifier).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("title")                   .get(), javaString (n.title).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("body")                    .get(), javaString (n.body).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("subtitle")                .get(), javaString (n.subtitle).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("badgeNumber")             .get(), n.badgeNumber);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("soundToPlay")             .get(), javaString (n.soundToPlay.toString (true)).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBundle,   javaString ("properties")              .get(), varToBundleWithPropertiesString (n.properties).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("icon")                    .get(), javaString (n.icon).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("channelId")               .get(), javaString (n.channelId).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("tickerText")              .get(), javaString (n.tickerText).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("progressMax")             .get(), n.progress.max);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("progressCurrent")         .get(), n.progress.current);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBoolean,  javaString ("progressIndeterminate")   .get(), n.progress.indeterminate);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("person")                  .get(), javaString (n.person).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("type")                    .get(), n.type);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("priority")                .get(), n.priority);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("lockScreenAppearance")    .get(), n.lockScreenAppearance);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("groupId")                 .get(), javaString (n.groupId).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString,   javaString ("groupSortKey")            .get(), javaString (n.groupSortKey).get());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBoolean,  javaString ("groupSummary")            .get(), n.groupSummary);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("accentColour")            .get(), n.accentColour.getARGB());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("ledColour")               .get(), n.ledColour.getARGB());\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("ledBlinkPatternMsToBeOn") .get(), n.ledBlinkPattern.msToBeOn);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("ledBlinkPatternMsToBeOff").get(), n.ledBlinkPattern.msToBeOff);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBoolean,  javaString ("shouldAutoCancel")        .get(), n.shouldAutoCancel);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBoolean,  javaString ("localOnly")               .get(), n.localOnly);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBoolean,  javaString ("ongoing")                 .get(), n.ongoing);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putBoolean,  javaString ("alertOnlyOnce")           .get(), n.alertOnlyOnce);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("timestampVisibility")     .get(), n.timestampVisibility);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("badgeIconType")           .get(), n.badgeIconType);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putInt,      javaString ("groupAlertBehaviour")     .get(), n.groupAlertBehaviour);\r
-        env->CallVoidMethod (bundle, AndroidBundle.putLong,     javaString ("timeoutAfterMs")          .get(), (jlong)n.timeoutAfterMs);\r
+        auto bundle = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
+\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("identifier")              .get(), javaString (n.identifier).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("title")                   .get(), javaString (n.title).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("body")                    .get(), javaString (n.body).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("subtitle")                .get(), javaString (n.subtitle).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("badgeNumber")             .get(), n.badgeNumber);\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("soundToPlay")             .get(), javaString (n.soundToPlay.toString (true)).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putBundle,   javaString ("properties")              .get(), varToBundleWithPropertiesString (n.properties).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("icon")                    .get(), javaString (n.icon).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("channelId")               .get(), javaString (n.channelId).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("tickerText")              .get(), javaString (n.tickerText).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("progressMax")             .get(), n.progress.max);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("progressCurrent")         .get(), n.progress.current);\r
+        env->CallVoidMethod (bundle, JavaBundle.putBoolean,  javaString ("progressIndeterminate")   .get(), n.progress.indeterminate);\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("person")                  .get(), javaString (n.person).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("type")                    .get(), n.type);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("priority")                .get(), n.priority);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("lockScreenAppearance")    .get(), n.lockScreenAppearance);\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("groupId")                 .get(), javaString (n.groupId).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putString,   javaString ("groupSortKey")            .get(), javaString (n.groupSortKey).get());\r
+        env->CallVoidMethod (bundle, JavaBundle.putBoolean,  javaString ("groupSummary")            .get(), n.groupSummary);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("accentColour")            .get(), n.accentColour.getARGB());\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("ledColour")               .get(), n.ledColour.getARGB());\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("ledBlinkPatternMsToBeOn") .get(), n.ledBlinkPattern.msToBeOn);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("ledBlinkPatternMsToBeOff").get(), n.ledBlinkPattern.msToBeOff);\r
+        env->CallVoidMethod (bundle, JavaBundle.putBoolean,  javaString ("shouldAutoCancel")        .get(), n.shouldAutoCancel);\r
+        env->CallVoidMethod (bundle, JavaBundle.putBoolean,  javaString ("localOnly")               .get(), n.localOnly);\r
+        env->CallVoidMethod (bundle, JavaBundle.putBoolean,  javaString ("ongoing")                 .get(), n.ongoing);\r
+        env->CallVoidMethod (bundle, JavaBundle.putBoolean,  javaString ("alertOnlyOnce")           .get(), n.alertOnlyOnce);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("timestampVisibility")     .get(), n.timestampVisibility);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("badgeIconType")           .get(), n.badgeIconType);\r
+        env->CallVoidMethod (bundle, JavaBundle.putInt,      javaString ("groupAlertBehaviour")     .get(), n.groupAlertBehaviour);\r
+        env->CallVoidMethod (bundle, JavaBundle.putLong,     javaString ("timeoutAfterMs")          .get(), (jlong)n.timeoutAfterMs);\r
 \r
         const int size = n.vibrationPattern.size();\r
 \r
@@ -788,7 +799,7 @@ struct PushNotifications::Pimpl
                 elements[i] = (jlong) n.vibrationPattern[i];\r
 \r
             env->SetLongArrayRegion (array, 0, size, elements);\r
-            env->CallVoidMethod (bundle, AndroidBundle.putLongArray, javaString ("vibrationPattern").get(), array.get());\r
+            env->CallVoidMethod (bundle, JavaBundle.putLongArray, javaString ("vibrationPattern").get(), array.get());\r
         }\r
 \r
         return bundle;\r
@@ -881,9 +892,9 @@ struct PushNotifications::Pimpl
 \r
         env->CallObjectMethod (notificationBuilder, NotificationBuilderApi20.setLocalOnly, n.localOnly);\r
 \r
-        auto extras = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
+        auto extras = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
 \r
-        env->CallVoidMethod (extras, AndroidBundle.putBundle, javaString ("notificationData").get(),\r
+        env->CallVoidMethod (extras, JavaBundle.putBundle, javaString ("notificationData").get(),\r
                              juceNotificationToBundle (n).get());\r
 \r
         env->CallObjectMethod (notificationBuilder, NotificationBuilderApi20.addExtras, extras.get());\r
@@ -1110,8 +1121,8 @@ struct PushNotifications::Pimpl
     {\r
         auto* env = getEnv();\r
 \r
-        auto bundle = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
-        env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("properties").get(),\r
+        auto bundle = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
+        env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("properties").get(),\r
                              javaString (JSON::toString (varToParse, false)).get());\r
 \r
         return bundle;\r
@@ -1122,13 +1133,13 @@ struct PushNotifications::Pimpl
     {\r
         auto* env = getEnv();\r
 \r
-        auto varString = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, AndroidBundle.getString,\r
+        auto varString = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, JavaBundle.getString,\r
                                                                             javaString ("properties").get()));\r
 \r
         var resultVar;\r
         JSON::parse (juceString (varString.get()), resultVar);\r
 \r
-        // Note: We are not checking if result of parsing was okay, because there may be no properties set at all.\r
+        // Note: we are not checking if result of parsing was okay, because there may be no properties set at all.\r
         return resultVar;\r
     }\r
 \r
@@ -1192,9 +1203,9 @@ struct PushNotifications::Pimpl
     {\r
         auto keyString = javaString (key);\r
 \r
-        if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
+        if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
         {\r
-            auto value = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, AndroidBundle.getString, keyString.get()));\r
+            auto value = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, JavaBundle.getString, keyString.get()));\r
             return juceString (value);\r
         }\r
 \r
@@ -1205,8 +1216,8 @@ struct PushNotifications::Pimpl
     {\r
         auto keyString = javaString (key);\r
 \r
-        if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
-            return env->CallIntMethod (bundle, AndroidBundle.getInt, keyString.get());\r
+        if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
+            return env->CallIntMethod (bundle, JavaBundle.getInt, keyString.get());\r
 \r
         return 0;\r
     }\r
@@ -1216,8 +1227,8 @@ struct PushNotifications::Pimpl
     {\r
         auto keyString = javaString (key);\r
 \r
-        if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
-            return (int) env->CallLongMethod (bundle, AndroidBundle.getLong, keyString.get());\r
+        if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
+            return (int) env->CallLongMethod (bundle, JavaBundle.getLong, keyString.get());\r
 \r
         return 0;\r
     }\r
@@ -1226,9 +1237,9 @@ struct PushNotifications::Pimpl
     {\r
         auto keyString = javaString (key);\r
 \r
-        if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
+        if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
         {\r
-            auto value = LocalRef<jobject> (env->CallObjectMethod (bundle, AndroidBundle.getBundle, keyString.get()));\r
+            auto value = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.getBundle, keyString.get()));\r
             return bundleWithPropertiesStringToVar (value);\r
         }\r
 \r
@@ -1239,8 +1250,8 @@ struct PushNotifications::Pimpl
     {\r
         auto keyString = javaString (key);\r
 \r
-        if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
-            return env->CallBooleanMethod (bundle, AndroidBundle.getBoolean, keyString.get());\r
+        if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
+            return env->CallBooleanMethod (bundle, JavaBundle.getBoolean, keyString.get());\r
 \r
         return false;\r
     }\r
@@ -1249,9 +1260,9 @@ struct PushNotifications::Pimpl
     {\r
         auto keyString = javaString (key);\r
 \r
-        if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
+        if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
         {\r
-            auto array = LocalRef<jlongArray> ((jlongArray) env->CallObjectMethod (bundle, AndroidBundle.getLongArray, keyString.get()));\r
+            auto array = LocalRef<jlongArray> ((jlongArray) env->CallObjectMethod (bundle, JavaBundle.getLongArray, keyString.get()));\r
 \r
             const int size = env->GetArrayLength (array.get());\r
 \r
@@ -1274,7 +1285,7 @@ struct PushNotifications::Pimpl
         auto* env = getEnv();\r
 \r
         auto extras = LocalRef<jobject> (env->GetObjectField (notification, AndroidNotification.extras));\r
-        auto notificationData = LocalRef<jobject> (env->CallObjectMethod (extras, AndroidBundle.getBundle,\r
+        auto notificationData = LocalRef<jobject> (env->CallObjectMethod (extras, JavaBundle.getBundle,\r
                                                                           javaString ("notificationData").get()));\r
 \r
         if (notificationData.get() != nullptr)\r
@@ -1302,7 +1313,7 @@ struct PushNotifications::Pimpl
         {\r
             auto* env = getEnv();\r
 \r
-            auto keySet   = LocalRef<jobject> (env->CallObjectMethod (bundle, AndroidBundle.keySet));\r
+            auto keySet   = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.keySet));\r
             auto iterator = LocalRef<jobject> (env->CallObjectMethod (keySet, JavaSet.iterator));\r
 \r
             DynamicObject::Ptr dynamicObject = new DynamicObject();\r
@@ -1313,7 +1324,7 @@ struct PushNotifications::Pimpl
                     break;\r
 \r
                 auto key            = LocalRef<jstring> ((jstring) env->CallObjectMethod (iterator, JavaIterator.next));\r
-                auto object         = LocalRef<jobject> (env->CallObjectMethod (bundle, AndroidBundle.get, key.get()));\r
+                auto object         = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.get, key.get()));\r
 \r
                 if (object.get() != nullptr)\r
                 {\r
@@ -1321,8 +1332,8 @@ struct PushNotifications::Pimpl
                     auto objectClass    = LocalRef<jobject> (env->CallObjectMethod (object, JavaObject.getClass));\r
                     auto classAsString  = LocalRef<jstring> ((jstring) env->CallObjectMethod (objectClass, JavaClass.getName));\r
 \r
-                    // Note: It seems that Firebase delivers values as strings always, so this check is rather unnecessary,\r
-                    //       at least untill they change the behaviour.\r
+                    // Note: seems that Firebase delivers values as strings always, so this check is rather unnecessary,\r
+                    //       at least till they change the behaviour.\r
                     var value = juceString (classAsString) == "java.lang.Bundle" ? bundleToVar (object) : var (juceString (objectAsString.get()));\r
                     dynamicObject->setProperty (juceString (key.get()), value);\r
                 }\r
@@ -1332,7 +1343,7 @@ struct PushNotifications::Pimpl
                 }\r
             }\r
 \r
-            return var (dynamicObject.get());\r
+            return var (dynamicObject);\r
         }\r
 \r
         return {};\r
@@ -1411,7 +1422,7 @@ struct PushNotifications::Pimpl
             const uint8 b = (uint8) colourString.substring (4, 6).getIntValue();\r
             n.accentColour = Colour (r, g, b);\r
 \r
-            // Note: Ignoring the icon, because Firebase passes it as a string.\r
+            // Note: ignoring icon, because Firebase passes it as a string.\r
 \r
             propertiesDynamicObject->setProperty ("clickAction",           juceString (clickAction.get()));\r
             propertiesDynamicObject->setProperty ("bodyLocalizationKey",   juceString (bodyLocalizationKey.get()));\r
@@ -1493,12 +1504,12 @@ struct PushNotifications::Pimpl
                 env->CallVoidMethod (channel, NotificationChannel.enableVibration, c.enableVibration);\r
             }\r
 \r
-            LocalRef<jobject> builder (env->NewObject (AndroidAudioAttributesBuilder, AndroidAudioAttributesBuilder.constructor));\r
+            auto audioAttributesBuilder = LocalRef<jobject> (env->NewObject (AudioAttributesBuilder, AudioAttributesBuilder.constructor));\r
             const int contentTypeSonification = 4;\r
             const int usageNotification = 5;\r
-            env->CallObjectMethod (builder.get(), AndroidAudioAttributesBuilder.setContentType, contentTypeSonification);\r
-            env->CallObjectMethod (builder.get(), AndroidAudioAttributesBuilder.setUsage, usageNotification);\r
-            auto audioAttributes = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAudioAttributesBuilder.build));\r
+            env->CallObjectMethod (audioAttributesBuilder, AudioAttributesBuilder.setContentType, contentTypeSonification);\r
+            env->CallObjectMethod (audioAttributesBuilder, AudioAttributesBuilder.setUsage, usageNotification);\r
+            auto audioAttributes = LocalRef<jobject> (env->CallObjectMethod (audioAttributesBuilder, AudioAttributesBuilder.build));\r
             env->CallVoidMethod (channel, NotificationChannel.setSound, juceUrlToAndroidUri (c.soundToPlay).get(), audioAttributes.get());\r
 \r
             env->CallVoidMethod (notificationManager, NotificationManagerApi26.createNotificationChannel, channel.get());\r
@@ -1566,8 +1577,8 @@ struct PushNotifications::Pimpl
         if (extras == 0)\r
             return false;\r
 \r
-        return env->CallBooleanMethod (extras, AndroidBundle.containsKey, javaString ("google.sent_time").get())\r
-            && env->CallBooleanMethod (extras, AndroidBundle.containsKey, javaString ("google.message_id").get());\r
+        return env->CallBooleanMethod (extras, JavaBundle.containsKey, javaString ("google.sent_time").get())\r
+            && env->CallBooleanMethod (extras, JavaBundle.containsKey, javaString ("google.message_id").get());\r
     }\r
 \r
     PushNotifications& owner;\r
index 8e79b41cc7c0f0afed3c8509913041394633ce23..736efa04562795dd6f512527d7944854629b9a37 100644 (file)
@@ -46,32 +46,32 @@ DECLARE_JNI_CLASS (AndroidWebView, "android/webkit/WebView")
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor, "<init>", "()V")\r
 \r
-DECLARE_JNI_CLASS (AndroidWebChromeClient, "android/webkit/WebChromeClient")\r
+DECLARE_JNI_CLASS (AndroidWebChromeClient, "android/webkit/WebChromeClient");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor, "<init>", "()V")\r
 \r
-DECLARE_JNI_CLASS (AndroidWebViewClient, "android/webkit/WebViewClient")\r
+DECLARE_JNI_CLASS (AndroidWebViewClient, "android/webkit/WebViewClient");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   STATICMETHOD (getInstance, "getInstance", "()Landroid/webkit/CookieManager;")\r
 \r
-DECLARE_JNI_CLASS (AndroidCookieManager, "android/webkit/CookieManager")\r
+DECLARE_JNI_CLASS (AndroidCookieManager, "android/webkit/CookieManager");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor, "<init>",      "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V")\r
 \r
-DECLARE_JNI_CLASS (JuceWebChromeClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebChromeClient")\r
+DECLARE_JNI_CLASS (JuceWebChromeClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebChromeClient");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
   METHOD (constructor, "<init>",      "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V") \\r
   METHOD (hostDeleted, "hostDeleted", "()V")\r
 \r
-DECLARE_JNI_CLASS (JuceWebViewClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebViewClient")\r
+DECLARE_JNI_CLASS (JuceWebViewClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebViewClient");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -80,7 +80,7 @@ DECLARE_JNI_CLASS (JuceWebViewClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebV
   METHOD (setJavaScriptEnabled,      "setJavaScriptEnabled",      "(Z)V") \\r
   METHOD (setSupportMultipleWindows, "setSupportMultipleWindows", "(Z)V")\r
 \r
-DECLARE_JNI_CLASS (WebSettings, "android/webkit/WebSettings")\r
+DECLARE_JNI_CLASS (WebSettings, "android/webkit/WebSettings");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -339,13 +339,13 @@ private:
         {\r
             MemoryOutputStream ostream;\r
 \r
-            for (;;)\r
+            while (true)\r
             {\r
                 if (threadShouldExit())\r
                     return;\r
 \r
                 char buffer [8192];\r
-                auto num = webInputStream->read (buffer, sizeof (buffer));\r
+                const int num = webInputStream->read (buffer, sizeof (buffer));\r
 \r
                 if (num <= 0)\r
                     break;\r
index 0aa43b6cb846c31c2b35cf2c349c864ac54f1337..0f6288c5196ab0936205c883f83c874b9403aa37 100644 (file)
@@ -37,7 +37,7 @@ namespace PushNotificationsDelegateDetails
     {\r
         if (iOSEarlierThan10)\r
         {\r
-            auto action = [[UIMutableUserNotificationAction alloc] init];\r
+            auto* action = [[UIMutableUserNotificationAction alloc] init];\r
 \r
             action.identifier     = juceStringToNS (a.identifier);\r
             action.title          = juceStringToNS (a.title);\r
@@ -77,10 +77,10 @@ namespace PushNotificationsDelegateDetails
     {\r
         if (iOSEarlierThan10)\r
         {\r
-            auto category = [[UIMutableUserNotificationCategory alloc] init];\r
+            auto* category = [[UIMutableUserNotificationCategory alloc] init];\r
             category.identifier = juceStringToNS (c.identifier);\r
 \r
-            auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+            auto* actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
 \r
             for (const auto& a : c.actions)\r
             {\r
@@ -98,7 +98,7 @@ namespace PushNotificationsDelegateDetails
         else\r
         {\r
            #if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
-            auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+            auto* actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
 \r
             for (const auto& a : c.actions)\r
             {\r
@@ -119,7 +119,7 @@ namespace PushNotificationsDelegateDetails
     //==============================================================================\r
     UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n)\r
     {\r
-        auto notification = [[UILocalNotification alloc] init];\r
+        auto* notification = [[UILocalNotification alloc] init];\r
 \r
         notification.alertTitle = juceStringToNS (n.title);\r
         notification.alertBody  = juceStringToNS (n.body);\r
@@ -144,7 +144,7 @@ namespace PushNotificationsDelegateDetails
     UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n)\r
     {\r
         // content\r
-        auto content = [[UNMutableNotificationContent alloc] init];\r
+        auto* content = [[UNMutableNotificationContent alloc] init];\r
 \r
         content.title              = juceStringToNS (n.title);\r
         content.subtitle           = juceStringToNS (n.subtitle);\r
@@ -229,7 +229,7 @@ namespace PushNotificationsDelegateDetails
             propsVarObject->setProperty (propertyName, properties.getValueAt (i));\r
         }\r
 \r
-        return var (propsVarObject.get());\r
+        return var (propsVarObject);\r
     }\r
 \r
     //==============================================================================\r
@@ -585,7 +585,7 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
     {\r
         settings = settingsToUse;\r
 \r
-        auto categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()];\r
+        auto* categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()];\r
 \r
         if (iOSEarlierThan10)\r
         {\r
index 0fcdc9183c0f58e4d7c27bf2eed534f57d3d0247..d6eef2726f1c57bbe0c230f331f7ebe782841273 100644 (file)
@@ -57,7 +57,7 @@ public:
 \r
     void tryNextRead()\r
     {\r
-        for (;;)\r
+        while (true)\r
         {\r
             size_t len = (receivingLength ? sizeof (size_t) : bufferLength.len);\r
 \r
@@ -102,7 +102,7 @@ public:
         if (! params.isVoid())\r
             obj->setProperty (getParamIdentifier(), params);\r
 \r
-        String json (JSON::toString (var (obj.get())));\r
+        String json (JSON::toString (var (obj)));\r
 \r
         size_t jsonLength = static_cast<size_t> (json.length());\r
         size_t len        = sizeof (size_t) + jsonLength;\r
@@ -290,7 +290,7 @@ public:
 \r
             params->setProperty ("url", String (webkit_uri_request_get_uri (webkit_navigation_action_get_request (action))));\r
             params->setProperty ("decision_id", (int64) decision);\r
-            CommandReceiver::sendCommand (outChannel, "pageAboutToLoad", var (params.get()));\r
+            CommandReceiver::sendCommand (outChannel, "pageAboutToLoad", var (params));\r
 \r
             return true;\r
         }\r
@@ -307,7 +307,7 @@ public:
             DynamicObject::Ptr params = new DynamicObject;\r
 \r
             params->setProperty ("url", String (webkit_uri_request_get_uri (webkit_navigation_action_get_request (action))));\r
-            CommandReceiver::sendCommand (outChannel, "newWindowAttemptingToLoad", var (params.get()));\r
+            CommandReceiver::sendCommand (outChannel, "newWindowAttemptingToLoad", var (params));\r
 \r
             // never allow new windows\r
             webkit_policy_decision_ignore (decision);\r
@@ -325,7 +325,7 @@ public:
             DynamicObject::Ptr params = new DynamicObject;\r
 \r
             params->setProperty ("url", String (webkit_web_view_get_uri (webview)));\r
-            CommandReceiver::sendCommand (outChannel, "pageFinishedLoading", var (params.get()));\r
+            CommandReceiver::sendCommand (outChannel, "pageFinishedLoading", var (params));\r
         }\r
     }\r
 \r
@@ -376,7 +376,7 @@ public:
         DynamicObject::Ptr params = new DynamicObject;\r
 \r
         params->setProperty ("error", String (error != nullptr ? error->message : "unknown error"));\r
-        CommandReceiver::sendCommand (outChannel, "pageLoadHadNetworkError", var (params.get()));\r
+        CommandReceiver::sendCommand (outChannel, "pageLoadHadNetworkError", var (params));\r
     }\r
 \r
 private:\r
@@ -501,7 +501,7 @@ public:
         if (postData != nullptr)\r
             params->setProperty ("postData", var (*postData));\r
 \r
-        CommandReceiver::sendCommand (outChannel, "goToURL", var (params.get()));\r
+        CommandReceiver::sendCommand (outChannel, "goToURL", var (params));\r
     }\r
 \r
     void goBack()      { CommandReceiver::sendCommand (outChannel, "goBack",    var()); }\r
@@ -652,7 +652,7 @@ private:
             params->setProperty ("decision_id", decision_id);\r
             params->setProperty ("allow", owner.pageAboutToLoad (url));\r
 \r
-            CommandReceiver::sendCommand (outChannel, "decision", var (params.get()));\r
+            CommandReceiver::sendCommand (outChannel, "decision", var (params));\r
         }\r
     }\r
 \r
index e0f68d0b1ecae53a4a8d039d3b2737d5aaf05333..ec05152e2a6655122e53866a5634c9ee0221e810 100644 (file)
@@ -73,21 +73,9 @@ public:
     };\r
 \r
     //==============================================================================\r
-    struct SharedKeyWindow : public ReferenceCountedObject\r
+    class SharedKeyWindow : public ReferenceCountedObject\r
     {\r
-        SharedKeyWindow (ComponentPeer* peerToUse)\r
-            : keyPeer (peerToUse),\r
-              keyProxy (juce_createKeyProxyWindow (keyPeer))\r
-        {}\r
-\r
-        ~SharedKeyWindow()\r
-        {\r
-            juce_deleteKeyProxyWindow (keyPeer);\r
-\r
-            auto& keyWindows = getKeyWindows();\r
-            keyWindows.remove (keyPeer);\r
-        }\r
-\r
+    public:\r
         using Ptr = ReferenceCountedObjectPtr<SharedKeyWindow>;\r
 \r
         //==============================================================================\r
@@ -122,6 +110,21 @@ public:
 \r
     private:\r
         //==============================================================================\r
+        friend struct ContainerDeletePolicy<SharedKeyWindow>;\r
+\r
+        SharedKeyWindow (ComponentPeer* peerToUse)\r
+            : keyPeer (peerToUse),\r
+              keyProxy (juce_createKeyProxyWindow (keyPeer))\r
+        {}\r
+\r
+        ~SharedKeyWindow()\r
+        {\r
+            juce_deleteKeyProxyWindow (keyPeer);\r
+\r
+            auto& keyWindows = getKeyWindows();\r
+            keyWindows.remove (keyPeer);\r
+        }\r
+\r
         ComponentPeer* keyPeer;\r
         Window keyProxy;\r
 \r
@@ -421,8 +424,8 @@ private:
             // on which screen it might appear to get a scaling factor :-(\r
             auto& displays = Desktop::getInstance().getDisplays();\r
             auto* peer = owner.getPeer();\r
-            const double scale = (peer != nullptr ? peer->getPlatformScaleFactor()\r
-                                                  : displays.getMainDisplay().scale);\r
+            const double scale = (peer != nullptr ? displays.getDisplayContaining (peer->getBounds().getCentre())\r
+                                  : displays.getMainDisplay()).scale;\r
 \r
             Point<int> topLeftInPeer\r
                 = (peer != nullptr ? peer->getComponent().getLocalPoint (&owner, Point<int> (0, 0))\r
@@ -591,7 +594,9 @@ private:
         if (auto* peer = owner.getPeer())\r
         {\r
             auto r = peer->getComponent().getLocalArea (&owner, owner.getLocalBounds());\r
-            return r * peer->getPlatformScaleFactor();\r
+            auto scale = Desktop::getInstance().getDisplays().getDisplayContaining (peer->localToGlobal (r.getCentre())).scale;\r
+\r
+            return r * scale;\r
         }\r
 \r
         return owner.getLocalBounds();\r
index 78550f6fb94c751f8083b2f025ab98f7fb78f128..bc07d331722c8cb98fe9d35084f55049ca7f50f8 100644 (file)
@@ -142,22 +142,22 @@ bool AppleRemoteDevice::isActive() const
 \r
 bool AppleRemoteDevice::open (const bool openInExclusiveMode)\r
 {\r
-    Array<int> cookies;\r
+    Array <int> cookies;\r
 \r
     CFArrayRef elements;\r
-    auto device122 = (IOHIDDeviceInterface122**) device;\r
+    IOHIDDeviceInterface122** const device122 = (IOHIDDeviceInterface122**) device;\r
 \r
-    if ((*device122)->copyMatchingElements (device122, nullptr, &elements) != kIOReturnSuccess)\r
+    if ((*device122)->copyMatchingElements (device122, 0, &elements) != kIOReturnSuccess)\r
         return false;\r
 \r
     for (int i = 0; i < CFArrayGetCount (elements); ++i)\r
     {\r
-        auto element = (CFDictionaryRef) CFArrayGetValueAtIndex (elements, i);\r
+        CFDictionaryRef element = (CFDictionaryRef) CFArrayGetValueAtIndex (elements, i);\r
 \r
         // get the cookie\r
         CFTypeRef object = CFDictionaryGetValue (element, CFSTR (kIOHIDElementCookieKey));\r
 \r
-        if (object == nullptr || CFGetTypeID (object) != CFNumberGetTypeID())\r
+        if (object == 0 || CFGetTypeID (object) != CFNumberGetTypeID())\r
             continue;\r
 \r
         long number;\r
@@ -176,7 +176,7 @@ bool AppleRemoteDevice::open (const bool openInExclusiveMode)
     {\r
         queue = (*(IOHIDDeviceInterface**) device)->allocQueue ((IOHIDDeviceInterface**) device);\r
 \r
-        if (queue != nullptr)\r
+        if (queue != 0)\r
         {\r
             (*(IOHIDQueueInterface**) queue)->create ((IOHIDQueueInterface**) queue, 0, 12);\r
 \r
@@ -192,7 +192,7 @@ bool AppleRemoteDevice::open (const bool openInExclusiveMode)
                     ->createAsyncEventSource ((IOHIDQueueInterface**) queue, &eventSource) == KERN_SUCCESS)\r
             {\r
                 if ((*(IOHIDQueueInterface**) queue)->setEventCallout ((IOHIDQueueInterface**) queue,\r
-                                                                       appleRemoteQueueCallback, this, nullptr) == KERN_SUCCESS)\r
+                                                                       appleRemoteQueueCallback, this, 0) == KERN_SUCCESS)\r
                 {\r
                     CFRunLoopAddSource (CFRunLoopGetCurrent(), eventSource, kCFRunLoopDefaultMode);\r
 \r
index c23d8e257df6f14673b7adf40625ac022c447a90..90943fe34695d6abf9177257a5e8edd890f8ec34 100644 (file)
@@ -36,7 +36,7 @@ namespace PushNotificationsDelegateDetailsOsx
                                                               bool isEarlierThanMavericks,\r
                                                               bool isEarlierThanYosemite)\r
     {\r
-        auto notification = [[NSUserNotification alloc] init];\r
+        auto* notification = [[NSUserNotification alloc] init];\r
 \r
         notification.title           = juceStringToNS (n.title);\r
         notification.subtitle        = juceStringToNS (n.subtitle);\r
@@ -48,7 +48,7 @@ namespace PushNotificationsDelegateDetailsOsx
 \r
         if (n.repeat && n.triggerIntervalSec >= 60)\r
         {\r
-            auto dateComponents = [[NSDateComponents alloc] init];\r
+            auto* dateComponents = [[NSDateComponents alloc] init];\r
             auto intervalSec = NSInteger (n.triggerIntervalSec);\r
             dateComponents.second = intervalSec;\r
             dateComponents.nanosecond = NSInteger ((n.triggerIntervalSec - intervalSec) * 1000000000);\r
@@ -115,7 +115,7 @@ namespace PushNotificationsDelegateDetailsOsx
             {\r
                 if (n.actions.size() > 1)\r
                 {\r
-                    auto additionalActions = [NSMutableArray arrayWithCapacity: (NSUInteger) n.actions.size() - 1];\r
+                    auto* additionalActions = [NSMutableArray arrayWithCapacity: (NSUInteger) n.actions.size() - 1];\r
 \r
                     for (int a = 1; a < n.actions.size(); ++a)\r
                         [additionalActions addObject: [NSUserNotificationAction actionWithIdentifier: juceStringToNS (n.actions[a].identifier)\r
@@ -469,10 +469,10 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
     //PushNotificationsDelegate\r
     void registeredForRemoteNotifications (NSData* deviceTokenToUse) override\r
     {\r
-        auto deviceTokenString = [[[[deviceTokenToUse description]\r
-                                     stringByReplacingOccurrencesOfString: nsStringLiteral ("<") withString: nsStringLiteral ("")]\r
-                                     stringByReplacingOccurrencesOfString: nsStringLiteral (">") withString: nsStringLiteral ("")]\r
-                                     stringByReplacingOccurrencesOfString: nsStringLiteral (" ") withString: nsStringLiteral ("")];\r
+        auto* deviceTokenString = [[[[deviceTokenToUse description]\r
+                                      stringByReplacingOccurrencesOfString: nsStringLiteral ("<") withString: nsStringLiteral ("")]\r
+                                      stringByReplacingOccurrencesOfString: nsStringLiteral (">") withString: nsStringLiteral ("")]\r
+                                      stringByReplacingOccurrencesOfString: nsStringLiteral (" ") withString: nsStringLiteral ("")];\r
 \r
         deviceToken = nsStringToJuce (deviceTokenString);\r
 \r
index 7f9d96c19e59765c43f4870d828372a75c8621c5..50f46ce9676a85a4be67b852b7e358331d018994 100644 (file)
@@ -436,7 +436,7 @@ void WebBrowserComponent::checkWindowAssociation()
             // page to avoid this, (and send it back when it's made visible again).\r
 \r
             blankPageShown = true;\r
-            browser->goToURL ("about:blank", nullptr, nullptr);\r
+            browser->goToURL ("about:blank", 0, 0);\r
         }\r
     }\r
 }\r
index a359e93e967ce8a9c6e6584b34d7897289a921bb..98ead940941e3eeaac9da3734dda6d06a283bb19 100644 (file)
@@ -108,7 +108,7 @@ namespace ActiveXHelpers
 \r
         JUCE_COMRESULT GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo)\r
         {\r
-            /* Note: If you call AddRef on the frame here, then some types of object (e.g. web browser control) cause leaks..\r
+            /* Note: if you call AddRef on the frame here, then some types of object (e.g. web browser control) cause leaks..\r
                If you don't call AddRef then others crash (e.g. QuickTime).. Bit of a catch-22, so letting it leak is probably preferable.\r
             */\r
             if (lplpFrame != nullptr) { frame->AddRef(); *lplpFrame = frame; }\r
@@ -231,9 +231,6 @@ namespace ActiveXHelpers
 \r
 //==============================================================================\r
 class ActiveXControlComponent::Pimpl  : public ComponentMovementWatcher\r
-                                     #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                                      , public ComponentPeer::ScaleFactorListener\r
-                                     #endif\r
 {\r
 public:\r
     Pimpl (HWND hwnd, ActiveXControlComponent& activeXComp)\r
@@ -254,26 +251,12 @@ public:
 \r
         clientSite->Release();\r
         storage->Release();\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
-            if (auto* peer = ComponentPeer::getPeer (i))\r
-                peer->removeScaleFactorListener (this);\r
-        #endif\r
     }\r
 \r
     void setControlBounds (Rectangle<int> newBounds) const\r
     {\r
         if (controlHWND != 0)\r
-        {\r
-           #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            if (auto* peer = owner.getTopLevelComponent()->getPeer())\r
-                newBounds = (newBounds.toDouble() * peer->getPlatformScaleFactor()).toNearestInt();\r
-           #endif\r
-\r
             MoveWindow (controlHWND, newBounds.getX(), newBounds.getY(), newBounds.getWidth(), newBounds.getHeight(), TRUE);\r
-        }\r
-\r
     }\r
 \r
     void setControlVisible (bool shouldBeVisible) const\r
@@ -286,17 +269,12 @@ public:
     void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override\r
     {\r
         if (auto* peer = owner.getTopLevelComponent()->getPeer())\r
-            setControlBounds (peer->getAreaCoveredBy (owner));\r
+            setControlBounds (peer->getAreaCoveredBy(owner));\r
     }\r
 \r
     void componentPeerChanged() override\r
     {\r
         componentMovedOrResized (true, true);\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        if (auto* peer = owner.getTopLevelComponent()->getPeer())\r
-            peer->addScaleFactorListener (this);\r
-       #endif\r
     }\r
 \r
     void componentVisibilityChanged() override\r
@@ -305,13 +283,6 @@ public:
         componentPeerChanged();\r
     }\r
 \r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    void nativeScaleFactorChanged (double /*newScaleFactor*/) override\r
-    {\r
-        componentMovedOrResized (true, true);\r
-    }\r
-   #endif\r
-\r
     // intercepts events going to an activeX control, so we can sneakily use the mouse events\r
     static LRESULT CALLBACK activeXHookWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
     {\r
index 56cd4c4a22b344ed6343a21860545acd5a5331a3..bd0929a66235c2981a1092021b6091e09f9bb50c 100644 (file)
@@ -97,7 +97,7 @@ public:
         mat[12] = vector.x; mat[13] = vector.y; mat[14] = vector.z;  mat[15] = Type (1);\r
     }\r
 \r
-    /** Returns a new matrix from the given frustum values. */\r
+    /** Returns a new matrix from the given frustrum values. */\r
     static Matrix3D fromFrustum (Type left, Type right, Type bottom, Type top, Type nearDistance, Type farDistance) noexcept\r
     {\r
         return { (Type (2) * nearDistance) / (right - left), 0, 0, 0,\r
index e3e96e8cda06092f26dac93c9907cebec4280d52..60021bfbbd5dd5a1d55b1f0e740f33c8e5e2d5dc 100644 (file)
@@ -177,7 +177,7 @@ static bool checkPeerIsValid (OpenGLContext* context)
                #if JUCE_MAC || JUCE_IOS\r
                 if (auto* nsView = (JUCE_IOS_MAC_VIEW*) peer->getNativeHandle())\r
                 {\r
-                    if (auto nsWindow = [nsView window])\r
+                    if (auto* nsWindow = [nsView window])\r
                     {\r
                        #if JUCE_MAC\r
                         return ([nsWindow isVisible]\r
index 29fa4b8534f9430cec8166545d584f140e44d428..663d85b110d8d5113d83889964d17d581befb79b 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_opengl\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE OpenGL classes\r
   description:      Classes for rendering OpenGL in a JUCE window.\r
   website:          http://www.juce.com/juce\r
index e45d1f4e8f4b2f371a49bde31c5d2efa558358be..acf5c9dcc885e402d0696319afc5ab2455c31374 100644 (file)
@@ -64,9 +64,7 @@ namespace juce
     USE_FUNCTION (glUniform1fv,             void, (GLint p1, GLsizei p2, const GLfloat* p3), (p1, p2, p3))\\r
     USE_FUNCTION (glUniformMatrix2fv,       void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\\r
     USE_FUNCTION (glUniformMatrix3fv,       void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\\r
-    USE_FUNCTION (glUniformMatrix4fv,       void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\\r
-    USE_FUNCTION (glBindAttribLocation,     void, (GLuint p1, GLuint p2, const GLchar* p3), (p1, p2, p3))\\r
-    USE_FUNCTION (glDrawBuffers,            void, (GLsizei p1, const GLenum* p2), (p1, p2))\r
+    USE_FUNCTION (glUniformMatrix4fv,       void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\r
 \r
 /** @internal This macro contains a list of GL extension functions that need to be dynamically loaded on Windows/Linux.\r
     @see OpenGLExtensionFunctions\r
index bef9b2f5d47d6ba9f917aea5dfefb901baaaecee..a91d965db335a130d0d856c26974e9fb9b248a03 100644 (file)
@@ -45,9 +45,10 @@ public:
                    bool /*useMultisampling*/,\r
                    OpenGLVersion)\r
         : component (comp),\r
-          surface (EGL_NO_SURFACE), context (EGL_NO_CONTEXT)\r
+          hasInitialised (false),\r
+          juceContext (nullptr), surface (EGL_NO_SURFACE), context (EGL_NO_CONTEXT)\r
     {\r
-        auto env = getEnv();\r
+        JNIEnv* env = getEnv();\r
 \r
         // Do we have a native peer that we can attach to?\r
         if (component.getPeer()->getNativeHandle() == nullptr)\r
@@ -60,8 +61,7 @@ public:
         // create a native surface view\r
         surfaceView = GlobalRef (env->CallObjectMethod (android.activity.get(),\r
                                                         JuceAppActivity.createNativeSurfaceView,\r
-                                                        reinterpret_cast<jlong> (this),\r
-                                                        false));\r
+                                                        reinterpret_cast<jlong> (this)));\r
         if (surfaceView.get() == nullptr)\r
             return;\r
 \r
@@ -71,7 +71,8 @@ public:
                              AndroidViewGroup.addView, surfaceView.get());\r
 \r
         // initialise the geometry of the view\r
-        auto bounds = component.getTopLevelComponent()->getLocalArea (&component, component.getLocalBounds());\r
+        Rectangle<int> bounds = component.getTopLevelComponent()\r
+            ->getLocalArea (&component, component.getLocalBounds());\r
         bounds *= component.getDesktopScaleFactor();\r
 \r
         updateWindowPosition (bounds);\r
@@ -80,7 +81,7 @@ public:
 \r
     ~NativeContext()\r
     {\r
-        auto env = getEnv();\r
+        JNIEnv* env = getEnv();\r
 \r
         if (jobject viewParent = env->CallObjectMethod (surfaceView.get(), NativeSurfaceView.getParent))\r
             env->CallVoidMethod (viewParent, AndroidViewGroup.removeView, surfaceView.get());\r
@@ -94,41 +95,44 @@ public:
         // has the context already attached?\r
         jassert (surface == EGL_NO_SURFACE && context == EGL_NO_CONTEXT);\r
 \r
-        auto env = getEnv();\r
+        JNIEnv* env = getEnv();\r
 \r
+        // get a pointer to the native window\r
         ANativeWindow* window = nullptr;\r
-\r
         if (jobject jSurface = env->CallObjectMethod (surfaceView.get(), NativeSurfaceView.getNativeSurface))\r
         {\r
-            window = ANativeWindow_fromSurface (env, jSurface);\r
+            window = ANativeWindow_fromSurface(env, jSurface);\r
 \r
-            // if we didn't succeed the first time, wait briefly and try again..\r
+            // if we didn't succeed the first time, wait 25ms and try again\r
             if (window == nullptr)\r
             {\r
-                Thread::sleep (200);\r
+                Thread::sleep (25);\r
                 window = ANativeWindow_fromSurface (env, jSurface);\r
             }\r
         }\r
 \r
         if (window == nullptr)\r
         {\r
-            // failed to get a pointer to the native window after second try so bail out\r
+            // failed to get a pointer to the native window after second try so\r
+            // bail out\r
             jassertfalse;\r
+\r
             return false;\r
         }\r
 \r
         // create the surface\r
-        surface = eglCreateWindowSurface (display, config, window, 0);\r
+        surface = eglCreateWindowSurface(display, config, window, 0);\r
         jassert (surface != EGL_NO_SURFACE);\r
 \r
         ANativeWindow_release (window);\r
 \r
         // create the OpenGL context\r
-        EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };\r
-        context = eglCreateContext (display, config, EGL_NO_CONTEXT, contextAttribs);\r
+        EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};\r
+        context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);\r
         jassert (context != EGL_NO_CONTEXT);\r
 \r
         juceContext = &aContext;\r
+\r
         return true;\r
     }\r
 \r
@@ -183,10 +187,10 @@ public:
     {\r
         if (lastBounds != bounds)\r
         {\r
-            auto env = getEnv();\r
+            JNIEnv* env = getEnv();\r
 \r
             lastBounds = bounds;\r
-            auto r = bounds * Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
+            Rectangle<int> r = bounds * Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
 \r
             env->CallVoidMethod (surfaceView.get(), NativeSurfaceView.layout,\r
                                  (jint) r.getX(), (jint) r.getY(), (jint) r.getRight(), (jint) r.getBottom());\r
@@ -262,12 +266,12 @@ private:
     }\r
 \r
     //==============================================================================\r
-    bool hasInitialised = false;\r
+    bool hasInitialised;\r
 \r
     GlobalRef surfaceView;\r
     Rectangle<int> lastBounds;\r
 \r
-    OpenGLContext* juceContext = nullptr;\r
+    OpenGLContext* juceContext;\r
     EGLSurface surface;\r
     EGLContext context;\r
 \r
index e5524769bd6edfcf8f30f31b297becaee1edf472..9de02cb2832e5fdff12d9178fad61ad77357feb3 100644 (file)
@@ -154,7 +154,6 @@ public:
 \r
     void shutdownOnRenderThread()\r
     {\r
-        ScopedXLock xlock (display);\r
         context = nullptr;\r
         deactivateCurrentContext();\r
         glXDestroyContext (display, renderContext);\r
@@ -163,27 +162,23 @@ public:
 \r
     bool makeActive() const noexcept\r
     {\r
-        ScopedXLock xlock (display);\r
         return renderContext != 0\r
                  && glXMakeCurrent (display, embeddedWindow, renderContext);\r
     }\r
 \r
     bool isActive() const noexcept\r
     {\r
-        ScopedXLock xlock (display);\r
         return glXGetCurrentContext() == renderContext && renderContext != 0;\r
     }\r
 \r
     static void deactivateCurrentContext()\r
     {\r
         ScopedXDisplay xDisplay;\r
-        ScopedXLock xlock (xDisplay.display);\r
         glXMakeCurrent (xDisplay.display, None, 0);\r
     }\r
 \r
     void swapBuffers()\r
     {\r
-        ScopedXLock xlock (display);\r
         glXSwapBuffers (display, embeddedWindow);\r
     }\r
 \r
@@ -207,7 +202,6 @@ public:
         if (auto GLXSwapIntervalSGI\r
               = (PFNGLXSWAPINTERVALSGIPROC) OpenGLHelpers::getExtensionFunction ("glXSwapIntervalSGI"))\r
         {\r
-            ScopedXLock xlock (display);\r
             swapFrames = numFramesPerSwap;\r
             GLXSwapIntervalSGI (numFramesPerSwap);\r
             return true;\r
index 651b4f88f117eaa26fdfc705f382829c88ad6021..dd1784f5330b998aa0302894d9ff9d3161bd954d 100644 (file)
@@ -35,6 +35,7 @@ public:
                    void* contextToShare,\r
                    bool shouldUseMultisampling,\r
                    OpenGLVersion version)\r
+        : lastSwapTime (0), minSwapTimeMs (0), underrunCounter (0)\r
     {\r
         NSOpenGLPixelFormatAttribute attribs[64] = { 0 };\r
         createAttribs (attribs, version, pixFormat, shouldUseMultisampling);\r
@@ -70,7 +71,7 @@ public:
         [renderContext clearDrawable];\r
         [renderContext setView: nil];\r
         [view setOpenGLContext: nil];\r
-        [view release];\r
+        renderContext = nil;\r
     }\r
 \r
     static void createAttribs (NSOpenGLPixelFormatAttribute* attribs, OpenGLVersion version,\r
@@ -80,33 +81,33 @@ public:
         int numAttribs = 0;\r
 \r
        #if JUCE_OPENGL3\r
-        attribs[numAttribs++] = NSOpenGLPFAOpenGLProfile;\r
-        attribs[numAttribs++] = version >= openGL3_2 ? NSOpenGLProfileVersion3_2Core\r
-                                                     : NSOpenGLProfileVersionLegacy;\r
+        attribs [numAttribs++] = NSOpenGLPFAOpenGLProfile;\r
+        attribs [numAttribs++] = version >= openGL3_2 ? NSOpenGLProfileVersion3_2Core\r
+                                                      : NSOpenGLProfileVersionLegacy;\r
        #endif\r
 \r
-        attribs[numAttribs++] = NSOpenGLPFADoubleBuffer;\r
-        attribs[numAttribs++] = NSOpenGLPFAClosestPolicy;\r
-        attribs[numAttribs++] = NSOpenGLPFANoRecovery;\r
-        attribs[numAttribs++] = NSOpenGLPFAColorSize;\r
-        attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.redBits + pixFormat.greenBits + pixFormat.blueBits);\r
-        attribs[numAttribs++] = NSOpenGLPFAAlphaSize;\r
-        attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.alphaBits;\r
-        attribs[numAttribs++] = NSOpenGLPFADepthSize;\r
-        attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.depthBufferBits;\r
-        attribs[numAttribs++] = NSOpenGLPFAStencilSize;\r
-        attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.stencilBufferBits;\r
-        attribs[numAttribs++] = NSOpenGLPFAAccumSize;\r
-        attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.accumulationBufferRedBits + pixFormat.accumulationBufferGreenBits\r
+        attribs [numAttribs++] = NSOpenGLPFADoubleBuffer;\r
+        attribs [numAttribs++] = NSOpenGLPFAClosestPolicy;\r
+        attribs [numAttribs++] = NSOpenGLPFANoRecovery;\r
+        attribs [numAttribs++] = NSOpenGLPFAColorSize;\r
+        attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.redBits + pixFormat.greenBits + pixFormat.blueBits);\r
+        attribs [numAttribs++] = NSOpenGLPFAAlphaSize;\r
+        attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.alphaBits;\r
+        attribs [numAttribs++] = NSOpenGLPFADepthSize;\r
+        attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.depthBufferBits;\r
+        attribs [numAttribs++] = NSOpenGLPFAStencilSize;\r
+        attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.stencilBufferBits;\r
+        attribs [numAttribs++] = NSOpenGLPFAAccumSize;\r
+        attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.accumulationBufferRedBits + pixFormat.accumulationBufferGreenBits\r
                                                                    + pixFormat.accumulationBufferBlueBits + pixFormat.accumulationBufferAlphaBits);\r
 \r
         if (shouldUseMultisampling)\r
         {\r
-            attribs[numAttribs++] = NSOpenGLPFAMultisample;\r
-            attribs[numAttribs++] = NSOpenGLPFASampleBuffers;\r
-            attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) 1;\r
-            attribs[numAttribs++] = NSOpenGLPFASamples;\r
-            attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.multisamplingLevel;\r
+            attribs [numAttribs++] = NSOpenGLPFAMultisample;\r
+            attribs [numAttribs++] = NSOpenGLPFASampleBuffers;\r
+            attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) 1;\r
+            attribs [numAttribs++] = NSOpenGLPFASamples;\r
+            attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.multisamplingLevel;\r
         }\r
     }\r
 \r
@@ -161,7 +162,7 @@ public:
 \r
     void swapBuffers()\r
     {\r
-        auto now = Time::getMillisecondCounterHiRes();\r
+        double now = Time::getMillisecondCounterHiRes();\r
         [renderContext flushBuffer];\r
 \r
         if (minSwapTimeMs > 0)\r
@@ -171,8 +172,8 @@ public:
             // speed, burning CPU. This hack detects when things are going too fast\r
             // and sleeps if necessary.\r
 \r
-            auto swapTime = Time::getMillisecondCounterHiRes() - now;\r
-            auto frameTime = (int) (now - lastSwapTime);\r
+            const double swapTime = Time::getMillisecondCounterHiRes() - now;\r
+            const int frameTime = (int) (now - lastSwapTime);\r
 \r
             if (swapTime < 0.5 && frameTime < minSwapTimeMs - 3)\r
             {\r
@@ -182,9 +183,7 @@ public:
                     now = Time::getMillisecondCounterHiRes();\r
                 }\r
                 else\r
-                {\r
                     ++underrunCounter;\r
-                }\r
             }\r
             else\r
             {\r
@@ -216,11 +215,11 @@ public:
         return numFrames;\r
     }\r
 \r
-    NSOpenGLContext* renderContext = nil;\r
-    NSOpenGLView* view = nil;\r
+    NSOpenGLContext* renderContext;\r
+    NSOpenGLView* view;\r
     ReferenceCountedObjectPtr<ReferenceCountedObject> viewAttachment;\r
-    double lastSwapTime = 0;\r
-    int minSwapTimeMs = 0, underrunCounter = 0;\r
+    double lastSwapTime;\r
+    int minSwapTimeMs, underrunCounter;\r
 \r
     //==============================================================================\r
     struct MouseForwardingNSOpenGLViewClass  : public ObjCClass<NSOpenGLView>\r
@@ -247,7 +246,17 @@ public:
 //==============================================================================\r
 bool OpenGLHelpers::isContextActive()\r
 {\r
-    return CGLGetCurrentContext() != CGLContextObj();\r
+    return CGLGetCurrentContext() != 0;\r
+}\r
+\r
+//==============================================================================\r
+void componentPeerAboutToChange (Component& comp, bool shouldSuspend)\r
+{\r
+    if (auto* context = OpenGLContext::getContextAttachedTo (comp))\r
+        context->overrideCanBeAttached (shouldSuspend);\r
+\r
+    for (auto* child : comp.getChildren())\r
+        componentPeerAboutToChange (*child, shouldSuspend);\r
 }\r
 \r
 } // namespace juce\r
index 15ed2154bacf827f43777acc547680448f95f8fd..1672c452bb9d0c69273686397456ed16ed58d689 100644 (file)
@@ -28,13 +28,9 @@ namespace juce
 {\r
 \r
 extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component&, void* parent);\r
-extern bool shouldScaleGLWindow (void* hwnd);\r
 \r
 //==============================================================================\r
 class OpenGLContext::NativeContext\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    : public ComponentPeer::ScaleFactorListener\r
-   #endif\r
 {\r
 public:\r
     NativeContext (Component& component,\r
@@ -91,12 +87,6 @@ public:
     {\r
         deleteRenderContext();\r
         releaseDC();\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
-            if (auto* peer = ComponentPeer::getPeer (i))\r
-                peer->removeScaleFactorListener (this);\r
-       #endif\r
     }\r
 \r
     bool initialiseOnRenderThread (OpenGLContext& c)\r
@@ -127,17 +117,9 @@ public:
     void updateWindowPosition (Rectangle<int> bounds)\r
     {\r
         if (nativeWindow != nullptr)\r
-        {\r
-           #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            if (safeComponent != nullptr)\r
-                if (auto* peer = safeComponent->getTopLevelComponent()->getPeer())\r
-                    bounds = (bounds.toDouble() * peer->getPlatformScaleFactor()).toNearestInt();\r
-           #endif\r
-\r
             SetWindowPos ((HWND) nativeWindow->getNativeHandle(), 0,\r
                           bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(),\r
                           SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER);\r
-        }\r
     }\r
 \r
     bool createdOk() const noexcept                 { return getRawContext() != nullptr; }\r
@@ -152,23 +134,6 @@ public:
 \r
     struct Locker { Locker (NativeContext&) {} };\r
 \r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    void nativeScaleFactorChanged (double /*newScaleFactor*/) override\r
-    {\r
-        if (safeComponent != nullptr)\r
-            if (auto peer = safeComponent->getTopLevelComponent()->getPeer())\r
-                updateWindowPosition (peer->getAreaCoveredBy (*safeComponent));\r
-    }\r
-   #endif\r
-\r
-    double getWindowScaleFactor (const Rectangle<int>& screenBounds)\r
-    {\r
-        if (nativeWindow != nullptr && shouldScaleGLWindow (nativeWindow->getNativeHandle()))\r
-            return Desktop::getInstance().getDisplays().findDisplayForRect (screenBounds).scale;\r
-\r
-        return 1.0;\r
-    }\r
-\r
 private:\r
     struct DummyComponent  : public Component\r
     {\r
@@ -185,9 +150,6 @@ private:
     HGLRC renderContext;\r
     HDC dc;\r
     OpenGLContext* context = {};\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    Component::SafePointer<Component> safeComponent;\r
-   #endif\r
 \r
     #define JUCE_DECLARE_WGL_EXTENSION_FUNCTION(name, returnType, params) \\r
         typedef returnType (__stdcall *type_ ## name) params; type_ ## name name;\r
@@ -212,14 +174,7 @@ private:
         nativeWindow.reset (createNonRepaintingEmbeddedWindowsPeer (*dummyComponent, topComp->getWindowHandle()));\r
 \r
         if (auto* peer = topComp->getPeer())\r
-        {\r
-           #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-            peer->addScaleFactorListener (this);\r
-            safeComponent = Component::SafePointer<Component> (&component);\r
-           #endif\r
-\r
             updateWindowPosition (peer->getAreaCoveredBy (component));\r
-        }\r
 \r
         nativeWindow->setVisible (true);\r
         dc = GetDC ((HWND) nativeWindow->getNativeHandle());\r
index a45d714d359c23c0507673edcb0962d4abe1808b..85d69eb91f02dabea7f55ea4ba9fc9339c93151e 100644 (file)
@@ -280,14 +280,16 @@ public:
     {\r
         if (auto* peer = component.getPeer())\r
         {\r
-           #if JUCE_WINDOWS\r
-            auto newScale = nativeContext->getWindowScaleFactor (component.getTopLevelComponent()->getScreenBounds());\r
-           #else\r
-            auto newScale = Desktop::getInstance().getDisplays().findDisplayForRect (component.getTopLevelComponent()->getScreenBounds()).scale;\r
-           #endif\r
+            lastScreenBounds = component.getTopLevelComponent()->getScreenBounds();\r
+\r
+            auto newScale = Desktop::getInstance().getDisplays()\r
+                              .getDisplayContaining (lastScreenBounds.getCentre()).scale;\r
 \r
             auto localBounds = component.getLocalBounds();\r
-            auto newArea = peer->getComponent().getLocalArea (&component, localBounds).withZeroOrigin() * newScale;\r
+\r
+            auto newArea = peer->getComponent().getLocalArea (&component, localBounds)\r
+                                               .withZeroOrigin()\r
+                             * newScale;\r
 \r
             if (scale != newScale || viewportArea != newArea)\r
             {\r
@@ -588,24 +590,15 @@ public:
     {\r
         if (calledFromDestructor || destroying.get() == 0)\r
         {\r
-            if (shouldBlock)\r
-            {\r
-                auto blocker = new BlockingWorker (static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse));\r
-                OpenGLContext::AsyncWorker::Ptr worker (*blocker);\r
-                workQueue.add (worker);\r
+            BlockingWorker* blocker = (shouldBlock ? new BlockingWorker (static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse)) : nullptr);\r
+            OpenGLContext::AsyncWorker::Ptr worker = (blocker != nullptr ? blocker : static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse));\r
+            workQueue.add (worker);\r
 \r
-                messageManagerLock.abort();\r
-                context.triggerRepaint();\r
+            messageManagerLock.abort();\r
+            context.triggerRepaint();\r
 \r
+            if (blocker != nullptr)\r
                 blocker->block();\r
-            }\r
-            else\r
-            {\r
-                workQueue.add (static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse));\r
-\r
-                messageManagerLock.abort();\r
-                context.triggerRepaint();\r
-            }\r
         }\r
         else\r
         {\r
@@ -1015,8 +1008,8 @@ ReferenceCountedObject* OpenGLContext::getAssociatedObject (const char* name) co
     jassert (c != nullptr && nativeContext != nullptr);\r
     jassert (getCurrentContext() != nullptr);\r
 \r
-    auto index = c->associatedObjectNames.indexOf (name);\r
-    return index >= 0 ? c->associatedObjects.getUnchecked (index).get() : nullptr;\r
+    const int index = c->associatedObjectNames.indexOf (name);\r
+    return index >= 0 ? c->associatedObjects.getUnchecked (index) : nullptr;\r
 }\r
 \r
 void OpenGLContext::setAssociatedObject (const char* name, ReferenceCountedObject* newObject)\r
@@ -1062,6 +1055,17 @@ void OpenGLContext::execute (OpenGLContext::AsyncWorker::Ptr workerToUse, bool s
         jassertfalse; // You must have attached the context to a component\r
 }\r
 \r
+void OpenGLContext::overrideCanBeAttached (bool newCanAttach)\r
+{\r
+    if (overrideCanAttach != newCanAttach)\r
+    {\r
+        overrideCanAttach = newCanAttach;\r
+\r
+        if (auto* a = attachment.get())\r
+            a->update();\r
+    }\r
+}\r
+\r
 //==============================================================================\r
 struct DepthTestDisabler\r
 {\r
@@ -1195,7 +1199,7 @@ void OpenGLContext::copyTexture (const Rectangle<int>& targetClipArea,
         extensions.glBufferData (GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW);\r
 \r
         auto index = (GLuint) program.params.positionAttribute.attributeID;\r
-        extensions.glVertexAttribPointer (index, 2, GL_SHORT, GL_FALSE, 4, nullptr);\r
+        extensions.glVertexAttribPointer (index, 2, GL_SHORT, GL_FALSE, 4, 0);\r
         extensions.glEnableVertexAttribArray (index);\r
         JUCE_CHECK_OPENGL_ERROR\r
 \r
index 48dc1daf676fae322439e6a30c142f519493d59e..ef5e15edf0866150f3a50902c2f97757f7300e5e 100644 (file)
@@ -260,7 +260,7 @@ public:
     //==============================================================================\r
     /** Returns the scale factor used by the display that is being rendered.\r
 \r
-        The scale is that of the display - see Displays::Display::scale\r
+        The scale is that of the display - see Desktop::Displays::Display::scale\r
 \r
         Note that this should only be called during an OpenGLRenderer::renderOpenGL()\r
         callback - at other times the value it returns is undefined.\r
@@ -349,6 +349,10 @@ private:
         JUCE_DECLARE_NON_COPYABLE (AsyncWorkerFunctor)\r
     };\r
 \r
+    //==============================================================================\r
+    friend void componentPeerAboutToChange (Component&, bool);\r
+    void overrideCanBeAttached (bool);\r
+\r
     //==============================================================================\r
     CachedImage* getCachedImage() const noexcept;\r
     void execute (AsyncWorker::Ptr, bool);\r
index e92f7a823372cc872649f06fc2ae3822296cde90..824fbb81895cca9ad198ec1da73f01df2c5f3ee8 100644 (file)
@@ -58,7 +58,7 @@ public:
         glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\r
         JUCE_CHECK_OPENGL_ERROR\r
 \r
-        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);\r
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);\r
         JUCE_CHECK_OPENGL_ERROR\r
 \r
         context.extensions.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);\r
index ee740bc23385e05b0c568bd9c380a589059166c1..bd661e8901bb5f759d5f9bf0e10b58d427049a6b 100644 (file)
@@ -123,9 +123,11 @@ public:
 \r
 private:\r
     class Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     class SavedState;\r
+    friend struct ContainerDeletePolicy<SavedState>;\r
     std::unique_ptr<SavedState> savedState;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLFrameBuffer)\r
index 6731ef9f4448dd337a0b8a1108af9d917e3e8f97..4d49340a86a890d9988162717e38ad7519de88ae 100644 (file)
@@ -111,10 +111,10 @@ struct CachedImageList  : public ReferenceCountedObject,
         {\r
             TextureInfo t;\r
 \r
-            if (textureNeedsReloading && pixelData != nullptr)\r
+            if (textureNeedsReloading)\r
             {\r
                 textureNeedsReloading = false;\r
-                texture.loadImage (Image (*pixelData));\r
+                texture.loadImage (Image (pixelData));\r
             }\r
 \r
             t.textureID = texture.getTextureID();\r
@@ -422,7 +422,7 @@ struct ShaderPrograms  : public ReferenceCountedObject
 \r
         void bindAttributes (OpenGLContext& context)\r
         {\r
-            context.extensions.glVertexAttribPointer ((GLuint) positionAttribute.attributeID, 2, GL_SHORT, GL_FALSE, 8, nullptr);\r
+            context.extensions.glVertexAttribPointer ((GLuint) positionAttribute.attributeID, 2, GL_SHORT, GL_FALSE, 8, (void*) 0);\r
             context.extensions.glVertexAttribPointer ((GLuint) colourAttribute.attributeID, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, (void*) 4);\r
             context.extensions.glEnableVertexAttribArray ((GLuint) positionAttribute.attributeID);\r
             context.extensions.glEnableVertexAttribArray ((GLuint) colourAttribute.attributeID);\r
@@ -1279,7 +1279,7 @@ struct StateHelpers
             context.extensions.glBufferSubData (GL_ARRAY_BUFFER, 0, (GLsizeiptr) ((size_t) numVertices * sizeof (VertexInfo)), vertexData);\r
             // NB: If you get a random crash in here and are running in a Parallels VM, it seems to be a bug in\r
             // their driver.. Can't find a workaround unfortunately.\r
-            glDrawElements (GL_TRIANGLES, (numVertices * 3) / 2, GL_UNSIGNED_SHORT, nullptr);\r
+            glDrawElements (GL_TRIANGLES, (numVertices * 3) / 2, GL_UNSIGNED_SHORT, 0);\r
             JUCE_CHECK_OPENGL_ERROR\r
             numVertices = 0;\r
         }\r
@@ -1298,7 +1298,7 @@ struct StateHelpers
             if (programs == nullptr)\r
             {\r
                 programs = new ShaderPrograms (context);\r
-                context.setAssociatedObject (programValueID, programs.get());\r
+                context.setAssociatedObject (programValueID, programs);\r
             }\r
         }\r
 \r
@@ -1430,7 +1430,7 @@ struct GLState
         auto p3 = Point<float> (g.point1.x + (g.point2.y - g.point1.y),\r
                                 g.point1.y - (g.point2.x - g.point1.x)).transformedBy (t);\r
 \r
-        auto programs = currentShader.programs;\r
+        ShaderPrograms* const programs = currentShader.programs;\r
         const ShaderPrograms::MaskedShaderParams* maskParams = nullptr;\r
 \r
         if (g.isRadial)\r
@@ -1507,7 +1507,7 @@ struct GLState
     {\r
         blendMode.setPremultipliedBlendingMode (shaderQuadQueue);\r
 \r
-        auto programs = currentShader.programs;\r
+        ShaderPrograms* const programs = currentShader.programs;\r
 \r
         const ShaderPrograms::MaskedShaderParams* maskParams = nullptr;\r
         const ShaderPrograms::ImageParams* imageParams;\r
@@ -1660,7 +1660,7 @@ struct SavedState  : public RenderingHelpers::SavedStateBase<SavedState>
                 const std::unique_ptr<EdgeTable> et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight));\r
 \r
                 if (et != nullptr)\r
-                    fillShape (*new EdgeTableRegionType (*et), false);\r
+                    fillShape (new EdgeTableRegionType (*et), false);\r
             }\r
         }\r
     }\r
@@ -1842,19 +1842,18 @@ struct CustomProgram  : public ReferenceCountedObject,
     {\r
     }\r
 \r
-    static ReferenceCountedObjectPtr<CustomProgram> get (const String& hashName)\r
+    static CustomProgram* get (const String& hashName)\r
     {\r
         if (auto* c = OpenGLContext::getCurrentContext())\r
-            if (auto* o = c->getAssociatedObject (hashName.toRawUTF8()))\r
-                return *static_cast<CustomProgram*> (o);\r
+            return static_cast<CustomProgram*> (c->getAssociatedObject (hashName.toRawUTF8()));\r
 \r
-        return {};\r
+        return nullptr;\r
     }\r
 \r
-    static ReferenceCountedObjectPtr<CustomProgram> getOrCreate (LowLevelGraphicsContext& gc, const String& hashName,\r
-                                                                 const String& code, String& errorMessage)\r
+    static CustomProgram* getOrCreate (LowLevelGraphicsContext& gc, const String& hashName,\r
+                                       const String& code, String& errorMessage)\r
     {\r
-        if (auto c = get (hashName))\r
+        if (auto* c = get (hashName))\r
             return c;\r
 \r
         if (auto* sc = dynamic_cast<OpenGLRendering::ShaderContext*> (&gc))\r
@@ -1866,7 +1865,7 @@ struct CustomProgram  : public ReferenceCountedObject,
             {\r
                 if (auto context = OpenGLContext::getCurrentContext())\r
                 {\r
-                    context->setAssociatedObject (hashName.toRawUTF8(), c.get());\r
+                    context->setAssociatedObject (hashName.toRawUTF8(), c);\r
                     return c;\r
                 }\r
             }\r
index 36e21092bae1fa96375363fe45a541c7a3b56907..44e5fcc0e9c51e04e9dd6b4f64a1b66aa6455c6a 100644 (file)
@@ -53,11 +53,11 @@ public:
 \r
     ImagePixelData::Ptr clone() override\r
     {\r
-        Image newImage (*new OpenGLFrameBufferImage (context, width, height));\r
+        Image newImage (new OpenGLFrameBufferImage (context, width, height));\r
         Graphics g (newImage);\r
-        g.drawImageAt (Image (*this), 0, 0, false);\r
+        g.drawImageAt (Image (this), 0, 0, false);\r
 \r
-        return ImagePixelData::Ptr (newImage.getPixelData());\r
+        return newImage.getPixelData();\r
     }\r
 \r
     void initialiseBitmapData (Image::BitmapData& bitmapData, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
@@ -193,7 +193,7 @@ ImagePixelData::Ptr OpenGLImageType::create (Image::PixelFormat, int width, int
         return ImagePixelData::Ptr();\r
 \r
     im->frameBuffer.clear (Colours::transparentBlack);\r
-    return *im.release();\r
+    return im.release();\r
 }\r
 \r
 OpenGLFrameBuffer* OpenGLImageType::getFrameBufferFrom (const Image& image)\r
index 0ae83d73876e3a86c4c066c07ad3e7c1decf4f00..9b077eb7f52584c71fb116e17fd99858970fdf55 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_osc\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE OSC classes\r
   description:      Open Sound Control implementation.\r
   website:          http://www.juce.com/juce\r
index 39bfc8126deebd3c93be512df32263ad75f1a464..9af4bd27abc633d12d38b70a2e2f633a0706ac7d 100644 (file)
@@ -97,7 +97,7 @@ namespace
             if (pattern == patternEnd)\r
                 return false;\r
 \r
-            // Note: In case this code is ever moved into the more generic CharPointerFunctions,\r
+            // Note: in case this code is ever moved into the more generic CharPointerFunctions,\r
             // the next two lines probably will not compile as soon as this class is used with a\r
             // Char template type parameter that is not the same type as String::Char.\r
             StringArray set;\r
@@ -486,7 +486,7 @@ public:
             expectDoesNotThrow (OSCAddressPattern ("/[a-e]"));\r
             expectDoesNotThrow (OSCAddressPattern ("/foo/[a-z]x{foo,bar}/*BAZ42/"));\r
 \r
-            /* Note: If malformed expressions are used, e.g. "bracenotclosed{" or "{a-e}" or "[-foo]",\r
+            /* Note: if malformed expressions are used, e.g. "bracenotclosed{" or "{a-e}" or "[-foo]",\r
                this should not throw at construction time. Instead it should simply fail any pattern match later.\r
                So there is no need to test for those.\r
                The reason is that we do not actually parse the expressions now, but only during matching.\r
@@ -517,7 +517,7 @@ public:
 \r
         beginTest ("basic string matching");\r
         {\r
-            /* Note: The actual expression matching is tested in OSCPatternMatcher, so here we just\r
+            /* Note: the actual expression matching is tested in OSCPatternMatcher, so here we just\r
                do some basic tests and check if the matching works with multi-part addresses.\r
              */\r
             {\r
index 542bf938297dc15d60564ee586137805fb6343e6..ccddcffc02be4c71f416cd971f6d00024d6227e6 100644 (file)
@@ -70,7 +70,7 @@ public:
     bool operator!= (const OSCAddress& other) const noexcept;\r
 \r
     /** Converts the OSCAddress to a String.\r
-        Note: Trailing slashes are always removed automatically.\r
+        Note: trailing slashes are always removed automatically.\r
 \r
         @returns a String object that represents the OSC address.\r
     */\r
@@ -137,7 +137,7 @@ public:
     bool containsWildcards() const noexcept     { return wasInitialisedWithWildcards; }\r
 \r
     /** Converts the OSCAddressPattern to a String.\r
-        Note: Trailing slashes are always removed automatically.\r
+        Note: trailing slashes are always removed automatically.\r
 \r
         @returns a String object that represents the OSC address pattern.\r
     */\r
index 4d968354f11fa8e89214559af79fa4f6ff6b6c2b..6dabbf277dbb5843086b38720e8d6bbae3d5ab25 100644 (file)
 namespace juce\r
 {\r
 \r
-OSCArgument::OSCArgument (int32 v)              : type (OSCTypes::int32),   intValue (v) {}\r
-OSCArgument::OSCArgument (float v)              : type (OSCTypes::float32), floatValue (v) {}\r
-OSCArgument::OSCArgument (const String& s)      : type (OSCTypes::string),  stringValue (s) {}\r
-OSCArgument::OSCArgument (MemoryBlock b)        : type (OSCTypes::blob),    blob (static_cast<MemoryBlock&&> (b)) {}\r
-OSCArgument::OSCArgument (OSCColour c)          : type (OSCTypes::colour),  intValue ((int32) c.toInt32()) {}\r
+OSCArgument::OSCArgument (int32 value) noexcept\r
+    : type (OSCTypes::int32), intValue (value)\r
+{\r
+}\r
+\r
+OSCArgument::OSCArgument (float value) noexcept\r
+    : type (OSCTypes::float32), floatValue (value)\r
+{\r
+}\r
+\r
+OSCArgument::OSCArgument (const String& value) noexcept\r
+    : type (OSCTypes::string), stringValue (value)\r
+{\r
+}\r
+\r
+OSCArgument::OSCArgument (const MemoryBlock& b)\r
+    : type (OSCTypes::blob), blob (b)\r
+{\r
+}\r
 \r
 //==============================================================================\r
 String OSCArgument::getString() const noexcept\r
@@ -69,14 +83,6 @@ const MemoryBlock& OSCArgument::getBlob() const noexcept
     return blob;\r
 }\r
 \r
-OSCColour OSCArgument::getColour() const noexcept\r
-{\r
-    if (isColour())\r
-        return OSCColour::fromInt32 ((uint32) intValue);\r
-\r
-    jassertfalse; // you must check the type of an argument before attempting to get its value!\r
-    return { 0, 0, 0, 0 };\r
-}\r
 \r
 //==============================================================================\r
 //==============================================================================\r
@@ -114,11 +120,11 @@ public:
             OSCArgument arg (value);\r
 \r
             expect (arg.getType() == OSCTypes::int32);\r
+\r
             expect (arg.isInt32());\r
             expect (! arg.isFloat32());\r
             expect (! arg.isString());\r
             expect (! arg.isBlob());\r
-            expect (! arg.isColour());\r
 \r
             expect (arg.getInt32() == value);\r
         }\r
@@ -130,13 +136,15 @@ public:
             OSCArgument arg (value);\r
 \r
             expect (arg.getType() == OSCTypes::float32);\r
+\r
             expect (! arg.isInt32());\r
             expect (arg.isFloat32());\r
             expect (! arg.isString());\r
             expect (! arg.isBlob());\r
-            expect (! arg.isColour());\r
 \r
             expect (arg.getFloat32() == value);\r
+\r
+\r
         }\r
 \r
         beginTest ("String");\r
@@ -145,11 +153,11 @@ public:
             OSCArgument arg (value);\r
 \r
             expect (arg.getType() == OSCTypes::string);\r
+\r
             expect (! arg.isInt32());\r
             expect (! arg.isFloat32());\r
             expect (arg.isString());\r
             expect (! arg.isBlob());\r
-            expect (! arg.isColour());\r
 \r
             expect (arg.getString() == value);\r
         }\r
@@ -159,54 +167,32 @@ public:
             OSCArgument arg ("Hello, World!");\r
 \r
             expect (arg.getType() == OSCTypes::string);\r
+\r
             expect (! arg.isInt32());\r
             expect (! arg.isFloat32());\r
             expect (arg.isString());\r
             expect (! arg.isBlob());\r
-            expect (! arg.isColour());\r
 \r
-            expect (arg.getString() == "Hello, World!");\r
+            expect (arg.getString() == String ("Hello, World!"));\r
         }\r
 \r
         beginTest ("Blob");\r
         {\r
-            auto blob = getMemoryBlockWithRandomData (413);\r
+            const size_t numBytes = 412;\r
+            MemoryBlock blob = getMemoryBlockWithRandomData (numBytes);\r
+\r
             OSCArgument arg (blob);\r
 \r
             expect (arg.getType() == OSCTypes::blob);\r
+\r
             expect (! arg.isInt32());\r
             expect (! arg.isFloat32());\r
             expect (! arg.isString());\r
             expect (arg.isBlob());\r
-            expect (! arg.isColour());\r
 \r
             expect (arg.getBlob() == blob);\r
         }\r
 \r
-        beginTest ("Colour");\r
-        {\r
-            Random rng = getRandom();\r
-\r
-            for (int i = 100; --i >= 0;)\r
-            {\r
-                OSCColour col = { (uint8) rng.nextInt (256),\r
-                                  (uint8) rng.nextInt (256),\r
-                                  (uint8) rng.nextInt (256),\r
-                                  (uint8) rng.nextInt (256) };\r
-\r
-                OSCArgument arg (col);\r
-\r
-                expect (arg.getType() == OSCTypes::colour);\r
-                expect (! arg.isInt32());\r
-                expect (! arg.isFloat32());\r
-                expect (! arg.isString());\r
-                expect (! arg.isBlob());\r
-                expect (arg.isColour());\r
-\r
-                expect (arg.getColour().toInt32() == col.toInt32());\r
-            }\r
-        }\r
-\r
         beginTest ("Copy, move and assignment");\r
         {\r
             {\r
index 222054cdaf496ceff279be08bd5e5c93b2d29930..3cc649e671043a712778830a8eb3e622e9c1e66a 100644 (file)
@@ -42,13 +42,13 @@ class JUCE_API  OSCArgument
 {\r
 public:\r
     /** Constructs an OSCArgument with type int32 and a given value. */\r
-    OSCArgument (int32 value);\r
+    OSCArgument (int32 value) noexcept;\r
 \r
     /** Constructs an OSCArgument with type float32 and a given value. */\r
-    OSCArgument (float value);\r
+    OSCArgument (float value) noexcept;\r
 \r
     /** Constructs an OSCArgument with type string and a given value */\r
-    OSCArgument (const String& value);\r
+    OSCArgument (const String& value) noexcept;\r
 \r
     /** Constructs an OSCArgument with type blob and copies dataSize bytes\r
         from the memory pointed to by data into the blob.\r
@@ -56,10 +56,7 @@ public:
         The data owned by the blob will be released when the OSCArgument object\r
         gets destructed.\r
     */\r
-    OSCArgument (MemoryBlock blob);\r
-\r
-    /** Constructs an OSCArgument with type colour and a given colour value */\r
-    OSCArgument (OSCColour colour);\r
+    OSCArgument (const MemoryBlock& blob);\r
 \r
     /** Returns the type of the OSCArgument as an OSCType.\r
         OSCType is a char type, and its value will be the OSC type tag of the type.\r
@@ -69,44 +66,37 @@ public:
     /** Returns whether the type of the OSCArgument is int32. */\r
     bool isInt32() const noexcept           { return type == OSCTypes::int32; }\r
 \r
-    /** Returns whether the type of the OSCArgument is float. */\r
+    /** Returns whether the type of the OSCArgument is int32. */\r
     bool isFloat32() const noexcept         { return type == OSCTypes::float32; }\r
 \r
-    /** Returns whether the type of the OSCArgument is string. */\r
+    /** Returns whether the type of the OSCArgument is int32. */\r
     bool isString() const noexcept          { return type == OSCTypes::string; }\r
 \r
-    /** Returns whether the type of the OSCArgument is blob. */\r
+    /** Returns whether the type of the OSCArgument is int32. */\r
     bool isBlob() const noexcept            { return type == OSCTypes::blob; }\r
 \r
-    /** Returns whether the type of the OSCArgument is blob. */\r
-    bool isColour() const noexcept          { return type == OSCTypes::colour; }\r
-\r
     /** Returns the value of the OSCArgument as an int32.\r
         If the type of the OSCArgument is not int32, the behaviour is undefined.\r
-    */\r
+     */\r
     int32 getInt32() const noexcept;\r
 \r
     /** Returns the value of the OSCArgument as a float32.\r
         If the type of the OSCArgument is not float32, the behaviour is undefined.\r
-    */\r
+     */\r
     float getFloat32() const noexcept;\r
 \r
     /** Returns the value of the OSCArgument as a string.\r
         If the type of the OSCArgument is not string, the behaviour is undefined.\r
-    */\r
+     */\r
     String getString() const noexcept;\r
 \r
     /** Returns the binary data contained in the blob and owned by the OSCArgument,\r
         as a reference to a JUCE MemoryBlock object.\r
 \r
         If the type of the OSCArgument is not blob, the behaviour is undefined.\r
-    */\r
+     */\r
     const MemoryBlock& getBlob() const noexcept;\r
 \r
-    /** Returns the value of the OSCArgument as an OSCColour.\r
-        If the type of the OSCArgument is not a colour, the behaviour is undefined.\r
-    */\r
-    OSCColour getColour() const noexcept;\r
 \r
 private:\r
     //==============================================================================\r
index 44d77e9e9da7a138f23403899fae993d7909ec20..3a4481d9db910c0ca3e1ff11910d9c741df496cc 100644 (file)
@@ -82,8 +82,7 @@ void OSCMessage::clear()
 void OSCMessage::addInt32 (int32 value)             { arguments.add (OSCArgument (value)); }\r
 void OSCMessage::addFloat32 (float value)           { arguments.add (OSCArgument (value)); }\r
 void OSCMessage::addString (const String& value)    { arguments.add (OSCArgument (value)); }\r
-void OSCMessage::addBlob (MemoryBlock blob)         { arguments.add (OSCArgument (static_cast<MemoryBlock&&> (blob))); }\r
-void OSCMessage::addColour (OSCColour colour)       { arguments.add (OSCArgument (colour)); }\r
+void OSCMessage::addBlob (const MemoryBlock& blob)  { arguments.add (OSCArgument (blob)); }\r
 void OSCMessage::addArgument (OSCArgument arg)      { arguments.add (arg); }\r
 \r
 //==============================================================================\r
@@ -103,12 +102,11 @@ public:
             expectEquals (msg.size(), 0);\r
             expect (msg.getAddressPattern().toString() == "/test/param0");\r
 \r
-            const int numTestArgs = 5;\r
+            const int numTestArgs = 4;\r
 \r
             const int testInt = 42;\r
             const float testFloat = 3.14159f;\r
             const String testString = "Hello, World!";\r
-            const OSCColour testColour = { 10, 20, 150, 200 };\r
 \r
             const uint8 testBlobData[5] = { 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };\r
             const MemoryBlock testBlob (testBlobData,  sizeof (testBlobData));\r
@@ -117,7 +115,6 @@ public:
             msg.addFloat32 (testFloat);\r
             msg.addString (testString);\r
             msg.addBlob (testBlob);\r
-            msg.addColour (testColour);\r
 \r
             expectEquals (msg.size(), numTestArgs);\r
 \r
@@ -125,23 +122,20 @@ public:
             expectEquals (msg[1].getType(), OSCTypes::float32);\r
             expectEquals (msg[2].getType(), OSCTypes::string);\r
             expectEquals (msg[3].getType(), OSCTypes::blob);\r
-            expectEquals (msg[4].getType(), OSCTypes::colour);\r
 \r
             expect (msg[0].isInt32());\r
             expect (msg[1].isFloat32());\r
             expect (msg[2].isString());\r
             expect (msg[3].isBlob());\r
-            expect (msg[4].isColour());\r
 \r
             expectEquals (msg[0].getInt32(), testInt);\r
             expectEquals (msg[1].getFloat32(), testFloat);\r
             expectEquals (msg[2].getString(), testString);\r
             expect (msg[3].getBlob() == testBlob);\r
-            expect (msg[4].getColour().toInt32() == testColour.toInt32());\r
 \r
             expect (msg.begin() + numTestArgs == msg.end());\r
 \r
-            auto arg = msg.begin();\r
+            OSCArgument* arg = msg.begin();\r
             expect (arg->isInt32());\r
             expectEquals (arg->getInt32(), testInt);\r
             ++arg;\r
@@ -152,10 +146,7 @@ public:
             expectEquals (arg->getString(), testString);\r
             ++arg;\r
             expect (arg->isBlob());\r
-            expect (arg->getBlob() == testBlob);\r
-            ++arg;\r
-            expect (arg->isColour());\r
-            expect (arg->getColour().toInt32() == testColour.toInt32());\r
+            expect(arg->getBlob() == testBlob);\r
             ++arg;\r
             expect (arg == msg.end());\r
         }\r
index 7cbf99bc002673de3ad6400d74dbea93c00e12da..448c6724624c1e9de6061ce7f80f8b7873fc4299 100644 (file)
@@ -110,17 +110,17 @@ public:
     void clear();\r
 \r
     //==============================================================================\r
-    /** Creates a new OSCArgument of type int32 with the given value,\r
+    /** Creates a new OSCArgument of type int32 with a given value\r
         and adds it to the OSCMessage object.\r
     */\r
     void addInt32 (int32 value);\r
 \r
-    /** Creates a new OSCArgument of type float32 with the given value,\r
+    /** Creates a new OSCArgument of type float32 with a given value\r
         and adds it to the OSCMessage object.\r
     */\r
     void addFloat32 (float value);\r
 \r
-    /** Creates a new OSCArgument of type string with the given value,\r
+    /** Creates a new OSCArgument of type string with a given value\r
         and adds it to the OSCMessage object.\r
     */\r
     void addString (const String& value);\r
@@ -128,14 +128,9 @@ public:
     /** Creates a new OSCArgument of type blob with binary data content copied from\r
         the given MemoryBlock.\r
 \r
-        Note: If the argument passed is an lvalue, this may copy the binary data.\r
+        Note: if the argument passed is an lvalue, this may copy the binary data.\r
     */\r
-    void addBlob (MemoryBlock blob);\r
-\r
-    /** Creates a new OSCArgument of type colour with the given value,\r
-        and adds it to the OSCMessage object.\r
-    */\r
-    void addColour (OSCColour colour);\r
+    void addBlob (const MemoryBlock& blob);\r
 \r
     /** Adds the OSCArgument argument to the OSCMessage object.\r
 \r
index bebd32ec4dedbd12084ab5bc107e263c953d85f2..c52ae4805d60ec0273c0987d6b058c41d97f9347 100644 (file)
@@ -37,7 +37,7 @@ namespace
         This class is implementing the Open Sound Control 1.0 Specification for\r
         interpreting the data.\r
 \r
-        Note: Some older implementations of OSC may omit the OSC Type Tag string\r
+        Note: some older implementations of OSC may omit the OSC Type Tag string\r
         in OSC messages. This class will treat such OSC messages as format errors.\r
     */\r
     class OSCInputStream\r
@@ -60,7 +60,7 @@ namespace
         size_t getDataSize() const noexcept         { return input.getDataSize(); }\r
 \r
         /** Returns the current position of the stream. */\r
-        uint64 getPosition()                        { return (uint64) input.getPosition(); }\r
+        uint64 getPosition()                        { return uint64 (input.getPosition()); }\r
 \r
         /** Attempts to set the current position of the stream. Returns true if this was successful. */\r
         bool setPosition (int64 pos)                { return input.setPosition (pos); }\r
@@ -74,25 +74,32 @@ namespace
         //==============================================================================\r
         int32 readInt32()\r
         {\r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading int32");\r
+            if (input.getNumBytesRemaining() < 4)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading int32");\r
+\r
             return input.readIntBigEndian();\r
         }\r
 \r
         uint64 readUint64()\r
         {\r
-            checkBytesAvailable (8, "OSC input stream exhausted while reading uint64");\r
+            if (input.getNumBytesRemaining() < 8)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading uint64");\r
+\r
             return (uint64) input.readInt64BigEndian();\r
         }\r
 \r
         float readFloat32()\r
         {\r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading float");\r
+            if (input.getNumBytesRemaining() < 4)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading float");\r
+\r
             return input.readFloatBigEndian();\r
         }\r
 \r
         String readString()\r
         {\r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading string");\r
+            if (input.getNumBytesRemaining() < 4)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading string");\r
 \r
             auto posBegin = (size_t) getPosition();\r
             auto s = input.readString();\r
@@ -109,27 +116,27 @@ namespace
 \r
         MemoryBlock readBlob()\r
         {\r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading blob");\r
+            if (input.getNumBytesRemaining() < 4)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading blob");\r
+\r
+            auto blobDataSize = (size_t) input.readIntBigEndian();\r
 \r
-            auto blobDataSize = input.readIntBigEndian();\r
-            checkBytesAvailable ((blobDataSize + 3) % 4, "OSC input stream exhausted before reaching end of blob");\r
+            if ((size_t) input.getNumBytesRemaining() < (blobDataSize + 3) % 4)\r
+                throw OSCFormatError ("OSC input stream exhausted before reaching end of blob");\r
 \r
             MemoryBlock blob;\r
+\r
             auto bytesRead = input.readIntoMemoryBlock (blob, (ssize_t) blobDataSize);\r
             readPaddingZeros (bytesRead);\r
 \r
             return blob;\r
         }\r
 \r
-        OSCColour readColour()\r
-        {\r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading colour");\r
-            return OSCColour::fromInt32 ((uint32) input.readIntBigEndian());\r
-        }\r
-\r
         OSCTimeTag readTimeTag()\r
         {\r
-            checkBytesAvailable (8, "OSC input stream exhausted while reading time tag");\r
+            if (input.getNumBytesRemaining() < 8)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading time tag");\r
+\r
             return OSCTimeTag (uint64 (input.readInt64BigEndian()));\r
         }\r
 \r
@@ -148,7 +155,8 @@ namespace
         {\r
             OSCTypeList typeList;\r
 \r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading type tag string");\r
+            if (input.getNumBytesRemaining() < 4)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading type tag string");\r
 \r
             if (input.readByte() != ',')\r
                 throw OSCFormatError ("OSC input stream format error: expected type tag string");\r
@@ -184,7 +192,6 @@ namespace
                 case OSCTypes::float32:     return OSCArgument (readFloat32());\r
                 case OSCTypes::string:      return OSCArgument (readString());\r
                 case OSCTypes::blob:        return OSCArgument (readBlob());\r
-                case OSCTypes::colour:      return OSCArgument (readColour());\r
 \r
                 default:\r
                     // You supplied an invalid OSCType when calling readArgument! This should never happen.\r
@@ -214,7 +221,8 @@ namespace
             // bundle, so we know when to consider the next element *not* part of this\r
             // bundle anymore (but part of the outer bundle) and return.\r
 \r
-            checkBytesAvailable (16, "OSC input stream exhausted while reading bundle");\r
+            if (input.getNumBytesRemaining() < 16)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading bundle");\r
 \r
             if (readString() != "#bundle")\r
                 throw OSCFormatError ("OSC input stream format error: bundle does not start with string '#bundle'");\r
@@ -239,7 +247,8 @@ namespace
         //==============================================================================\r
         OSCBundle::Element readElement()\r
         {\r
-            checkBytesAvailable (4, "OSC input stream exhausted while reading bundle element size");\r
+            if (input.getNumBytesRemaining() < 4)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading bundle element size");\r
 \r
             auto elementSize = (size_t) readInt32();\r
 \r
@@ -252,7 +261,8 @@ namespace
         //==============================================================================\r
         OSCBundle::Element readElementWithKnownSize (size_t elementSize)\r
         {\r
-            checkBytesAvailable ((int64) elementSize, "OSC input stream exhausted while reading bundle element content");\r
+            if ((uint64) input.getNumBytesRemaining() < elementSize)\r
+                throw OSCFormatError ("OSC input stream exhausted while reading bundle element content");\r
 \r
             auto firstContentChar = static_cast<const char*> (getData()) [getPosition()];\r
 \r
@@ -295,19 +305,13 @@ namespace
         OSCMessage readMessageWithCheckedSize (size_t size)\r
         {\r
             auto begin = (size_t) getPosition();\r
-            auto message = readMessage();\r
+            OSCMessage message (readMessage());\r
 \r
             if (getPosition() - begin != size)\r
                 throw OSCFormatError ("OSC input stream format error: wrong element content size encountered while reading");\r
 \r
             return message;\r
         }\r
-\r
-        void checkBytesAvailable (int64 requiredBytes, const char* message)\r
-        {\r
-            if (input.getNumBytesRemaining() < requiredBytes)\r
-                throw OSCFormatError (message);\r
-        }\r
     };\r
 \r
 } // namespace\r
@@ -317,7 +321,7 @@ namespace
 struct OSCReceiver::Pimpl   : private Thread,\r
                               private MessageListener\r
 {\r
-    Pimpl (const String& oscThreadName)  : Thread (oscThreadName)\r
+    Pimpl (const String& threadName)  : Thread (threadName)\r
     {\r
     }\r
 \r
@@ -363,7 +367,6 @@ struct OSCReceiver::Pimpl   : private Thread,
             waitForThreadToExit (10000);\r
             socket.reset();\r
         }\r
-\r
         return true;\r
     }\r
 \r
@@ -439,7 +442,7 @@ struct OSCReceiver::Pimpl   : private Thread,
             if (listeners.size() > 0 || listenersWithAddress.size() > 0)\r
                 postMessage (new CallbackMessage (content));\r
         }\r
-        catch (const OSCFormatError&)\r
+        catch (OSCFormatError)\r
         {\r
             if (formatErrorHandler != nullptr)\r
                 formatErrorHandler (data, (int) dataSize);\r
@@ -459,15 +462,12 @@ private:
         while (! threadShouldExit())\r
         {\r
             jassert (socket != nullptr);\r
-            auto ready = socket->waitUntilReady (true, 100);\r
+            char buffer[oscBufferSize];\r
+            socket->waitUntilReady (true, -1);\r
 \r
-            if (ready < 0 || threadShouldExit())\r
+            if (threadShouldExit())\r
                 return;\r
 \r
-            if (ready == 0)\r
-                continue;\r
-\r
-            char buffer[oscBufferSize];\r
             auto bytesRead = (size_t) socket->read (buffer, (int) sizeof (buffer), false);\r
 \r
             if (bytesRead >= 4)\r
@@ -884,7 +884,7 @@ public:
 \r
                 OSCInputStream inStream (data, sizeof (data));\r
 \r
-                auto msg = inStream.readMessage();\r
+                OSCMessage msg = inStream.readMessage();\r
                 expect (msg.getAddressPattern().toString() == "/test");\r
                 expect (msg.size() == 0);\r
             }\r
@@ -958,7 +958,7 @@ public:
 \r
                 OSCInputStream inStream (data, sizeof (data));\r
 \r
-                auto msg = inStream.readMessage();\r
+                OSCMessage msg = inStream.readMessage();\r
 \r
                 expectEquals (msg.getAddressPattern().toString(), String ("/test"));\r
                 expectEquals (msg.size(), 4);\r
index 3cae53967e28197061d7b0123c8cc3a0e553e771..4aa29ebb0c57e5be153d6f33f6e0f5a4b4d86831 100644 (file)
@@ -140,7 +140,7 @@ public:
         and has to be either MessageLoopCallback or RealtimeCallback. If not specified,\r
         MessageLoopCallback will be used by default.\r
 \r
-        Note: This type of listener will ignore OSC bundles.\r
+        Note: this type of listener will ignore OSC bundles.\r
 \r
         @see OSCReceiver::addListener, OSCReceiver::Listener,\r
              OSCReceiver::MessageLoopCallback, OSCReceiver::RealtimeCallback\r
@@ -216,6 +216,8 @@ public:
 private:\r
     //==============================================================================\r
     struct Pimpl;\r
+    friend struct Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
     friend struct OSCReceiverCallbackMessage;\r
 \r
index 6b76d191acc91324a3aecb0412b04a0144fb1143..29976af9c2e8ef4ed8f36980215b27c752754fda 100644 (file)
@@ -85,11 +85,6 @@ namespace
             return output.writeRepeatedByte (0, numPaddingZeros);\r
         }\r
 \r
-        bool writeColour (OSCColour colour)\r
-        {\r
-            return output.writeIntBigEndian ((int32) colour.toInt32());\r
-        }\r
-\r
         bool writeTimeTag (OSCTimeTag timeTag)\r
         {\r
             return output.writeInt64BigEndian (int64 (timeTag.getRawTimeTag()));\r
@@ -128,7 +123,6 @@ namespace
                 case OSCTypes::float32:     return writeFloat32 (arg.getFloat32());\r
                 case OSCTypes::string:      return writeString (arg.getString());\r
                 case OSCTypes::blob:        return writeBlob (arg.getBlob());\r
-                case OSCTypes::colour:      return writeColour (arg.getColour());\r
 \r
                 default:\r
                     // In this very unlikely case you supplied an invalid OSCType!\r
index b9d04cc2d97f5998667c7b94e8f57cfcfe617c2d..2024a5c35d5aa55ffdaf28a39dec6d3eb4094b8f 100644 (file)
@@ -50,7 +50,7 @@ public:
     /** Connects to a datagram socket and prepares the socket for sending OSC\r
         packets to the specified target.\r
 \r
-        Note: The operating system will choose which specific network adapter(s)\r
+        Note: the operating system will choose which specific network adapter(s)\r
         to bind your socket to, and which local port to use for the sender.\r
 \r
         @param  targetHostName   The remote host to which messages will be send.\r
@@ -141,6 +141,8 @@ public:
 private:\r
     //==============================================================================\r
     struct Pimpl;\r
+    friend struct Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSCSender)\r
index 2a74f15ee5dc350f3de0ee459a5e4af25a24e9ee..a78f21e28e2c8b9759e47abb5d05b39bebb4bfbd 100644 (file)
 \r
 namespace juce\r
 {\r
-\r
-const OSCType OSCTypes::int32   = 'i';\r
-const OSCType OSCTypes::float32 = 'f';\r
-const OSCType OSCTypes::string  = 's';\r
-const OSCType OSCTypes::blob    = 'b';\r
-const OSCType OSCTypes::colour  = 'r';\r
-\r
-uint32 OSCColour::toInt32() const\r
-{\r
-    return ByteOrder::makeInt (alpha, blue, green, red);\r
+    const OSCType OSCTypes::int32   = 'i';\r
+    const OSCType OSCTypes::float32 = 'f';\r
+    const OSCType OSCTypes::string  = 's';\r
+    const OSCType OSCTypes::blob    = 'b';\r
 }\r
-\r
-OSCColour OSCColour::fromInt32 (uint32 c)\r
-{\r
-    return { (uint8) (c >> 24),\r
-             (uint8) (c >> 16),\r
-             (uint8) (c >> 8),\r
-             (uint8) c };\r
-}\r
-\r
-} // namespace juce\r
index 2b76741013241fb84da5438c000b63ef6784a2bf..3f657a8deb6bb7d959403b21f4b3a5fa032b5bac 100644 (file)
@@ -28,18 +28,20 @@ namespace juce
 {\r
 \r
 //==============================================================================\r
+\r
 /** The type used for OSC type tags. */\r
-using OSCType = char;\r
+typedef char OSCType;\r
 \r
 \r
 /** The type used for OSC type tag strings. */\r
-using OSCTypeList = Array<OSCType>;\r
+typedef Array<OSCType> OSCTypeList;\r
 \r
 //==============================================================================\r
+\r
 /** The definitions of supported OSC types and their associated OSC type tags,\r
     as defined in the OpenSoundControl 1.0 specification.\r
 \r
-    Note: This implementation does not support any additional type tags that\r
+    Note: this implementation does not support any additional type tags that\r
     are not part of the specification.\r
 \r
     @tags{OSC}\r
@@ -51,34 +53,16 @@ public:
     static const OSCType float32;\r
     static const OSCType string;\r
     static const OSCType blob;\r
-    static const OSCType colour;\r
 \r
     static bool isSupportedType (OSCType type) noexcept\r
     {\r
         return type == OSCTypes::int32\r
             || type == OSCTypes::float32\r
             || type == OSCTypes::string\r
-            || type == OSCTypes::blob\r
-            || type == OSCTypes::colour;\r
+            || type == OSCTypes::blob;\r
     }\r
 };\r
 \r
-\r
-//==============================================================================\r
-/**\r
-    Holds a 32-bit RGBA colour for passing to and from an OSCArgument.\r
-    @see OSCArgument, OSCTypes::colour\r
-    @tags{OSC}\r
-*/\r
-struct OSCColour\r
-{\r
-    uint8 red, green, blue, alpha;\r
-\r
-    uint32 toInt32() const;\r
-    static OSCColour fromInt32 (uint32);\r
-};\r
-\r
-\r
 //==============================================================================\r
 /** Base class for exceptions that can be thrown by methods in the OSC module.\r
 \r
@@ -111,7 +95,7 @@ struct OSCFormatError : public OSCException
 //==============================================================================\r
 /** Exception type thrown in cases of unexpected errors in the OSC module.\r
 \r
-    Note: This should never happen, and all the places where this is thrown\r
+    Note: this should never happen, and all the places where this is thrown\r
     should have a preceding jassertfalse to facilitate debugging.\r
 \r
     @tags{OSC}\r
index e2bd100c2f5d4a9fe77fa73949884a2da2ae6269..74caf51da4cb191a96fcee533cee912d38e2626e 100644 (file)
@@ -142,7 +142,7 @@ public:
 \r
             InAppPurchases class will own downloads and will delete them as soon as they are finished.\r
 \r
-            NOTE: It is possible to receive this callback for the same purchase multiple times. If that happens,\r
+            NOTE: it is possible to receive this callback for the same purchase multiple times. If that happens,\r
             only the newest set of downloads and the newest orderId will be valid, the old ones should be not used anymore!\r
         */\r
         virtual void productPurchaseFinished (const PurchaseInfo&, bool /*success*/, const String& /*statusDescription*/) {}\r
@@ -150,7 +150,7 @@ public:
         /** Called when a list of all purchases is restored. This can be used to figure out to\r
             which products a user is entitled to.\r
 \r
-            NOTE: It is possible to receive this callback for the same purchase multiple times. If that happens,\r
+            NOTE: it is possible to receive this callback for the same purchase multiple times. If that happens,\r
             only the newest set of downloads and the newest orderId will be valid, the old ones should be not used anymore!\r
         */\r
         virtual void purchasesListRestored (const Array<PurchaseInfo>&, bool /*success*/, const String& /*statusDescription*/) {}\r
@@ -218,7 +218,7 @@ public:
     /** Asynchronously asks about a list of products that a user has already bought. Upon completion, Listener::purchasesListReceived()\r
         callback will be invoked. The user may be prompted to login first.\r
 \r
-        @param includeDownloadInfo      (iOS only) if true, then after restoration is successful, the downloads array passed to\r
+        @param includeDownloadInfo      (iOS only) if true, then after restoration is successfull, the downloads array passed to\r
                                         Listener::purchasesListReceived() callback will contain all the download objects corresponding with\r
                                         the purchase. In the opposite case, the downloads array will be empty.\r
 \r
index 08cdf7fb13a4ef31baf5e62dbae3e119b187ca2a..0900654e5b627cc78c6ae4bf4556f1c22cb4fbbb 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:               juce_product_unlocking\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE Online marketplace support\r
   description:      Classes for online product authentication\r
   website:          http://www.juce.com/juce\r
index 2ba9c6f7f57b2883295f55a6e135fee982577780..4e02a1d09ca4ae5d9444cfbdac2153bacf67e858 100644 (file)
@@ -219,9 +219,9 @@ void OnlineUnlockForm::resized()
 \r
     const int buttonHeight = 22;\r
 \r
-    auto r = getLocalBounds().reduced (10, 20);\r
+    Rectangle<int> r (getLocalBounds().reduced (10, 20));\r
 \r
-    auto buttonArea = r.removeFromBottom (buttonHeight);\r
+    Rectangle<int> buttonArea (r.removeFromBottom (buttonHeight));\r
     registerButton.changeWidthToFitText (buttonHeight);\r
     cancelButton.changeWidthToFitText (buttonHeight);\r
 \r
index 891499a5186b811be7282e9bff6092c922bbef52..964223fa47585a14a4493298794dc4c7104e35c3 100644 (file)
@@ -27,7 +27,7 @@
 namespace juce\r
 {\r
 \r
-/* Note: There's a bit of light obfuscation in this code, just to make things\r
+/* Note: there's a bit of light obfuscation in this code, just to make things\r
    a bit more annoying for crackers who try to reverse-engineer your binaries, but\r
    nothing particularly foolproof.\r
 */\r
@@ -120,10 +120,10 @@ struct KeyFileUtils
         {\r
             key.applyToValue (val);\r
 \r
-            auto mb = val.toMemoryBlock();\r
+            const MemoryBlock mb (val.toMemoryBlock());\r
 \r
             if (CharPointer_UTF8::isValidString (static_cast<const char*> (mb.getData()), (int) mb.getSize()))\r
-                xml = parseXML (mb.toString());\r
+                xml.reset (XmlDocument::parse (mb.toString()));\r
         }\r
 \r
         return xml != nullptr ? *xml : XmlElement("key");\r
@@ -195,7 +195,7 @@ static var machineNumberAllowed (StringArray numbersFromKeyFile,
 \r
     for (int i = 0; i < localMachineNumbers.size(); ++i)\r
     {\r
-        auto localNumber = localMachineNumbers[i].trim();\r
+        String localNumber (localMachineNumbers[i].trim());\r
 \r
         if (localNumber.isNotEmpty())\r
         {\r
@@ -207,9 +207,6 @@ static var machineNumberAllowed (StringArray numbersFromKeyFile,
                 if (result)\r
                     break;\r
             }\r
-\r
-            if (result)\r
-                break;\r
         }\r
     }\r
 \r
@@ -290,7 +287,7 @@ char OnlineUnlockStatus::MachineIDUtilities::getPlatformPrefix()
 \r
 String OnlineUnlockStatus::MachineIDUtilities::getEncodedIDString (const String& input)\r
 {\r
-    auto platform = String::charToString (static_cast<juce_wchar> (getPlatformPrefix()));\r
+    const String platform (String::charToString (static_cast<juce_wchar> (getPlatformPrefix())));\r
 \r
     return platform + MD5 ((input + "salt_1" + platform).toUTF8())\r
                         .toHexString().substring (0, 9).toUpperCase();\r
@@ -298,7 +295,7 @@ String OnlineUnlockStatus::MachineIDUtilities::getEncodedIDString (const String&
 \r
 bool OnlineUnlockStatus::MachineIDUtilities::addFileIDToList (StringArray& ids, const File& f)\r
 {\r
-    if (auto num = f.getFileIdentifier())\r
+    if (uint64 num = f.getFileIdentifier())\r
     {\r
         ids.add (getEncodedIDString (String::toHexString ((int64) num)));\r
         return true;\r
@@ -309,14 +306,16 @@ bool OnlineUnlockStatus::MachineIDUtilities::addFileIDToList (StringArray& ids,
 \r
 void OnlineUnlockStatus::MachineIDUtilities::addMACAddressesToList (StringArray& ids)\r
 {\r
-    for (auto& address : MACAddress::getAllAddresses())\r
-        ids.add (getEncodedIDString (address.toString()));\r
+    Array<MACAddress> addresses;\r
+    MACAddress::findAllAddresses (addresses);\r
+\r
+    for (int i = 0; i < addresses.size(); ++i)\r
+        ids.add (getEncodedIDString (addresses.getReference(i).toString()));\r
 }\r
 \r
 StringArray OnlineUnlockStatus::MachineIDUtilities::getLocalMachineIDs()\r
 {\r
     auto identifiers = SystemStats::getDeviceIdentifiers();\r
-\r
     for (auto& identifier : identifiers)\r
         identifier = getEncodedIDString (identifier);\r
 \r
@@ -399,7 +398,7 @@ OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::handleXmlReply (XmlElement
 {\r
     UnlockResult r;\r
 \r
-    if (auto keyNode = xml.getChildByName ("KEY"))\r
+    if (const XmlElement* keyNode = xml.getChildByName ("KEY"))\r
     {\r
         const String keyText (keyNode->getAllSubText().trim());\r
         r.succeeded = keyText.length() > 10 && applyKeyFile (keyText);\r
@@ -419,7 +418,8 @@ OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::handleXmlReply (XmlElement
         r.urlToLaunch = xml.getStringAttribute ("url").trim();\r
 \r
     if (r.errorMessage.isEmpty() && r.informativeMessage.isEmpty() && r.urlToLaunch.isEmpty() && ! r.succeeded)\r
-        r.errorMessage = getMessageForUnexpectedReply();\r
+        r.errorMessage = TRANS ("Unexpected or corrupted reply from XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n"\r
+                            + TRANS("Please try again in a few minutes, and contact us for support if this message appears again.");\r
 \r
     return r;\r
 }\r
@@ -428,31 +428,20 @@ OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::handleFailedConnection()
 {\r
     UnlockResult r;\r
     r.succeeded = false;\r
-    r.errorMessage = getMessageForConnectionFailure (areMajorWebsitesAvailable());\r
-    return r;\r
-}\r
 \r
-String OnlineUnlockStatus::getMessageForConnectionFailure (bool isInternetConnectionWorking)\r
-{\r
-    String message = TRANS("Couldn't connect to XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n";\r
+    r.errorMessage = TRANS("Couldn't connect to XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n";\r
 \r
-    if (isInternetConnectionWorking)\r
-        message << TRANS("Your internet connection seems to be OK, but our webserver "\r
-                         "didn't respond... This is most likely a temporary problem, so try "\r
-                         "again in a few minutes, but if it persists, please contact us for support!");\r
+    if (areMajorWebsitesAvailable())\r
+        r.errorMessage << TRANS("Your internet connection seems to be OK, but our webserver "\r
+                                "didn't respond... This is most likely a temporary problem, so try "\r
+                                "again in a few minutes, but if it persists, please contact us for support!");\r
     else\r
-        message << TRANS("No internet sites seem to be accessible from your computer.. Before trying again, "\r
-                         "please check that your network is working correctly, and make sure "\r
-                         "that any firewall/security software installed on your machine isn't "\r
-                         "blocking your web connection.");\r
+        r.errorMessage << TRANS("No internet sites seem to be accessible from your computer.. Before trying again, "\r
+                                "please check that your network is working correctly, and make sure "\r
+                                "that any firewall/security software installed on your machine isn't "\r
+                                "blocking your web connection.");\r
 \r
-    return message;\r
-}\r
-\r
-String OnlineUnlockStatus::getMessageForUnexpectedReply()\r
-{\r
-    return TRANS ("Unexpected or corrupted reply from XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n"\r
-                    + TRANS("Please try again in a few minutes, and contact us for support if this message appears again.");\r
+    return r;\r
 }\r
 \r
 OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::attemptWebserverUnlock (const String& email,\r
@@ -461,11 +450,13 @@ OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::attemptWebserverUnlock (con
     // This method will block while it contacts the server, so you must run it on a background thread!\r
     jassert (! MessageManager::getInstance()->isThisTheMessageThread());\r
 \r
-    auto reply = readReplyFromWebserver (email, password);\r
+    String reply (readReplyFromWebserver (email, password));\r
 \r
     DBG ("Reply from server: " << reply);\r
 \r
-    if (auto xml = parseXML (reply))\r
+    std::unique_ptr<XmlElement> xml (XmlDocument::parse (reply));\r
+\r
+    if (xml != nullptr)\r
         return handleXmlReply (*xml);\r
 \r
     return handleFailedConnection();\r
@@ -480,8 +471,8 @@ String KeyGeneration::generateKeyFile (const String& appName,
                                        const String& machineNumbers,\r
                                        const RSAKey& privateKey)\r
 {\r
-    auto xml = KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "mach");\r
-    auto comment = KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers);\r
+    XmlElement xml (KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "mach"));\r
+    const String comment (KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers));\r
 \r
     return KeyFileUtils::createKeyFile (comment, xml, privateKey);\r
 }\r
@@ -493,10 +484,10 @@ String KeyGeneration::generateExpiringKeyFile (const String& appName,
                                                const Time expiryTime,\r
                                                const RSAKey& privateKey)\r
 {\r
-    auto xml = KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "expiring_mach");\r
+    XmlElement xml (KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "expiring_mach"));\r
     xml.setAttribute ("expiryTime", String::toHexString (expiryTime.toMilliseconds()));\r
 \r
-    auto comment = KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers);\r
+    String comment (KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers));\r
     comment << newLine << "Expires: " << expiryTime.toString (true, true);\r
 \r
     return KeyFileUtils::createKeyFile (comment, xml, privateKey);\r
index 702df5a12d4299628ce7ec00e376f33b092f0b4d..f82c69bf6488a0bfc8775334b4cb5d34c979afd7 100644 (file)
@@ -127,9 +127,6 @@ public:
     */\r
     virtual void userCancelled();\r
 \r
-    virtual String getMessageForConnectionFailure (bool isInternetConnectionWorking);\r
-    virtual String getMessageForUnexpectedReply();\r
-\r
     //==============================================================================\r
     // The following methods can be called by your app:\r
 \r
index 702a80321f248764d6854fa5424bdc237d51b360..7e6e585b0218f56d26ddbe46b12061047111eb3f 100644 (file)
@@ -92,7 +92,7 @@ String TracktionMarketplaceStatus::readReplyFromWebserver (const String& email,
         if (thread->threadShouldExit() || stream->isError() || (contentLength > 0 && downloaded < contentLength))\r
             return {};\r
 \r
-        return { CharPointer_UTF8 (buffer.get()), static_cast<size_t> (downloaded) };\r
+        return { CharPointer_UTF8 (buffer.get()) };\r
     }\r
 \r
     return {};\r
index 96ebbac9adb8050707e3105329ba2d5976264137..ef1595df8737f104ec29c600a297e1582ef9aa44 100644 (file)
@@ -36,13 +36,13 @@ namespace juce
     METHOD (consumePurchase,         "consumePurchase",         "(ILjava/lang/String;Ljava/lang/String;)I") \\r
     METHOD (getPurchaseHistory,      "getPurchaseHistory",      "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;")\r
 \r
-DECLARE_JNI_CLASS (IInAppBillingService, "com/android/vending/billing/IInAppBillingService")\r
+DECLARE_JNI_CLASS (IInAppBillingService, "com/android/vending/billing/IInAppBillingService");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
     STATICMETHOD (asInterface,      "asInterface",      "(Landroid/os/IBinder;)Lcom/android/vending/billing/IInAppBillingService;") \\r
 \r
-DECLARE_JNI_CLASS (IInAppBillingServiceStub, "com/android/vending/billing/IInAppBillingService$Stub")\r
+DECLARE_JNI_CLASS (IInAppBillingServiceStub, "com/android/vending/billing/IInAppBillingService$Stub");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
@@ -130,12 +130,12 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
         auto* env = getEnv();\r
 \r
         auto responseCodeString = javaString ("RESPONSE_CODE");\r
-        auto responseCode = env->CallIntMethod (buyIntentBundle.get(), AndroidBundle.getInt, responseCodeString.get());\r
+        auto responseCode = env->CallIntMethod (buyIntentBundle.get(), JavaBundle.getInt, responseCodeString.get());\r
 \r
         if (responseCode == 0)\r
         {\r
             auto buyIntentString = javaString ("BUY_INTENT");\r
-            auto pendingIntent   = LocalRef<jobject> (env->CallObjectMethod (buyIntentBundle.get(), AndroidBundle.getParcelable, buyIntentString.get()));\r
+            auto pendingIntent   = LocalRef<jobject> (env->CallObjectMethod (buyIntentBundle.get(), JavaBundle.getParcelable, buyIntentString.get()));\r
 \r
             auto  requestCode = 1001;\r
             auto intentSender    = LocalRef<jobject> (env->CallObjectMethod (pendingIntent.get(), AndroidPendingIntent.getIntentSender));\r
@@ -236,7 +236,7 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
         for (const auto& identifier : subscriptionIdentifiers)\r
             env->CallBooleanMethod (skuList.get(), JavaArrayList.add, javaString (identifier).get());\r
 \r
-        auto extraParams = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
+        auto extraParams = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
 \r
         if (extraParams.get() == 0)\r
         {\r
@@ -247,8 +247,8 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
         auto skusToReplaceString        = javaString ("skusToReplace");\r
         auto replaceSkusProrationString = javaString ("replaceSkusProration");\r
 \r
-        env->CallVoidMethod (extraParams.get(), AndroidBundle.putStringArrayList, skusToReplaceString.get(), skuList.get());\r
-        env->CallVoidMethod (extraParams.get(), AndroidBundle.putBoolean, replaceSkusProrationString.get(), creditForUnusedSubscription);\r
+        env->CallVoidMethod (extraParams.get(), JavaBundle.putStringArrayList, skusToReplaceString.get(), skuList.get());\r
+        env->CallVoidMethod (extraParams.get(), JavaBundle.putBoolean, replaceSkusProrationString.get(), creditForUnusedSubscription);\r
 \r
         return LocalRef<jobject> (inAppBillingService.callObjectMethod (IInAppBillingService.getBuyIntentExtraParams, 6,\r
                                                                         getPackageName().get(), skuString.get(),\r
@@ -399,14 +399,14 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
             for (const auto& pi : productIdentifiersToQuery)\r
                 env->CallBooleanMethod (skuList.get(), JavaArrayList.add, javaString (pi).get());\r
 \r
-            auto querySkus = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
+            auto querySkus = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
 \r
             if (querySkus.get() == 0)\r
                 return LocalRef<jobject> (0);\r
 \r
             auto itemIdListString = javaString ("ITEM_ID_LIST");\r
 \r
-            env->CallVoidMethod (querySkus.get(), AndroidBundle.putStringArrayList, itemIdListString.get(), skuList.get());\r
+            env->CallVoidMethod (querySkus.get(), JavaBundle.putStringArrayList, itemIdListString.get(), skuList.get());\r
 \r
             auto productTypeString = javaString (productType);\r
 \r
@@ -427,13 +427,13 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
 \r
                 auto responseCodeString = javaString ("RESPONSE_CODE");\r
 \r
-                auto responseCode = env->CallIntMethod (retrievedProducts.get(), AndroidBundle.getInt, responseCodeString.get());\r
+                auto responseCode = env->CallIntMethod (retrievedProducts.get(), JavaBundle.getInt, responseCodeString.get());\r
 \r
                 if (responseCode == 0)\r
                 {\r
                     auto detailsListString = javaString ("DETAILS_LIST");\r
 \r
-                    auto responseList = LocalRef<jobject> (env->CallObjectMethod (retrievedProducts.get(), AndroidBundle.getStringArrayList,\r
+                    auto responseList = LocalRef<jobject> (env->CallObjectMethod (retrievedProducts.get(), JavaBundle.getStringArrayList,\r
                                                                                   detailsListString.get()));\r
 \r
                     if (responseList != 0)\r
@@ -555,7 +555,7 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
             if (ownedItems.get() != 0)\r
             {\r
                 auto responseCodeString = javaString ("RESPONSE_CODE");\r
-                auto responseCode = env->CallIntMethod (ownedItems.get(), AndroidBundle.getInt, responseCodeString.get());\r
+                auto responseCode = env->CallIntMethod (ownedItems.get(), JavaBundle.getInt, responseCodeString.get());\r
 \r
                 if (responseCode == 0)\r
                 {\r
@@ -564,10 +564,10 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
                     auto signatureListString     = javaString ("INAPP_DATA_SIGNATURE_LIST");\r
                     auto continuationTokenString = javaString ("INAPP_CONTINUATION_TOKEN");\r
 \r
-                    auto ownedSkus            = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, itemListString.get()));\r
-                    auto purchaseDataList     = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, dataListString.get()));\r
-                    auto signatureList        = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, signatureListString.get()));\r
-                    auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), AndroidBundle.getString, continuationTokenString.get()));\r
+                    auto ownedSkus            = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, itemListString.get()));\r
+                    auto purchaseDataList     = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, dataListString.get()));\r
+                    auto signatureList        = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, signatureListString.get()));\r
+                    auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), JavaBundle.getString, continuationTokenString.get()));\r
 \r
                     for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), JavaArrayList.size); ++i)\r
                     {\r
@@ -681,15 +681,15 @@ struct InAppPurchases::Pimpl    : private AsyncUpdater,
                 auto* env = getEnv();\r
 \r
                 auto responseCodeString = javaString ("RESPONSE_CODE");\r
-                auto responseCode = env->CallIntMethod (ownedItems.get(), AndroidBundle.getInt, responseCodeString.get());\r
+                auto responseCode = env->CallIntMethod (ownedItems.get(), JavaBundle.getInt, responseCodeString.get());\r
 \r
                 if (responseCode == 0)\r
                 {\r
                     auto dataListString          = javaString ("INAPP_PURCHASE_DATA_LIST");\r
                     auto continuationTokenString = javaString ("INAPP_CONTINUATION_TOKEN");\r
 \r
-                    auto purchaseDataList     = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, dataListString.get()));\r
-                    auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), AndroidBundle.getString, continuationTokenString.get()));\r
+                    auto purchaseDataList     = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, dataListString.get()));\r
+                    auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), JavaBundle.getString, continuationTokenString.get()));\r
 \r
                     for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), JavaArrayList.size); ++i)\r
                     {\r
index 734de7a8c1edaa40410ad5cc0dd10370eaa0f30b..c619832a94f1c25f9a51f36f4998ca05750ff373 100644 (file)
@@ -178,7 +178,7 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
 \r
     void getProductsInformation (const StringArray& productIdentifiers)\r
     {\r
-        auto productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithArray: createNSArrayFromStringArray (productIdentifiers)]];\r
+        auto* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithArray: createNSArrayFromStringArray (productIdentifiers)]];\r
 \r
         pendingProductInfoRequests.add (new PendingProductInfoRequest { PendingProductInfoRequest::Type::query,\r
                                                                         std::unique_ptr<SKProductsRequest, NSObjectDeleter> (productsRequest) });\r
@@ -195,8 +195,8 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
             return;\r
         }\r
 \r
-        auto productIdentifiers = [NSArray arrayWithObject: juceStringToNS (productIdentifier)];\r
-        auto productsRequest    = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];\r
+        auto* productIdentifiers = [NSArray arrayWithObject: juceStringToNS (productIdentifier)];\r
+        auto* productsRequest    = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];\r
 \r
         pendingProductInfoRequests.add (new PendingProductInfoRequest { PendingProductInfoRequest::Type::purchase,\r
                                                                         std::unique_ptr<SKProductsRequest, NSObjectDeleter> (productsRequest) });\r
@@ -213,7 +213,7 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
         }\r
         else\r
         {\r
-            auto receiptRequest = [[SKReceiptRefreshRequest alloc] init];\r
+            auto* receiptRequest = [[SKReceiptRefreshRequest alloc] init];\r
 \r
             pendingReceiptRefreshRequests.add (new PendingReceiptRefreshRequest { subscriptionsSharedSecret,\r
                                                                                   std::unique_ptr<SKReceiptRefreshRequest, NSObjectDeleter> ([receiptRequest retain]) });\r
@@ -377,7 +377,7 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
             jassert ([products count] == 1);\r
 \r
             auto* product = products[0];\r
-            auto payment = [SKPayment paymentWithProduct: product];\r
+            auto* payment = [SKPayment paymentWithProduct: product];\r
             [[SKPaymentQueue defaultQueue] addPayment: payment];\r
         }\r
         else\r
@@ -525,9 +525,9 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
     //==============================================================================\r
     void processReceiptRefreshResponseWithSubscriptionsSharedSecret (const String& secret)\r
     {\r
-        auto receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];\r
+        auto* receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];\r
 \r
-        if (auto receiptData = [NSData dataWithContentsOfURL: receiptURL])\r
+        if (auto* receiptData = [NSData dataWithContentsOfURL: receiptURL])\r
             fetchReceiptDetailsFromAppStore (receiptData, secret);\r
         else\r
             owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Receipt fetch failed")); });\r
@@ -535,16 +535,16 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
 \r
     void fetchReceiptDetailsFromAppStore (NSData* receiptData, const String& secret)\r
     {\r
-        auto requestContents = [NSMutableDictionary dictionaryWithCapacity: (NSUInteger) (secret.isNotEmpty() ? 2 : 1)];\r
+        auto* requestContents = [NSMutableDictionary dictionaryWithCapacity: (NSUInteger) (secret.isNotEmpty() ? 2 : 1)];\r
         [requestContents setObject: [receiptData base64EncodedStringWithOptions:0] forKey: nsStringLiteral ("receipt-data")];\r
 \r
         if (secret.isNotEmpty())\r
             [requestContents setObject: juceStringToNS (secret) forKey: nsStringLiteral ("password")];\r
 \r
         NSError* error;\r
-        auto requestData = [NSJSONSerialization dataWithJSONObject: requestContents\r
-                                                           options: 0\r
-                                                             error: &error];\r
+        auto* requestData = [NSJSONSerialization dataWithJSONObject: requestContents\r
+                                                            options: 0\r
+                                                              error: &error];\r
         if (requestData == nil)\r
         {\r
             sendReceiptFetchFail();\r
@@ -558,28 +558,28 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
        #endif\r
 \r
         // TODO: use juce URL here\r
-        auto storeRequest = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: nsStringLiteral (storeURL)]];\r
+        auto* storeRequest = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: nsStringLiteral (storeURL)]];\r
         [storeRequest setHTTPMethod: nsStringLiteral ("POST")];\r
         [storeRequest setHTTPBody: requestData];\r
 \r
-        auto task = [[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
-                                                    completionHandler:\r
-                                                       ^(NSData* data, NSURLResponse*, NSError* connectionError)\r
-                                                       {\r
-                                                           if (connectionError != nil)\r
-                                                           {\r
-                                                               sendReceiptFetchFail();\r
-                                                           }\r
-                                                           else\r
-                                                           {\r
-                                                               NSError* err;\r
-\r
-                                                               if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err])\r
-                                                                   processReceiptDetails (receiptDetails);\r
-                                                               else\r
-                                                                   sendReceiptFetchFail();\r
-                                                           }\r
-                                                       }];\r
+        auto* task = [[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
+                                                     completionHandler:\r
+                                                        ^(NSData* data, NSURLResponse*, NSError* connectionError)\r
+                                                        {\r
+                                                            if (connectionError != nil)\r
+                                                            {\r
+                                                                sendReceiptFetchFail();\r
+                                                            }\r
+                                                            else\r
+                                                            {\r
+                                                                NSError* err;\r
+\r
+                                                                if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err])\r
+                                                                    processReceiptDetails (receiptDetails);\r
+                                                                else\r
+                                                                    sendReceiptFetchFail();\r
+                                                            }\r
+                                                        }];\r
 \r
         [task resume];\r
     }\r
@@ -656,7 +656,7 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
         }\r
         else if (auto dateAsString = getAs<NSString> (date))\r
         {\r
-            auto formatter = [[NSNumberFormatter alloc] init];\r
+            auto* formatter = [[NSNumberFormatter alloc] init];\r
             [formatter setNumberStyle: NSNumberFormatterDecimalStyle];\r
             dateAsNumber = [formatter numberFromString: dateAsString];\r
             [formatter release];\r
index 35dbdd84bfb55dd988a61c7337aebca00b0b6e5b..636be58f25f19755904e08029d4b0a4f8d777c93 100644 (file)
@@ -81,19 +81,19 @@ public:
 \r
         pendingOpen.device->pimpl->open ([this](const String& deviceId, const String& error)\r
                                          {\r
-                                             int cIndex = getCameraIndex (deviceId);\r
+                                             int index = getCameraIndex (deviceId);\r
 \r
-                                             if (cIndex == -1)\r
+                                             if (index == -1)\r
                                                  return;\r
 \r
-                                             auto& cameraPendingOpen = camerasToOpen.getReference (cIndex);\r
+                                             auto& pendingOpen = camerasToOpen.getReference (index);\r
 \r
                                              if (error.isEmpty())\r
-                                                 cameraPendingOpen.resultCallback (cameraPendingOpen.device.release(), error);\r
+                                                 pendingOpen.resultCallback (pendingOpen.device.release(), error);\r
                                              else\r
-                                                 cameraPendingOpen.resultCallback (nullptr, error);\r
+                                                 pendingOpen.resultCallback (nullptr, error);\r
 \r
-                                             int id = cameraPendingOpen.requestId;\r
+                                             int id = pendingOpen.requestId;\r
 \r
                                              MessageManager::callAsync ([this, id]() { removeRequestWithId (id); });\r
                                          });\r
index 77e1931add76487a8d863398345b5f972ff713bf..b362d1c6343176d49de503e619d763426289b735 100644 (file)
@@ -112,7 +112,7 @@ public:
     /** Creates a component that can be used to display a preview of the\r
         video from this camera.\r
 \r
-        Note: While you can change the size of the preview component, the actual\r
+        Note: while you can change the size of the preview component, the actual\r
         preview display may be smaller than the size requested, because the correct\r
         aspect ratio is maintained automatically.\r
     */\r
@@ -220,6 +220,8 @@ private:
     String name;\r
 \r
     struct Pimpl;\r
+    friend struct Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     struct ViewerComponent;\r
index 23efdf46a07df72c88050890de4aa0400628572d..77ccb89838416b59712d16fd6eb91709a8c7e00c 100644 (file)
@@ -36,7 +36,7 @@
 \r
   ID:               juce_video\r
   vendor:           juce\r
-  version:          5.4.1\r
+  version:          5.3.2\r
   name:             JUCE video playback and capture classes\r
   description:      Classes for playing video and capturing camera input.\r
   website:          http://www.juce.com/juce\r
  #undef JUCE_USE_CAMERA\r
 #endif\r
 \r
-//=============================================================================\r
-/** Config: JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-    Enables synchronisation between video playback volume and OS media volume.\r
-    Currently supported on Android only.\r
- */\r
-#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- #define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
-#ifndef JUCE_VIDEO_LOG_ENABLED\r
- #define JUCE_VIDEO_LOG_ENABLED 1\r
-#endif\r
-\r
-#if JUCE_VIDEO_LOG_ENABLED\r
- #define JUCE_VIDEO_LOG(x) DBG(x)\r
-#else\r
- #define JUCE_VIDEO_LOG(x) {}\r
-#endif\r
-\r
 //=============================================================================\r
 #include "playback/juce_VideoComponent.h"\r
 #include "capture/juce_CameraDevice.h"\r
index 9ec4529c7146fa9c605b65d597f5067cc54a428e..ee424b03efff3bf4b6c46014d48ae3d4fa554b9e 100644 (file)
@@ -28,7 +28,7 @@
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  STATICMETHOD (valueOf, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$CompressFormat;")\r
 \r
-DECLARE_JNI_CLASS (AndroidBitmapCompressFormat, "android/graphics/Bitmap$CompressFormat")\r
+DECLARE_JNI_CLASS (AndroidBitmapCompressFormat, "android/graphics/Bitmap$CompressFormat");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -36,20 +36,20 @@ DECLARE_JNI_CLASS (AndroidBitmapCompressFormat, "android/graphics/Bitmap$Compres
  METHOD (createCaptureRequest, "createCaptureRequest", "(I)Landroid/hardware/camera2/CaptureRequest$Builder;") \\r
  METHOD (createCaptureSession, "createCaptureSession", "(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidCameraDevice, "android/hardware/camera2/CameraDevice")\r
+DECLARE_JNI_CLASS (AndroidCameraDevice, "android/hardware/camera2/CameraDevice");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (close,     "close",     "()V") \\r
  METHOD (getPlanes, "getPlanes", "()[Landroid/media/Image$Plane;")\r
 \r
-DECLARE_JNI_CLASS (AndroidImage, "android/media/Image")\r
+DECLARE_JNI_CLASS (AndroidImage, "android/media/Image");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (getBuffer, "getBuffer", "()Ljava/nio/ByteBuffer;")\r
 \r
-DECLARE_JNI_CLASS (AndroidImagePlane, "android/media/Image$Plane")\r
+DECLARE_JNI_CLASS (AndroidImagePlane, "android/media/Image$Plane");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -59,7 +59,7 @@ DECLARE_JNI_CLASS (AndroidImagePlane, "android/media/Image$Plane")
  METHOD (setOnImageAvailableListener, "setOnImageAvailableListener", "(Landroid/media/ImageReader$OnImageAvailableListener;Landroid/os/Handler;)V") \\r
  STATICMETHOD (newInstance, "newInstance", "(IIII)Landroid/media/ImageReader;")\r
 \r
-DECLARE_JNI_CLASS (AndroidImageReader, "android/media/ImageReader")\r
+DECLARE_JNI_CLASS (AndroidImageReader, "android/media/ImageReader");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -82,7 +82,7 @@ DECLARE_JNI_CLASS (AndroidImageReader, "android/media/ImageReader")
  METHOD (start,                   "start",                   "()V") \\r
  METHOD (stop,                    "stop",                    "()V")\r
 \r
-DECLARE_JNI_CLASS (AndroidMediaRecorder, "android/media/MediaRecorder")\r
+DECLARE_JNI_CLASS (AndroidMediaRecorder, "android/media/MediaRecorder");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -92,19 +92,19 @@ DECLARE_JNI_CLASS (AndroidMediaRecorder, "android/media/MediaRecorder")
  METHOD (setSurfaceTextureListener, "setSurfaceTextureListener", "(Landroid/view/TextureView$SurfaceTextureListener;)V") \\r
  METHOD (setTransform,              "setTransform",              "(Landroid/graphics/Matrix;)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidTextureView, "android/view/TextureView")\r
+DECLARE_JNI_CLASS (AndroidTextureView, "android/view/TextureView");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (constructor, "<init>", "(Landroid/graphics/SurfaceTexture;)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidSurface, "android/view/Surface")\r
+DECLARE_JNI_CLASS (AndroidSurface, "android/view/Surface");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (setDefaultBufferSize, "setDefaultBufferSize", "(II)V")\r
 \r
-DECLARE_JNI_CLASS (AndroidSurfaceTexture, "android/graphics/SurfaceTexture")\r
+DECLARE_JNI_CLASS (AndroidSurfaceTexture, "android/graphics/SurfaceTexture");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -113,7 +113,7 @@ DECLARE_JNI_CLASS (AndroidSurfaceTexture, "android/graphics/SurfaceTexture")
  METHOD (isOutputSupportedFor,        "isOutputSupportedFor", "(I)Z") \\r
  METHOD (isOutputSupportedForSurface, "isOutputSupportedFor", "(Landroid/view/Surface;)Z")\r
 \r
-DECLARE_JNI_CLASS (AndroidStreamConfigurationMap, "android/hardware/camera2/params/StreamConfigurationMap")\r
+DECLARE_JNI_CLASS (AndroidStreamConfigurationMap, "android/hardware/camera2/params/StreamConfigurationMap");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -121,7 +121,7 @@ DECLARE_JNI_CLASS (AndroidStreamConfigurationMap, "android/hardware/camera2/para
  METHOD (toByteArray, "toByteArray", "()[B") \\r
  METHOD (size,        "size",        "()I")\r
 \r
-DECLARE_JNI_CLASS (ByteArrayOutputStream, "java/io/ByteArrayOutputStream")\r
+DECLARE_JNI_CLASS (ByteArrayOutputStream, "java/io/ByteArrayOutputStream");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -137,13 +137,13 @@ DECLARE_JNI_CLASS (CameraCaptureSession, "android/hardware/camera2/CameraCapture
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";JZ)V")\r
 \r
-DECLARE_JNI_CLASS (CameraCaptureSessionCaptureCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionCaptureCallback")\r
+DECLARE_JNI_CLASS (CameraCaptureSessionCaptureCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionCaptureCallback");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V")\r
 \r
-DECLARE_JNI_CLASS (CameraCaptureSessionStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionStateCallback")\r
+DECLARE_JNI_CLASS (CameraCaptureSessionStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionStateCallback");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -154,19 +154,19 @@ DECLARE_JNI_CLASS (CameraCaptureSessionStateCallback, JUCE_ANDROID_ACTIVITY_CLAS
  STATICFIELD (SCALER_STREAM_CONFIGURATION_MAP, "SCALER_STREAM_CONFIGURATION_MAP", "Landroid/hardware/camera2/CameraCharacteristics$Key;") \\r
  STATICFIELD (SENSOR_ORIENTATION,              "SENSOR_ORIENTATION",              "Landroid/hardware/camera2/CameraCharacteristics$Key;")\r
 \r
-DECLARE_JNI_CLASS (CameraCharacteristics, "android/hardware/camera2/CameraCharacteristics")\r
+DECLARE_JNI_CLASS (CameraCharacteristics, "android/hardware/camera2/CameraCharacteristics");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (getName, "getName", "()Ljava/lang/String;")\r
 \r
-DECLARE_JNI_CLASS (CameraCharacteristicsKey, "android/hardware/camera2/CameraCharacteristics$Key")\r
+DECLARE_JNI_CLASS (CameraCharacteristicsKey, "android/hardware/camera2/CameraCharacteristics$Key");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
  METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V")\r
 \r
-DECLARE_JNI_CLASS (CameraDeviceStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraDeviceStateCallback")\r
+DECLARE_JNI_CLASS (CameraDeviceStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraDeviceStateCallback");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -174,7 +174,7 @@ DECLARE_JNI_CLASS (CameraDeviceStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$
  METHOD (getCameraIdList,          "getCameraIdList",          "()[Ljava/lang/String;") \\r
  METHOD (openCamera,               "openCamera",               "(Ljava/lang/String;Landroid/hardware/camera2/CameraDevice$StateCallback;Landroid/os/Handler;)V")\r
 \r
-DECLARE_JNI_CLASS (CameraManager, "android/hardware/camera2/CameraManager")\r
+DECLARE_JNI_CLASS (CameraManager, "android/hardware/camera2/CameraManager");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -183,7 +183,7 @@ DECLARE_JNI_CLASS (CameraManager, "android/hardware/camera2/CameraManager")
  STATICFIELD (CONTROL_AF_TRIGGER,            "CONTROL_AF_TRIGGER",            "Landroid/hardware/camera2/CaptureRequest$Key;") \\r
  STATICFIELD (CONTROL_MODE,                  "CONTROL_MODE",                  "Landroid/hardware/camera2/CaptureRequest$Key;")\r
 \r
-DECLARE_JNI_CLASS (CaptureRequest, "android/hardware/camera2/CaptureRequest")\r
+DECLARE_JNI_CLASS (CaptureRequest, "android/hardware/camera2/CaptureRequest");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -191,7 +191,7 @@ DECLARE_JNI_CLASS (CaptureRequest, "android/hardware/camera2/CaptureRequest")
  METHOD (build,     "build",     "()Landroid/hardware/camera2/CaptureRequest;") \\r
  METHOD (set,       "set",       "(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/Object;)V")\r
 \r
-DECLARE_JNI_CLASS (CaptureRequestBuilder, "android/hardware/camera2/CaptureRequest$Builder")\r
+DECLARE_JNI_CLASS (CaptureRequestBuilder, "android/hardware/camera2/CaptureRequest$Builder");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -199,7 +199,7 @@ DECLARE_JNI_CLASS (CaptureRequestBuilder, "android/hardware/camera2/CaptureReque
  STATICFIELD (CONTROL_AE_STATE, "CONTROL_AE_STATE", "Landroid/hardware/camera2/CaptureResult$Key;") \\r
  STATICFIELD (CONTROL_AF_STATE, "CONTROL_AF_STATE", "Landroid/hardware/camera2/CaptureResult$Key;")\r
 \r
-DECLARE_JNI_CLASS (CaptureResult, "android/hardware/camera2/CaptureResult")\r
+DECLARE_JNI_CLASS (CaptureResult, "android/hardware/camera2/CaptureResult");\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
@@ -208,7 +208,7 @@ DECLARE_JNI_CLASS (CaptureResult, "android/hardware/camera2/CaptureResult")
  METHOD (disable,              "disable",              "()V") \\r
  METHOD (enable,               "enable",               "()V")\r
 \r
-DECLARE_JNI_CLASS (OrientationEventListener, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceOrientationEventListener")\r
+DECLARE_JNI_CLASS (OrientationEventListener, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceOrientationEventListener");\r
 #undef JNI_CLASS_MEMBERS\r
 #endif\r
 \r
@@ -442,6 +442,49 @@ private:
     Owner& owner;\r
 };\r
 \r
+//==============================================================================\r
+class AppPausedResumedListener     : public AndroidInterfaceImplementer\r
+{\r
+public:\r
+    struct Owner\r
+    {\r
+        virtual ~Owner() {}\r
+\r
+        virtual void appPaused() = 0;\r
+        virtual void appResumed() = 0;\r
+    };\r
+\r
+    AppPausedResumedListener (Owner& ownerToUse)\r
+        : owner (ownerToUse)\r
+    {}\r
+\r
+    jobject invoke (jobject proxy, jobject method, jobjectArray args) override\r
+    {\r
+        auto* env = getEnv();\r
+\r
+        auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
+\r
+        int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
+\r
+        if (methodName == "appPaused" && numArgs == 0)\r
+        {\r
+            owner.appPaused();\r
+            return nullptr;\r
+        }\r
+\r
+        if (methodName == "appResumed" && numArgs == 0)\r
+        {\r
+            owner.appResumed();\r
+            return nullptr;\r
+        }\r
+\r
+        return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
+    }\r
+\r
+private:\r
+    Owner& owner;\r
+};\r
+\r
 //==============================================================================\r
 struct CameraDevice::Pimpl\r
 #if __ANDROID_API__ >= 21\r
@@ -463,6 +506,7 @@ struct CameraDevice::Pimpl
           appPausedResumedListener (*this),\r
           appPausedResumedListenerNative (CreateJavaInterface (&appPausedResumedListener,\r
                                                                JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener").get()),\r
+\r
           cameraManager (initialiseCameraManager()),\r
           cameraCharacteristics (initialiseCameraCharacteristics (cameraManager, cameraId)),\r
           streamConfigurationMap (cameraCharacteristics),\r
@@ -692,9 +736,9 @@ private:
 \r
         JUCE_CAMERA_LOG ("Camera id: " + cameraId + ", characteristics keys num: " + String (size));\r
 \r
-        for (int ikey = 0; ikey < size; ++ikey)\r
+        for (int i = 0; i < size; ++i)\r
         {\r
-            auto key = LocalRef<jobject> (env->CallObjectMethod (keysList, JavaList.get, ikey));\r
+            auto key = LocalRef<jobject> (env->CallObjectMethod (keysList, JavaList.get, i));\r
             auto jKeyName = LocalRef<jstring> ((jstring) env->CallObjectMethod (key, CameraCharacteristicsKey.getName));\r
             auto keyName = juceString (jKeyName);\r
 \r
@@ -710,7 +754,7 @@ private:
             }\r
             else if (kvs.startsWith ("[Landroid.util.Range"))\r
             {\r
-                printRangeArrayElements (keyValue);\r
+                printRangeArrayElements (keyValue, keyName);\r
             }\r
             else\r
             {\r
@@ -771,7 +815,7 @@ private:
         JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + result);\r
     }\r
 \r
-    static void printRangeArrayElements (const LocalRef<jobject>& rangeArray)\r
+    static void printRangeArrayElements (const LocalRef<jobject>& rangeArray, const String& keyName)\r
     {\r
         auto* env = getEnv();\r
 \r
@@ -797,8 +841,8 @@ private:
     class StreamConfigurationMap\r
     {\r
     public:\r
-        StreamConfigurationMap (const GlobalRef& characteristics)\r
-            : scalerStreamConfigurationMap (getStreamConfigurationMap (characteristics)),\r
+        StreamConfigurationMap (const GlobalRef& cameraCharacteristics)\r
+            : scalerStreamConfigurationMap (getStreamConfigurationMap (cameraCharacteristics)),\r
               supportedPreviewOutputSizes (retrieveOutputSizes (scalerStreamConfigurationMap,\r
                                                                 getClassForName ("android.graphics.SurfaceTexture"),\r
                                                                 -1)),\r
@@ -825,7 +869,7 @@ private:
 \r
         bool isOutputSupportedForSurface (const LocalRef<jobject>& surface) const\r
         {\r
-            return getEnv()->CallBooleanMethod (scalerStreamConfigurationMap, AndroidStreamConfigurationMap.isOutputSupportedForSurface, surface.get()) != 0;\r
+            return getEnv()->CallBooleanMethod (scalerStreamConfigurationMap, AndroidStreamConfigurationMap.isOutputSupportedForSurface, surface.get());\r
         }\r
 \r
         static constexpr int jpegImageFormat = 256;\r
@@ -838,14 +882,14 @@ private:
         Array<Rectangle<int>> supportedVideoRecordingOutputSizes;\r
         Rectangle<int> defaultPreviewSize, previewBufferSize;\r
 \r
-        GlobalRef getStreamConfigurationMap (const GlobalRef& characteristics)\r
+        GlobalRef getStreamConfigurationMap (const GlobalRef& cameraCharacteristics)\r
         {\r
             auto* env = getEnv();\r
 \r
             auto scalerStreamConfigurationMapKey = LocalRef<jobject> (env->GetStaticObjectField (CameraCharacteristics,\r
                                                                                                  CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP));\r
 \r
-            return GlobalRef (LocalRef<jobject> (env->CallObjectMethod (characteristics,\r
+            return GlobalRef (LocalRef<jobject> (env->CallObjectMethod (cameraCharacteristics,\r
                                                                         CameraCharacteristics.get,\r
                                                                         scalerStreamConfigurationMapKey.get())));\r
         }\r
@@ -1222,6 +1266,8 @@ private:
             auto byteArray = LocalRef<jbyteArray> (env->NewByteArray (bufferSize));\r
             env->CallObjectMethod (imagePlaneBuffer, JavaByteBuffer.get, byteArray.get());\r
 \r
+            auto orientationsEnabled = Desktop::getInstance().getOrientationsEnabled() & ~Desktop::upsideDown;\r
+\r
             auto rotationAngle = getRotationAngle (deviceOrientationFromAccelerometerSensor, targetOrientation,\r
                                                   cameraLensFrontFacing, cameraSensorOrientation);\r
 \r
@@ -1266,6 +1312,8 @@ private:
                                      bool cameraLensFrontFacing,\r
                                      int cameraSensorOrientation)\r
         {\r
+            auto orientationsEnabled = Desktop::getInstance().getOrientationsEnabled() & ~Desktop::upsideDown;\r
+\r
             auto isSensorOrientationHorizontal = deviceOrientationFromAccelerometerSensor == Desktop::rotatedAntiClockwise\r
                                               || deviceOrientationFromAccelerometerSensor == Desktop::rotatedClockwise;\r
 \r
@@ -1308,6 +1356,8 @@ private:
             auto origBitmapWidth  = env->CallIntMethod (origBitmap, AndroidBitmap.getWidth);\r
             auto origBitmapHeight = env->CallIntMethod (origBitmap, AndroidBitmap.getHeight);\r
 \r
+            auto orientationsEnabled = Desktop::getInstance().getOrientationsEnabled() & ~Desktop::upsideDown;\r
+\r
             auto matrix = LocalRef<jobject> (env->NewObject (AndroidMatrix, AndroidMatrix.constructor));\r
             env->CallBooleanMethod (matrix, AndroidMatrix.postRotate, (jfloat) rotationAngle, (jfloat) 0, (jfloat) 0);\r
 \r
@@ -1410,7 +1460,10 @@ private:
 \r
             // ... ignore RuntimeException that can be thrown if stop() was called after recording\r
             // has started but before any frame was written to a file. This is not an error.\r
-            jniCheckHasExceptionOccurredAndClear();\r
+            auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+            if (exception != 0)\r
+                env->ExceptionClear();\r
 \r
             unlockScreenOrientation();\r
         }\r
@@ -1577,12 +1630,16 @@ private:
                     }\r
                 }\r
 \r
+                auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
                 // When exception occurs, CameraCaptureSession.close will never finish, so\r
                 // we should not wait for it. For fatal error an exception does occur, but\r
                 // it is catched internally in Java...\r
-                if (jniCheckHasExceptionOccurredAndClear() || scopedCameraDevice.fatalErrorOccurred.get())\r
+                if (exception != 0 || scopedCameraDevice.fatalErrorOccurred.get())\r
                 {\r
                     JUCE_CAMERA_LOG ("Exception or fatal error occurred while closing Capture Session, closing by force");\r
+\r
+                    env->ExceptionClear();\r
                 }\r
                 else if (calledClose)\r
                 {\r
@@ -1711,7 +1768,7 @@ private:
 \r
                 void lockFocus()\r
                 {\r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     JUCE_CAMERA_LOG ("Performing auto-focus if possible...");\r
@@ -1739,9 +1796,11 @@ private:
                     // IllegalStateException can be thrown when accessing CaptureSession,\r
                     // claiming that capture session was already closed but we may not\r
                     // get relevant callback yet, so check for this and bailout when needed.\r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
+                    auto* env = getEnv();\r
+\r
                     switch (currentState)\r
                     {\r
                         case State::pendingFocusLock:\r
@@ -1843,7 +1902,7 @@ private:
 \r
                 void captureStillPictureDelayed()\r
                 {\r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     JUCE_CAMERA_LOG ("Still picture capture, device ready, capturing now...");\r
@@ -1852,12 +1911,12 @@ private:
 \r
                     env->CallVoidMethod (captureSession, CameraCaptureSession.stopRepeating);\r
 \r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     env->CallVoidMethod (captureSession, CameraCaptureSession.abortCaptures);\r
 \r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     // Delay still picture capture for devices that can't handle it right after\r
@@ -1870,7 +1929,7 @@ private:
 \r
                 void runPrecaptureSequence()\r
                 {\r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     auto* env = getEnv();\r
@@ -1891,7 +1950,7 @@ private:
 \r
                 void unlockFocus()\r
                 {\r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     JUCE_CAMERA_LOG ("Unlocking focus...");\r
@@ -1911,7 +1970,7 @@ private:
                     env->CallIntMethod (captureSession, CameraCaptureSession.capture, resetAutoFocusRequest.get(),\r
                                         nullptr, handler.get());\r
 \r
-                    if (jniCheckHasExceptionOccurredAndClear())\r
+                    if (Pimpl::checkHasExceptionOccurred())\r
                         return;\r
 \r
                     // NB: for preview, using preview capture request again\r
@@ -2174,7 +2233,10 @@ private:
 \r
             // If something went wrong we will be pinged in cameraDeviceStateError()\r
             // callback, silence the redundant exception.\r
-            jniCheckHasExceptionOccurredAndClear();\r
+            auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+            if (exception != 0)\r
+                env->ExceptionClear();\r
         }\r
 \r
         void close()\r
@@ -2438,12 +2500,12 @@ private:
 \r
                 env->CallVoidMethod (session, CameraCaptureSession.stopRepeating);\r
 \r
-                if (jniCheckHasExceptionOccurredAndClear())\r
+                if (Pimpl::checkHasExceptionOccurred())\r
                     return;\r
 \r
                 env->CallVoidMethod (session, CameraCaptureSession.abortCaptures);\r
 \r
-                jniCheckHasExceptionOccurredAndClear();\r
+                Pimpl::checkHasExceptionOccurred();\r
             }\r
         }\r
 \r
@@ -3002,11 +3064,29 @@ private:
         env->CallBooleanMethod (handlerThread, AndroidHandlerThread.quitSafely);\r
         env->CallVoidMethod (handlerThread, AndroidHandlerThread.join);\r
 \r
-        jniCheckHasExceptionOccurredAndClear();\r
+        auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+        if (exception != 0)\r
+            env->ExceptionClear();\r
 \r
         handlerThread.clear();\r
         handler.clear();\r
     }\r
+\r
+    static bool checkHasExceptionOccurred()\r
+    {\r
+        auto* env = getEnv();\r
+\r
+        auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+        if (exception != 0)\r
+        {\r
+            env->ExceptionClear();\r
+            return true;\r
+        }\r
+\r
+        return false;\r
+    }\r
 #endif\r
 \r
     friend struct CameraDevice::ViewerComponent;\r
diff --git a/modules/juce_video/native/juce_android_Video.h b/modules/juce_video/native/juce_android_Video.h
deleted file mode 100644 (file)
index e691fb5..0000000
+++ /dev/null
@@ -1,1918 +0,0 @@
-/*\r
-  ==============================================================================\r
-\r
-   This file is part of the JUCE library.\r
-   Copyright (c) 2018 - ROLI Ltd.\r
-\r
-   Permission is granted to use this software under the terms of either:\r
-   a) the GPL v2 (or any later version)\r
-   b) the Affero GPL v3\r
-\r
-   Details of these licenses can be found at: www.gnu.org/licenses\r
-\r
-   JUCE is distributed in the hope that it will be useful, but WITHOUT ANY\r
-   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR\r
-   A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\r
-\r
-   ------------------------------------------------------------------------------\r
-\r
-   To release a closed-source product which uses JUCE, commercial licenses are\r
-   available: visit www.juce.com for more information.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-#if __ANDROID_API__ >= 21\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getPlaybackInfo,      "getPlaybackInfo",      "()Landroid/media/session/MediaController$PlaybackInfo;") \\r
- METHOD (getPlaybackState,     "getPlaybackState",     "()Landroid/media/session/PlaybackState;") \\r
- METHOD (getTransportControls, "getTransportControls", "()Landroid/media/session/MediaController$TransportControls;") \\r
- METHOD (registerCallback,     "registerCallback",     "(Landroid/media/session/MediaController$Callback;)V") \\r
- METHOD (setVolumeTo,          "setVolumeTo",          "(II)V") \\r
- METHOD (unregisterCallback,   "unregisterCallback",   "(Landroid/media/session/MediaController$Callback;)V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaController, "android/media/session/MediaController")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V") \\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaControllerCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$MediaControllerCallback")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getAudioAttributes, "getAudioAttributes", "()Landroid/media/AudioAttributes;") \\r
- METHOD (getCurrentVolume,   "getCurrentVolume",   "()I") \\r
- METHOD (getMaxVolume,       "getMaxVolume",       "()I")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaControllerPlaybackInfo, "android/media/session/MediaController$PlaybackInfo")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (pause,           "pause",           "()V") \\r
- METHOD (play,            "play",            "()V") \\r
- METHOD (playFromMediaId, "playFromMediaId", "(Ljava/lang/String;Landroid/os/Bundle;)V") \\r
- METHOD (seekTo,          "seekTo",          "(J)V") \\r
- METHOD (stop,            "stop",            "()V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaControllerTransportControls, "android/media/session/MediaController$TransportControls")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor,                  "<init>",                       "()V") \\r
- METHOD (getCurrentPosition,           "getCurrentPosition",           "()I") \\r
- METHOD (getDuration,                  "getDuration",                  "()I") \\r
- METHOD (getPlaybackParams,            "getPlaybackParams",            "()Landroid/media/PlaybackParams;") \\r
- METHOD (getVideoHeight,               "getVideoHeight",               "()I") \\r
- METHOD (getVideoWidth,                "getVideoWidth",                "()I") \\r
- METHOD (isPlaying,                    "isPlaying",                    "()Z") \\r
- METHOD (pause,                        "pause",                        "()V") \\r
- METHOD (prepareAsync,                 "prepareAsync",                 "()V") \\r
- METHOD (release,                      "release",                      "()V") \\r
- METHOD (seekTo,                       "seekTo",                       "(I)V") \\r
- METHOD (setAudioAttributes,           "setAudioAttributes",           "(Landroid/media/AudioAttributes;)V") \\r
- METHOD (setDataSource,                "setDataSource",                "(Landroid/content/Context;Landroid/net/Uri;)V") \\r
- METHOD (setDisplay,                   "setDisplay",                   "(Landroid/view/SurfaceHolder;)V") \\r
- METHOD (setOnBufferingUpdateListener, "setOnBufferingUpdateListener", "(Landroid/media/MediaPlayer$OnBufferingUpdateListener;)V") \\r
- METHOD (setOnCompletionListener,      "setOnCompletionListener",      "(Landroid/media/MediaPlayer$OnCompletionListener;)V") \\r
- METHOD (setOnErrorListener,           "setOnErrorListener",           "(Landroid/media/MediaPlayer$OnErrorListener;)V") \\r
- METHOD (setOnInfoListener,            "setOnInfoListener",            "(Landroid/media/MediaPlayer$OnInfoListener;)V") \\r
- METHOD (setOnPreparedListener,        "setOnPreparedListener",        "(Landroid/media/MediaPlayer$OnPreparedListener;)V") \\r
- METHOD (setOnSeekCompleteListener,    "setOnSeekCompleteListener",    "(Landroid/media/MediaPlayer$OnSeekCompleteListener;)V") \\r
- METHOD (setPlaybackParams,            "setPlaybackParams",            "(Landroid/media/PlaybackParams;)V") \\r
- METHOD (setVolume,                    "setVolume",                    "(FF)V") \\r
- METHOD (start,                        "start",                        "()V") \\r
- METHOD (stop,                         "stop",                         "()V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaPlayer, "android/media/MediaPlayer")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor,            "<init>",                 "(Landroid/content/Context;Ljava/lang/String;)V") \\r
- METHOD (getController,          "getController",          "()Landroid/media/session/MediaController;") \\r
- METHOD (release,                "release",                "()V") \\r
- METHOD (setActive,              "setActive",              "(Z)V") \\r
- METHOD (setCallback,            "setCallback",            "(Landroid/media/session/MediaSession$Callback;)V") \\r
- METHOD (setFlags,               "setFlags",               "(I)V") \\r
- METHOD (setMediaButtonReceiver, "setMediaButtonReceiver", "(Landroid/app/PendingIntent;)V") \\r
- METHOD (setMetadata,            "setMetadata",            "(Landroid/media/MediaMetadata;)V") \\r
- METHOD (setPlaybackState,       "setPlaybackState",       "(Landroid/media/session/PlaybackState;)V") \\r
- METHOD (setPlaybackToLocal,     "setPlaybackToLocal",     "(Landroid/media/AudioAttributes;)V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaSession, "android/media/session/MediaSession")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V") \\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaSessionCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$MediaSessionCallback")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (build,       "build",   "()Landroid/media/MediaMetadata;") \\r
- METHOD (constructor, "<init>",  "()V") \\r
- METHOD (putLong,     "putLong", "(Ljava/lang/String;J)Landroid/media/MediaMetadata$Builder;")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaMetadataBuilder, "android/media/MediaMetadata$Builder")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getSpeed, "getSpeed", "()F") \\r
- METHOD (setSpeed, "setSpeed", "(F)Landroid/media/PlaybackParams;")\r
-\r
-DECLARE_JNI_CLASS (AndroidPlaybackParams, "android/media/PlaybackParams")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getActions,       "getActions",       "()J") \\r
- METHOD (getErrorMessage,  "getErrorMessage",  "()Ljava/lang/CharSequence;") \\r
- METHOD (getPlaybackSpeed, "getPlaybackSpeed", "()F") \\r
- METHOD (getPosition,      "getPosition",      "()J") \\r
- METHOD (getState,         "getState",         "()I")\r
-\r
-DECLARE_JNI_CLASS (AndroidPlaybackState, "android/media/session/PlaybackState")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (build,           "build",           "()Landroid/media/session/PlaybackState;") \\r
- METHOD (constructor,     "<init>",          "()V") \\r
- METHOD (setActions,      "setActions",      "(J)Landroid/media/session/PlaybackState$Builder;") \\r
- METHOD (setErrorMessage, "setErrorMessage", "(Ljava/lang/CharSequence;)Landroid/media/session/PlaybackState$Builder;") \\r
- METHOD (setState,        "setState",        "(IJF)Landroid/media/session/PlaybackState$Builder;")\r
-\r
-DECLARE_JNI_CLASS (AndroidPlaybackStateBuilder, "android/media/session/PlaybackState$Builder")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>",     "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";Landroid/app/Activity;J)V") \\r
- METHOD (setEnabled,  "setEnabled", "(Z)V")\r
-\r
-DECLARE_JNI_CLASS (SystemVolumeObserver, JUCE_ANDROID_ACTIVITY_CLASSPATH "$SystemVolumeObserver")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#endif\r
-\r
-//==============================================================================\r
-class MediaPlayerListener  : public AndroidInterfaceImplementer\r
-{\r
-public:\r
-    struct Owner\r
-    {\r
-        virtual ~Owner() {}\r
-\r
-        virtual void onPrepared (LocalRef<jobject>& mediaPlayer) = 0;\r
-        virtual void onBufferingUpdate (LocalRef<jobject>& mediaPlayer, int progress) = 0;\r
-        virtual void onSeekComplete (LocalRef<jobject>& mediaPlayer) = 0;\r
-        virtual void onCompletion (LocalRef<jobject>& mediaPlayer) = 0;\r
-        virtual bool onInfo (LocalRef<jobject>& mediaPlayer, int what, int extra) = 0;\r
-        virtual bool onError (LocalRef<jobject>& mediaPlayer, int what, int extra) = 0;\r
-    };\r
-\r
-    MediaPlayerListener (Owner& ownerToUse) : owner (ownerToUse) {}\r
-\r
-private:\r
-    Owner& owner;\r
-\r
-    jobject invoke (jobject proxy, jobject method, jobjectArray args) override\r
-    {\r
-        auto* env = getEnv();\r
-        auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
-\r
-        int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
-\r
-        if (methodName == "onPrepared" && numArgs == 1)\r
-        {\r
-            auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
-            owner.onPrepared (mediaPlayer);\r
-            return nullptr;\r
-        }\r
-\r
-        if (methodName == "onCompletion" && numArgs == 1)\r
-        {\r
-            auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
-            owner.onCompletion (mediaPlayer);\r
-            return nullptr;\r
-        }\r
-\r
-        if (methodName == "onInfo" && numArgs == 3)\r
-        {\r
-            auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-            auto what        = LocalRef<jobject> (env->GetObjectArrayElement (args, 1));\r
-            auto extra       = LocalRef<jobject> (env->GetObjectArrayElement (args, 2));\r
-\r
-            auto whatInt  = (int) env->CallIntMethod (what, JavaInteger.intValue);\r
-            auto extraInt = (int) env->CallIntMethod (extra, JavaInteger.intValue);\r
-\r
-            auto res = owner.onInfo (mediaPlayer, whatInt, extraInt);\r
-            return env->CallStaticObjectMethod (JavaBoolean, JavaBoolean.valueOf, (jboolean) res);\r
-        }\r
-\r
-        if (methodName == "onError" && numArgs == 3)\r
-        {\r
-            auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-            auto what        = LocalRef<jobject> (env->GetObjectArrayElement (args, 1));\r
-            auto extra       = LocalRef<jobject> (env->GetObjectArrayElement (args, 2));\r
-\r
-            auto whatInt  = (int) env->CallIntMethod (what, JavaInteger.intValue);\r
-            auto extraInt = (int) env->CallIntMethod (extra, JavaInteger.intValue);\r
-\r
-            auto res = owner.onError (mediaPlayer, whatInt, extraInt);\r
-            return env->CallStaticObjectMethod (JavaBoolean, JavaBoolean.valueOf, (jboolean) res);\r
-        }\r
-\r
-        if (methodName == "onSeekComplete" && numArgs == 1)\r
-        {\r
-            auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
-            owner.onSeekComplete (mediaPlayer);\r
-            return nullptr;\r
-        }\r
-\r
-        if (methodName == "onBufferingUpdate" && numArgs == 2)\r
-        {\r
-            auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
-            auto progress    = LocalRef<jobject> (env->GetObjectArrayElement (args, 1));\r
-            auto progressInt = (int) env->CallIntMethod (progress, JavaInteger.intValue);\r
-\r
-            owner.onBufferingUpdate (mediaPlayer, progressInt);\r
-\r
-            return nullptr;\r
-        }\r
-\r
-        return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
-    }\r
-};\r
-\r
-//==============================================================================\r
-class AudioManagerOnAudioFocusChangeListener  : public AndroidInterfaceImplementer\r
-{\r
-public:\r
-    struct Owner\r
-    {\r
-        virtual ~Owner() {}\r
-\r
-        virtual void onAudioFocusChange (int changeType) = 0;\r
-    };\r
-\r
-    AudioManagerOnAudioFocusChangeListener (Owner& ownerToUse) : owner (ownerToUse) {}\r
-\r
-private:\r
-    Owner& owner;\r
-\r
-    jobject invoke (jobject proxy, jobject method, jobjectArray args) override\r
-    {\r
-        auto* env = getEnv();\r
-        auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
-\r
-        int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
-\r
-        if (methodName == "onAudioFocusChange" && numArgs == 1)\r
-        {\r
-            auto changeType = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
-            auto changeTypeInt = (int) env->CallIntMethod (changeType, JavaInteger.intValue);\r
-\r
-            owner.onAudioFocusChange (changeTypeInt);\r
-            return nullptr;\r
-        }\r
-\r
-        return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
-    }\r
-};\r
-\r
-//==============================================================================\r
-struct VideoComponent::Pimpl\r
-    : public AndroidViewComponent\r
-#if __ANDROID_API__ >= 21\r
-    , private AppPausedResumedListener::Owner\r
-#endif\r
-{\r
-    Pimpl (VideoComponent& ownerToUse, bool)\r
-       #if __ANDROID_API__ >= 21\r
-        : owner (ownerToUse),\r
-          mediaSession (*this),\r
-          appPausedResumedListener (*this),\r
-          appPausedResumedListenerNative (CreateJavaInterface (&appPausedResumedListener,\r
-                                                               JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener").get())\r
-       #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-        , systemVolumeListener (*this)\r
-       #endif\r
-       #endif\r
-    {\r
-       #if __ANDROID_API__ >= 21\r
-        setVisible (true);\r
-\r
-        auto* env = getEnv();\r
-\r
-        setView (LocalRef<jobject> (env->CallObjectMethod (android.activity.get(),\r
-                                                           JuceAppActivity.createNativeSurfaceView,\r
-                                                           reinterpret_cast<jlong> (this),\r
-                                                           true)));\r
-\r
-        env->CallVoidMethod (android.activity, JuceAppActivity.addAppPausedResumedListener,\r
-                             appPausedResumedListenerNative.get(), reinterpret_cast<jlong> (this));\r
-       #endif\r
-    }\r
-\r
-    ~Pimpl()\r
-    {\r
-       #if __ANDROID_API__ >= 21\r
-        getEnv()->CallVoidMethod (android.activity, JuceAppActivity.removeAppPausedResumedListener,\r
-                                  appPausedResumedListenerNative.get(), reinterpret_cast<jlong>(this));\r
-       #endif\r
-    }\r
-\r
-   #if __ANDROID_API__ < 21\r
-    // Dummy implementations for unsupported API levels.\r
-    void loadAsync (const URL&, std::function<void (const URL&, Result)>) {}\r
-    void close()                          {}\r
-    bool isOpen() const noexcept          { return false; }\r
-    bool isPlaying() const noexcept       { return false; }\r
-    void play()                           {}\r
-    void stop()                           {}\r
-    void setPosition (double)             {}\r
-    void setSpeed (double)                {}\r
-    void setVolume (float)                {}\r
-    float getVolume() const               { return 0.0f; }\r
-    double getPosition() const            { return 0.0; }\r
-    double getSpeed() const               { return 0.0; }\r
-    Rectangle<int> getNativeSize() const  { return {}; }\r
-    double getDuration() const            { return 0.0; }\r
-\r
-    File currentFile;\r
-    URL currentURL;\r
-   #else\r
-    void loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)\r
-    {\r
-        close();\r
-        wasOpen = false;\r
-\r
-        if (url.isEmpty())\r
-        {\r
-            jassertfalse;\r
-            return;\r
-        }\r
-\r
-        if (! url.isLocalFile())\r
-        {\r
-            auto granted = android.activity.callBooleanMethod (JuceAppActivity.isPermissionDeclaredInManifestString,\r
-                                                               javaString ("android.permission.INTERNET").get()) != 0;\r
-\r
-            if (! granted)\r
-            {\r
-                // In order to access videos from the Internet, the Internet permission has to be specified in\r
-                // Android Manifest.\r
-                jassertfalse;\r
-                return;\r
-            }\r
-        }\r
-\r
-        currentURL = url;\r
-\r
-        jassert (callback != nullptr);\r
-\r
-        loadFinishedCallback = std::move (callback);\r
-\r
-        static constexpr jint visible = 0;\r
-        getEnv()->CallVoidMethod ((jobject) getView(), AndroidView.setVisibility, visible);\r
-\r
-        mediaSession.load (url);\r
-    }\r
-\r
-    void close()\r
-    {\r
-        if (! isOpen())\r
-            return;\r
-\r
-        mediaSession.closeVideo();\r
-\r
-        static constexpr jint invisible = 4;\r
-        getEnv()->CallVoidMethod ((jobject) getView(), AndroidView.setVisibility, invisible);\r
-    }\r
-\r
-    bool isOpen() const noexcept          { return mediaSession.isVideoOpen(); }\r
-    bool isPlaying() const noexcept       { return mediaSession.isPlaying(); }\r
-\r
-    void play()                           { mediaSession.play(); }\r
-    void stop()                           { mediaSession.stop(); }\r
-\r
-    void setPosition (double newPosition) { mediaSession.setPosition (newPosition); }\r
-    double getPosition() const            { return mediaSession.getPosition(); }\r
-\r
-    void setSpeed (double newSpeed)       { mediaSession.setSpeed (newSpeed); }\r
-    double getSpeed() const               { return mediaSession.getSpeed(); }\r
-\r
-    Rectangle<int> getNativeSize() const  { return mediaSession.getNativeSize(); }\r
-\r
-    double getDuration() const            { return mediaSession.getDuration(); }\r
-\r
-    void setVolume (float newVolume)      { mediaSession.setVolume (newVolume); }\r
-    float getVolume() const               { return mediaSession.getVolume(); }\r
-\r
-    File currentFile;\r
-    URL currentURL;\r
-\r
-private:\r
-    //==============================================================================\r
-    class MediaSession  : private AudioManagerOnAudioFocusChangeListener::Owner\r
-    {\r
-    public:\r
-        MediaSession (Pimpl& ownerToUse)\r
-            : owner (ownerToUse),\r
-              sdkVersion (getEnv()->CallStaticIntMethod (JuceAppActivity, JuceAppActivity.getAndroidSDKVersion)),\r
-              audioAttributes (getAudioAttributes()),\r
-              nativeMediaSession (LocalRef<jobject> (getEnv()->NewObject (AndroidMediaSession,\r
-                                                                          AndroidMediaSession.constructor,\r
-                                                                          android.activity.get(),\r
-                                                                          javaString ("JuceVideoMediaSession").get()))),\r
-              mediaSessionCallback (LocalRef<jobject> (getEnv()->NewObject (AndroidMediaSessionCallback,\r
-                                                                            AndroidMediaSessionCallback.constructor,\r
-                                                                            android.activity.get(),\r
-                                                                            reinterpret_cast<jlong> (this)))),\r
-              playbackStateBuilder (LocalRef<jobject> (getEnv()->NewObject (AndroidPlaybackStateBuilder,\r
-                                                                            AndroidPlaybackStateBuilder.constructor))),\r
-              controller (*this, getEnv()->CallObjectMethod (nativeMediaSession,\r
-                                                             AndroidMediaSession.getController)),\r
-              player (*this),\r
-              audioManager (android.activity.callObjectMethod (JuceAppActivity.getSystemService, javaString ("audio").get())),\r
-              audioFocusChangeListener (*this),\r
-              nativeAudioFocusChangeListener (GlobalRef (CreateJavaInterface (&audioFocusChangeListener,\r
-                                                                              "android/media/AudioManager$OnAudioFocusChangeListener").get())),\r
-              audioFocusRequest (createAudioFocusRequestIfNecessary (sdkVersion, audioAttributes,\r
-                                                                     nativeAudioFocusChangeListener))\r
-        {\r
-            auto* env = getEnv();\r
-\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setPlaybackToLocal, audioAttributes.get());\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setMediaButtonReceiver, nullptr);\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setCallback, mediaSessionCallback.get());\r
-        }\r
-\r
-        ~MediaSession()\r
-        {\r
-            auto* env = getEnv();\r
-\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setCallback, nullptr);\r
-\r
-            controller.stop();\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.release);\r
-        }\r
-\r
-        bool isVideoOpen() const { return player.isVideoOpen(); }\r
-        bool isPlaying() const   { return player.isPlaying(); }\r
-\r
-        void load (const URL& url) { controller.load (url); }\r
-\r
-        void closeVideo()\r
-        {\r
-            resetState();\r
-            controller.closeVideo();\r
-        }\r
-\r
-        void setDisplay (jobject surfaceHolder) { player.setDisplay (surfaceHolder); }\r
-\r
-        void play() { controller.play(); }\r
-        void stop() { controller.stop(); }\r
-\r
-        void setPosition (double newPosition) { controller.setPosition (newPosition); }\r
-        double getPosition() const            { return controller.getPosition(); }\r
-\r
-        void setSpeed (double newSpeed)\r
-        {\r
-            playSpeedMult = newSpeed;\r
-\r
-            // Calling non 0.0 speed on a paused player would start it...\r
-            if (player.isPlaying())\r
-            {\r
-                player.setPlaySpeed (playSpeedMult);\r
-                updatePlaybackState();\r
-            }\r
-        }\r
-\r
-        double getSpeed() const              { return controller.getPlaySpeed(); }\r
-        Rectangle<int> getNativeSize() const { return player.getVideoNativeSize(); }\r
-        double getDuration() const           { return player.getVideoDuration() / 1000.0; }\r
-\r
-        void setVolume (float newVolume)\r
-        {\r
-           #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-            controller.setVolume (newVolume);\r
-           #else\r
-            player.setAudioVolume (newVolume);\r
-           #endif\r
-        }\r
-\r
-        float getVolume() const\r
-        {\r
-           #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-            return controller.getVolume();\r
-           #else\r
-            return player.getAudioVolume();\r
-           #endif\r
-        }\r
-\r
-        void storeState()\r
-        {\r
-            storedPlaybackState.clear();\r
-            storedPlaybackState = GlobalRef (getCurrentPlaybackState());\r
-        }\r
-\r
-        void restoreState()\r
-        {\r
-            if (storedPlaybackState.get() == nullptr)\r
-                return;\r
-\r
-            auto* env = getEnv();\r
-\r
-            auto pos = env->CallLongMethod (storedPlaybackState, AndroidPlaybackState.getPosition);\r
-            setPosition (pos / 1000.0);\r
-\r
-            setSpeed (playSpeedMult);\r
-\r
-            auto state = env->CallIntMethod (storedPlaybackState, AndroidPlaybackState.getState);\r
-\r
-            if (state != PlaybackState::STATE_NONE && state != PlaybackState::STATE_STOPPED\r
-                && state != PlaybackState::STATE_PAUSED && state != PlaybackState::STATE_ERROR)\r
-            {\r
-                play();\r
-            }\r
-        }\r
-\r
-    private:\r
-        struct PlaybackState\r
-        {\r
-            enum\r
-            {\r
-                STATE_NONE = 0,\r
-                STATE_STOPPED = 1,\r
-                STATE_PAUSED = 2,\r
-                STATE_PLAYING = 3,\r
-                STATE_FAST_FORWARDING = 4,\r
-                STATE_REWINDING = 5,\r
-                STATE_BUFFERING = 6,\r
-                STATE_ERROR = 7,\r
-                STATE_CONNECTING = 8,\r
-                STATE_SKIPPING_TO_PREVIOUS = 9,\r
-                STATE_SKIPPING_TO_NEXT = 10,\r
-                STATE_SKIPPING_TO_QUEUE_ITEM = 11,\r
-            };\r
-\r
-            enum\r
-            {\r
-                ACTION_PAUSE              = 0x2,\r
-                ACTION_PLAY               = 0x4,\r
-                ACTION_PLAY_FROM_MEDIA_ID = 0x8000,\r
-                ACTION_PLAY_PAUSE         = 0x200,\r
-                ACTION_SEEK_TO            = 0x100,\r
-                ACTION_STOP               = 0x1,\r
-            };\r
-        };\r
-\r
-        //==============================================================================\r
-        class Controller\r
-        {\r
-        public:\r
-            Controller (MediaSession& ownerToUse, jobject nativeControllerToUse)\r
-                : owner (ownerToUse),\r
-                  nativeController (GlobalRef (nativeControllerToUse)),\r
-                  controllerTransportControls (LocalRef<jobject> (getEnv()->CallObjectMethod (nativeController,\r
-                                                                                              AndroidMediaController.getTransportControls))),\r
-                  controllerCallback (LocalRef<jobject> (getEnv()->NewObject (AndroidMediaControllerCallback,\r
-                                                                              AndroidMediaControllerCallback.constructor,\r
-                                                                              android.activity.get(),\r
-                                                                              reinterpret_cast<jlong> (this))))\r
-            {\r
-                auto* env = getEnv();\r
-\r
-                env->CallVoidMethod (nativeController, AndroidMediaController.registerCallback, controllerCallback.get());\r
-            }\r
-\r
-            ~Controller()\r
-            {\r
-                auto* env = getEnv();\r
-                env->CallVoidMethod (nativeController, AndroidMediaController.unregisterCallback, controllerCallback.get());\r
-            }\r
-\r
-            void load (const URL& url)\r
-            {\r
-                // NB: would use playFromUri, but it was only introduced in API 23...\r
-                getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.playFromMediaId,\r
-                                          javaString (url.toString (true)).get(), nullptr);\r
-            }\r
-\r
-            void closeVideo()\r
-            {\r
-                getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.stop);\r
-            }\r
-\r
-            void play()\r
-            {\r
-                getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.play);\r
-            }\r
-\r
-            void stop()\r
-            {\r
-                // NB: calling pause, rather than stop, because after calling stop, we would have to call load() again.\r
-                getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.pause);\r
-            }\r
-\r
-            void setPosition (double newPosition)\r
-            {\r
-                auto seekPos = static_cast<jlong> (newPosition * 1000);\r
-\r
-                getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.seekTo, seekPos);\r
-            }\r
-\r
-            double getPosition() const\r
-            {\r
-                auto* env = getEnv();\r
-\r
-                auto playbackState = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackState));\r
-\r
-                if (playbackState != nullptr)\r
-                    return env->CallLongMethod (playbackState, AndroidPlaybackState.getPosition) / 1000.0;\r
-\r
-                return 0.0;\r
-            }\r
-\r
-            double getPlaySpeed() const\r
-            {\r
-                auto* env = getEnv();\r
-\r
-                auto playbackState = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackState));\r
-\r
-                if (playbackState != nullptr)\r
-                    return (double) env->CallFloatMethod (playbackState, AndroidPlaybackState.getPlaybackSpeed);\r
-\r
-                return 1.0;\r
-            }\r
-\r
-            void setVolume (float newVolume)\r
-            {\r
-                auto* env = getEnv();\r
-\r
-                auto playbackInfo = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackInfo));\r
-\r
-                auto maxVolume = env->CallIntMethod (playbackInfo, AndroidMediaControllerPlaybackInfo.getMaxVolume);\r
-\r
-                auto targetVolume = jmin (jint (maxVolume * newVolume), maxVolume);\r
-\r
-                static constexpr jint flagShowUI = 1;\r
-                env->CallVoidMethod (nativeController, AndroidMediaController.setVolumeTo, targetVolume, flagShowUI);\r
-            }\r
-\r
-            float getVolume() const\r
-            {\r
-                auto* env = getEnv();\r
-\r
-                auto playbackInfo = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackInfo));\r
-\r
-                auto maxVolume = (int) (env->CallIntMethod (playbackInfo, AndroidMediaControllerPlaybackInfo.getMaxVolume));\r
-                auto curVolume = (int) (env->CallIntMethod (playbackInfo, AndroidMediaControllerPlaybackInfo.getCurrentVolume));\r
-\r
-                return static_cast<float> (curVolume) / maxVolume;\r
-            }\r
-\r
-        private:\r
-            MediaSession& owner;\r
-\r
-            GlobalRef nativeController;\r
-            GlobalRef controllerTransportControls;\r
-            GlobalRef controllerCallback;\r
-            bool wasPlaying = false;\r
-            bool wasPaused = true;\r
-\r
-            //==============================================================================\r
-            // MediaSessionController callbacks\r
-\r
-            void audioInfoChanged (jobject info)\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSessionController::audioInfoChanged()");\r
-                ignoreUnused (info);\r
-            }\r
-\r
-            void metadataChanged (jobject metadata)\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSessionController::metadataChanged()");\r
-                ignoreUnused (metadata);\r
-            }\r
-\r
-            void playbackStateChanged (jobject playbackState)\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSessionController::playbackStateChanged()");\r
-\r
-                if (playbackState == nullptr)\r
-                    return;\r
-\r
-                auto state = getEnv()->CallIntMethod (playbackState, AndroidPlaybackState.getState);\r
-\r
-                static constexpr jint statePaused  = 2;\r
-                static constexpr jint statePlaying = 3;\r
-\r
-                if (wasPlaying == false && state == statePlaying)\r
-                    owner.playbackStarted();\r
-                else if (wasPaused == false && state == statePaused)\r
-                    owner.playbackStopped();\r
-\r
-                wasPlaying = state == statePlaying;\r
-                wasPaused  = state == statePaused;\r
-            }\r
-\r
-            void sessionDestroyed()\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSessionController::sessionDestroyed()");\r
-            }\r
-\r
-            friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
-            friend void juce_mediaControllerMetadataChanged (int64, void*);\r
-            friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
-            friend void juce_mediaControllerSessionDestroyed (int64);\r
-        };\r
-\r
-        //==============================================================================\r
-        class Player   : private MediaPlayerListener::Owner\r
-        {\r
-        public:\r
-            Player (MediaSession& ownerToUse)\r
-                : owner (ownerToUse),\r
-                  mediaPlayerListener (*this),\r
-                  nativeMediaPlayerListener (GlobalRef (CreateJavaInterface (&mediaPlayerListener,\r
-                                                                             getNativeMediaPlayerListenerInterfaces())))\r
-\r
-            {}\r
-\r
-            void setDisplay (jobject surfaceHolder)\r
-            {\r
-                if (surfaceHolder == nullptr)\r
-                {\r
-                    videoSurfaceHolder.clear();\r
-\r
-                    if (nativeMediaPlayer.get() != nullptr)\r
-                        getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, nullptr);\r
-\r
-                    return;\r
-                }\r
-\r
-                videoSurfaceHolder = GlobalRef (surfaceHolder);\r
-\r
-                if (nativeMediaPlayer.get() != nullptr)\r
-                    getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, videoSurfaceHolder.get());\r
-            }\r
-\r
-            void load (jstring mediaId, jobject extras)\r
-            {\r
-                ignoreUnused (extras);\r
-\r
-                closeVideo();\r
-\r
-                auto* env = getEnv();\r
-\r
-                nativeMediaPlayer = GlobalRef (LocalRef<jobject> (env->NewObject (AndroidMediaPlayer, AndroidMediaPlayer.constructor)));\r
-\r
-                currentState = State::idle;\r
-\r
-                auto uri = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidUri, AndroidUri.parse, mediaId));\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDataSource, android.activity.get(), uri.get());\r
-\r
-                if (jniCheckHasExceptionOccurredAndClear())\r
-                {\r
-                    owner.errorOccurred ("Could not find video under path provided (" + juceString (mediaId) + ")");\r
-                    return;\r
-                }\r
-\r
-                currentState = State::initialised;\r
-\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnBufferingUpdateListener,   nativeMediaPlayerListener.get());\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnCompletionListener, nativeMediaPlayerListener.get());\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnErrorListener,      nativeMediaPlayerListener.get());\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnInfoListener,       nativeMediaPlayerListener.get());\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnPreparedListener,   nativeMediaPlayerListener.get());\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnSeekCompleteListener,   nativeMediaPlayerListener.get());\r
-\r
-                if (videoSurfaceHolder != nullptr)\r
-                    env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, videoSurfaceHolder.get());\r
-\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.prepareAsync);\r
-\r
-                currentState = State::preparing;\r
-            }\r
-\r
-            void closeVideo()\r
-            {\r
-                if (nativeMediaPlayer.get() == nullptr)\r
-                    return;\r
-\r
-                auto* env = getEnv();\r
-\r
-                if (getCurrentStateInfo().canCallStop)\r
-                    env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.stop);\r
-\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.release);\r
-                nativeMediaPlayer.clear();\r
-\r
-                currentState = State::end;\r
-            }\r
-\r
-            bool isVideoOpen() const noexcept\r
-            {\r
-                return currentState == State::prepared || currentState == State::started\r
-                    || currentState == State::paused || currentState == State::complete;\r
-            }\r
-\r
-            int getPlaybackStateFlag() const noexcept { return getCurrentStateInfo().playbackStateFlag; }\r
-            int getAllowedActions()    const noexcept { return getCurrentStateInfo().allowedActions; }\r
-\r
-            jlong getVideoDuration() const\r
-            {\r
-                if (! getCurrentStateInfo().canCallGetVideoDuration)\r
-                    return 0;\r
-\r
-                return getEnv()->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getDuration);\r
-            }\r
-\r
-            Rectangle<int> getVideoNativeSize() const\r
-            {\r
-                if (! getCurrentStateInfo().canCallGetVideoHeight)\r
-                {\r
-                    jassertfalse;\r
-                    return {};\r
-                }\r
-\r
-                auto* env = getEnv();\r
-\r
-                auto width  = (int) env->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getVideoWidth);\r
-                auto height = (int) env->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getVideoHeight);\r
-\r
-                return Rectangle<int> (0, 0, width, height);\r
-            }\r
-\r
-            void play()\r
-            {\r
-                if (! getCurrentStateInfo().canCallStart)\r
-                {\r
-                    jassertfalse;\r
-                    return;\r
-                }\r
-\r
-                auto* env = getEnv();\r
-\r
-                // Perform a potentially pending volume setting\r
-                if (lastAudioVolume != std::numeric_limits<float>::min())\r
-                    env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setVolume, (jfloat) lastAudioVolume, (jfloat) lastAudioVolume);\r
-\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.start);\r
-\r
-                currentState = State::started;\r
-            }\r
-\r
-            void pause()\r
-            {\r
-                if (! getCurrentStateInfo().canCallPause)\r
-                {\r
-                    jassertfalse;\r
-                    return;\r
-                }\r
-\r
-                getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.pause);\r
-\r
-                currentState = State::paused;\r
-            }\r
-\r
-            bool isPlaying() const\r
-            {\r
-                return getCurrentStateInfo().isPlaying;\r
-            }\r
-\r
-            void setPlayPosition (jint newPositionMs)\r
-            {\r
-                if (! getCurrentStateInfo().canCallSeekTo)\r
-                {\r
-                    jassertfalse;\r
-                    return;\r
-                }\r
-\r
-                getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.seekTo, (jint) newPositionMs);\r
-            }\r
-\r
-            jint getPlayPosition() const\r
-            {\r
-                if (! getCurrentStateInfo().canCallGetCurrentPosition)\r
-                    return 0.0;\r
-\r
-                return getEnv()->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getCurrentPosition);\r
-            }\r
-\r
-            void setPlaySpeed (double newSpeed)\r
-            {\r
-                if (! getCurrentStateInfo().canCallSetPlaybackParams)\r
-                {\r
-                    jassertfalse;\r
-                    return;\r
-                }\r
-\r
-                auto* env = getEnv();\r
-\r
-                auto playbackParams = LocalRef<jobject> (env->CallObjectMethod (nativeMediaPlayer, AndroidMediaPlayer.getPlaybackParams));\r
-                LocalRef<jobject> (env->CallObjectMethod (playbackParams, AndroidPlaybackParams.setSpeed, (jfloat) newSpeed));\r
-                env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setPlaybackParams, playbackParams.get());\r
-\r
-                if (jniCheckHasExceptionOccurredAndClear())\r
-                {\r
-                    // MediaPlayer can't handle speed provided!\r
-                    jassertfalse;\r
-                }\r
-            }\r
-\r
-            double getPlaySpeed() const\r
-            {\r
-                if (! getCurrentStateInfo().canCallGetPlaybackParams)\r
-                    return 0.0;\r
-\r
-                auto* env = getEnv();\r
-\r
-                auto playbackParams = LocalRef<jobject> (env->CallObjectMethod (nativeMediaPlayer, AndroidMediaPlayer.getPlaybackParams));\r
-                return (double) env->CallFloatMethod (playbackParams, AndroidPlaybackParams.getSpeed);\r
-            }\r
-\r
-            void setAudioVolume (float newVolume)\r
-            {\r
-                if (! getCurrentStateInfo().canCallSetVolume)\r
-                {\r
-                    jassertfalse;\r
-                    return;\r
-                }\r
-\r
-                lastAudioVolume = jlimit (0.0f, 1.0f, newVolume);\r
-\r
-                if (nativeMediaPlayer.get() != nullptr)\r
-                    getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setVolume, (jfloat) lastAudioVolume, (jfloat) lastAudioVolume);\r
-            }\r
-\r
-            float getAudioVolume() const\r
-            {\r
-                // There is NO getVolume() in MediaPlayer, so the value returned here can be incorrect!\r
-                return lastAudioVolume;\r
-            }\r
-\r
-        private:\r
-            //=============================================================================\r
-            struct StateInfo\r
-            {\r
-                int playbackStateFlag = 0, allowedActions = 0;\r
-\r
-                bool isPlaying, canCallGetCurrentPosition, canCallGetVideoDuration,\r
-                        canCallGetVideoHeight, canCallGetVideoWidth, canCallGetPlaybackParams,\r
-                        canCallPause, canCallPrepare, canCallSeekTo, canCallSetAudioAttributes,\r
-                        canCallSetDataSource, canCallSetPlaybackParams, canCallSetVolume,\r
-                        canCallStart, canCallStop;\r
-            };\r
-\r
-            enum class State\r
-            {\r
-                idle, initialised, preparing, prepared, started, paused, stopped, complete, error, end\r
-            };\r
-\r
-            static constexpr StateInfo stateInfos[] = {\r
-                /* idle */\r
-                {PlaybackState::STATE_NONE, PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            false, true, false, true, true, false, false, false, false, true,\r
-                            true,  false, true, false, false},\r
-                /* initialised */\r
-                {PlaybackState::STATE_NONE, 0, // NB: could use action prepare, but that's API 24 onwards only\r
-                            false, true, false, true, true, true, false, true, false, true,\r
-                            false,  true, true, false, false},\r
-                /* preparing */\r
-                {PlaybackState::STATE_BUFFERING, 0,\r
-                            false, false, false, false, false, true, false, false, false, false,\r
-                            false,  false, false, false, false},\r
-                /* prepared */\r
-                {PlaybackState::STATE_PAUSED,\r
-                            PlaybackState::ACTION_PLAY | PlaybackState::ACTION_PLAY_PAUSE | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID | PlaybackState::ACTION_STOP | PlaybackState::ACTION_SEEK_TO,\r
-                            false, true, true, true, true, true, false, false, true, true,\r
-                            false, true, true, true, true},\r
-                /* started */\r
-                {PlaybackState::STATE_PLAYING,\r
-                            PlaybackState::ACTION_PAUSE | PlaybackState::ACTION_PLAY_PAUSE | PlaybackState::ACTION_SEEK_TO | PlaybackState::ACTION_STOP | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            true, true, true, true, true, true, true, false, true, true,\r
-                            false, true, true, true, true},\r
-                /* paused */\r
-                {PlaybackState::STATE_PAUSED,\r
-                            PlaybackState::ACTION_PLAY | PlaybackState::ACTION_PLAY_PAUSE | PlaybackState::ACTION_SEEK_TO | PlaybackState::ACTION_STOP | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            false, true, true, true, true, true, true, false, true, true,\r
-                            false, true, true, true, true},\r
-                /* stopped */\r
-                {PlaybackState::STATE_STOPPED,\r
-                            PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            false, true, true, true, true, true, false, true, false, true,\r
-                            false, false, true, false, true},\r
-                /* complete */\r
-                {PlaybackState::STATE_PAUSED,\r
-                            PlaybackState::ACTION_SEEK_TO | PlaybackState::ACTION_STOP | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            false, true, true, true, true, true, true, false, true, true,\r
-                            false, true, true, true, true},\r
-                /* error */\r
-                {PlaybackState::STATE_ERROR,\r
-                            PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            false, false, false, false, false, false, false, false, false, false,\r
-                            false, false, false, false, false},\r
-                /* end */\r
-                {PlaybackState::STATE_NONE,\r
-                            PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
-                            false, false, false, false, false, false, false, false, false, false,\r
-                            false, false, false, false, false}\r
-            };\r
-\r
-            StateInfo getCurrentStateInfo() const noexcept             { return stateInfos[static_cast<int> (currentState)]; }\r
-\r
-            //==============================================================================\r
-            MediaSession& owner;\r
-            GlobalRef nativeMediaPlayer;\r
-\r
-            MediaPlayerListener mediaPlayerListener;\r
-            GlobalRef nativeMediaPlayerListener;\r
-\r
-            float lastAudioVolume = std::numeric_limits<float>::min();\r
-\r
-            GlobalRef videoSurfaceHolder;\r
-\r
-            State currentState = State::idle;\r
-\r
-            //==============================================================================\r
-            void onPrepared (LocalRef<jobject>& mediaPlayer) override\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaPlayer::onPrepared()");\r
-\r
-                ignoreUnused (mediaPlayer);\r
-\r
-                currentState = State::prepared;\r
-\r
-                owner.playerPrepared();\r
-            }\r
-\r
-            void onBufferingUpdate (LocalRef<jobject>& mediaPlayer, int progress) override\r
-            {\r
-                ignoreUnused (mediaPlayer);\r
-\r
-                owner.playerBufferingUpdated (progress);\r
-            }\r
-\r
-            void onSeekComplete (LocalRef<jobject>& mediaPlayer) override\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaPlayer::onSeekComplete()");\r
-\r
-                ignoreUnused (mediaPlayer);\r
-\r
-                owner.playerSeekCompleted();\r
-            }\r
-\r
-            void onCompletion (LocalRef<jobject>& mediaPlayer) override\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaPlayer::onCompletion()");\r
-\r
-                ignoreUnused (mediaPlayer);\r
-\r
-                currentState = State::complete;\r
-\r
-                owner.playerPlaybackCompleted();\r
-            }\r
-\r
-            enum\r
-            {\r
-                MEDIA_INFO_UNKNOWN               = 1,\r
-                MEDIA_INFO_VIDEO_RENDERING_START = 3,\r
-                MEDIA_INFO_VIDEO_TRACK_LAGGING   = 700,\r
-                MEDIA_INFO_BUFFERING_START       = 701,\r
-                MEDIA_INFO_BUFFERING_END         = 702,\r
-                MEDIA_INFO_NETWORK_BANDWIDTH     = 703,\r
-                MEDIA_INFO_BAD_INTERLEAVING      = 800,\r
-                MEDIA_INFO_NOT_SEEKABLE          = 801,\r
-                MEDIA_INFO_METADATA_UPDATE       = 802,\r
-                MEDIA_INFO_AUDIO_NOT_PLAYING     = 804,\r
-                MEDIA_INFO_VIDEO_NOT_PLAYING     = 805,\r
-                MEDIA_INFO_UNSUPPORTED_SUBTITE   = 901,\r
-                MEDIA_INFO_SUBTITLE_TIMED_OUT    = 902\r
-            };\r
-\r
-            bool onInfo (LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaPlayer::onInfo(), infoCode: " + String (what) + " (" + infoCodeToString (what) + ")"\r
-                                + ", extraCode: " + String (extra));\r
-\r
-                ignoreUnused (mediaPlayer, extra);\r
-\r
-                if (what == MEDIA_INFO_BUFFERING_START)\r
-                    owner.playerBufferingStarted();\r
-                else if (what == MEDIA_INFO_BUFFERING_END)\r
-                    owner.playerBufferingEnded();\r
-\r
-                return true;\r
-            }\r
-\r
-            static String infoCodeToString (int code)\r
-            {\r
-                switch (code)\r
-                {\r
-                    case MEDIA_INFO_UNKNOWN:               return "Unknown";\r
-                    case MEDIA_INFO_VIDEO_RENDERING_START: return "Rendering start";\r
-                    case MEDIA_INFO_VIDEO_TRACK_LAGGING:   return "Video track lagging";\r
-                    case MEDIA_INFO_BUFFERING_START:       return "Buffering start";\r
-                    case MEDIA_INFO_BUFFERING_END:         return "Buffering end";\r
-                    case MEDIA_INFO_NETWORK_BANDWIDTH:     return "Network bandwidth info available";\r
-                    case MEDIA_INFO_BAD_INTERLEAVING:      return "Bad interleaving";\r
-                    case MEDIA_INFO_NOT_SEEKABLE:          return "Video not seekable";\r
-                    case MEDIA_INFO_METADATA_UPDATE:       return "Metadata updated";\r
-                    case MEDIA_INFO_AUDIO_NOT_PLAYING:     return "Audio not playing";\r
-                    case MEDIA_INFO_VIDEO_NOT_PLAYING:     return "Video not playing";\r
-                    case MEDIA_INFO_UNSUPPORTED_SUBTITE:   return "Unsupported subtitle";\r
-                    case MEDIA_INFO_SUBTITLE_TIMED_OUT:    return "Subtitle timed out";\r
-                    default:                               return "";\r
-                }\r
-            }\r
-\r
-            bool onError (LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
-            {\r
-                auto errorMessage = errorCodeToString (what);\r
-                auto extraMessage = errorCodeToString (extra);\r
-\r
-                if (extraMessage.isNotEmpty())\r
-                    errorMessage << ", " << extraMessage;\r
-\r
-                JUCE_VIDEO_LOG ("MediaPlayer::onError(), errorCode: " + String (what) + " (" + errorMessage + ")"\r
-                                + ", extraCode: " + String (extra) + " (" + extraMessage + ")");\r
-\r
-                ignoreUnused (mediaPlayer);\r
-\r
-                currentState = State::error;\r
-\r
-                owner.errorOccurred (errorMessage);\r
-                return true;\r
-            }\r
-\r
-            static String errorCodeToString (int code)\r
-            {\r
-                enum\r
-                {\r
-                    MEDIA_ERROR_UNSUPPORTED                        = -1010,\r
-                    MEDIA_ERROR_MALFORMED                          = -1007,\r
-                    MEDIA_ERROR_IO                                 = -1004,\r
-                    MEDIA_ERROR_TIMED_OUT                          = -110,\r
-                    MEDIA_ERROR_UNKNOWN                            = 1,\r
-                    MEDIA_ERROR_SERVER_DIED                        = 100,\r
-                    MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200\r
-                };\r
-\r
-                switch (code)\r
-                {\r
-                    case MEDIA_ERROR_UNSUPPORTED:                        return "Unsupported bitstream";\r
-                    case MEDIA_ERROR_MALFORMED:                          return "Malformed bitstream";\r
-                    case MEDIA_ERROR_IO:                                 return "File/Network I/O error";\r
-                    case MEDIA_ERROR_TIMED_OUT:                          return "Timed out";\r
-                    case MEDIA_ERROR_UNKNOWN:                            return "Unknown error";\r
-                    case MEDIA_ERROR_SERVER_DIED:                        return "Media server died (playback restart required)";\r
-                    case MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: return "Video container not valid for progressive playback";\r
-                    default:                                             return "";\r
-                }\r
-            }\r
-\r
-            //==============================================================================\r
-            static StringArray getNativeMediaPlayerListenerInterfaces()\r
-            {\r
-                #define IFPREFIX "android/media/MediaPlayer$"\r
-\r
-                return { IFPREFIX "OnCompletionListener", IFPREFIX "OnErrorListener",\r
-                         IFPREFIX "OnInfoListener", IFPREFIX "OnPreparedListener",\r
-                         IFPREFIX "OnBufferingUpdateListener", IFPREFIX "OnSeekCompleteListener"\r
-                };\r
-\r
-                #undef IFPREFIX\r
-            }\r
-        };\r
-\r
-        //==============================================================================\r
-        Pimpl& owner;\r
-\r
-        int sdkVersion;\r
-\r
-        GlobalRef audioAttributes;\r
-        GlobalRef nativeMediaSession;\r
-        GlobalRef mediaSessionCallback;\r
-        GlobalRef playbackStateBuilder;\r
-\r
-        Controller controller;\r
-        Player player;\r
-\r
-        GlobalRef audioManager;\r
-        AudioManagerOnAudioFocusChangeListener audioFocusChangeListener;\r
-        GlobalRef nativeAudioFocusChangeListener;\r
-        GlobalRef audioFocusRequest;\r
-\r
-        GlobalRef storedPlaybackState;\r
-\r
-        bool pendingSeekRequest = false;\r
-\r
-        bool playerBufferingInProgress = false;\r
-        bool usesBuffering = false;\r
-        SparseSet<int> bufferedRegions;\r
-\r
-        double playSpeedMult = 1.0;\r
-        bool hasAudioFocus = false;\r
-\r
-        //==============================================================================\r
-        // MediaSession callbacks\r
-\r
-        void pauseCallback()\r
-        {\r
-            JUCE_VIDEO_LOG ("MediaSession::pauseCallback()");\r
-\r
-            player.pause();\r
-            updatePlaybackState();\r
-\r
-            abandonAudioFocus();\r
-        }\r
-\r
-        void playCallback()\r
-        {\r
-            JUCE_VIDEO_LOG ("MediaSession::playCallback()");\r
-\r
-            requestAudioFocus();\r
-\r
-            if (! hasAudioFocus)\r
-            {\r
-                errorOccurred ("Application has been denied audio focus. Try again later.");\r
-                return;\r
-            }\r
-\r
-            getEnv()->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setActive, true);\r
-\r
-            player.play();\r
-            setSpeed (playSpeedMult);\r
-            updatePlaybackState();\r
-        }\r
-\r
-        void playFromMediaIdCallback (jstring mediaId, jobject extras)\r
-        {\r
-            JUCE_VIDEO_LOG ("MediaSession::playFromMediaIdCallback()");\r
-\r
-            player.load (mediaId, extras);\r
-            updatePlaybackState();\r
-        }\r
-\r
-        void seekToCallback (jlong pos)\r
-        {\r
-            JUCE_VIDEO_LOG ("MediaSession::seekToCallback()");\r
-\r
-            pendingSeekRequest = true;\r
-            player.setPlayPosition ((jint) pos);\r
-            updatePlaybackState();\r
-        }\r
-\r
-        void stopCallback()\r
-        {\r
-            JUCE_VIDEO_LOG ("MediaSession::stopCallback()");\r
-\r
-            auto* env = getEnv();\r
-\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setActive, false);\r
-\r
-            player.closeVideo();\r
-            updatePlaybackState();\r
-\r
-            abandonAudioFocus();\r
-\r
-            owner.closeVideoFinished();\r
-        }\r
-\r
-        //==============================================================================\r
-        bool isSeekInProgress() const noexcept\r
-        {\r
-            if (pendingSeekRequest)\r
-                return true;\r
-\r
-            if (! usesBuffering)\r
-                return false;\r
-\r
-            // NB: player sometimes notifies us about buffering, but only for regions that\r
-            // were previously buffered already. For buffering happening for the first time,\r
-            // we don't get such notification...\r
-            if (playerBufferingInProgress)\r
-                return true;\r
-\r
-            auto playPos = player.getPlayPosition();\r
-            auto durationMs = player.getVideoDuration();\r
-            auto playPosPercent = (int) (100 * playPos / static_cast<double> (durationMs));\r
-\r
-            // NB: assuming the playback will start roughly when there is 5% of content loaded...\r
-            return ! bufferedRegions.containsRange (Range<int> (playPosPercent, jmin (101, playPosPercent + 5)));\r
-        }\r
-\r
-        void updatePlaybackState()\r
-        {\r
-            getEnv()->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setPlaybackState, getCurrentPlaybackState());\r
-        }\r
-\r
-        jobject getCurrentPlaybackState()\r
-        {\r
-            static constexpr int bufferingState = 6;\r
-\r
-            auto playbackStateFlag = isSeekInProgress() ? bufferingState : player.getPlaybackStateFlag();\r
-            auto playPos = player.getPlayPosition();\r
-            auto playSpeed = player.getPlaySpeed();\r
-            auto allowedActions = player.getAllowedActions();\r
-\r
-            auto* env = getEnv();\r
-\r
-            LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.setState,\r
-                                                      (jint) playbackStateFlag, (jlong) playPos, (jfloat) playSpeed));\r
-\r
-            LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.setActions, (jint) allowedActions));\r
-\r
-            return env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.build);\r
-        }\r
-\r
-        //==============================================================================\r
-        void playerPrepared()\r
-        {\r
-            resetState();\r
-\r
-            updateMetadata();\r
-\r
-            owner.loadFinished();\r
-        }\r
-\r
-        void playerBufferingStarted() { playerBufferingInProgress = true; }\r
-        void playerBufferingEnded()   { playerBufferingInProgress = false; }\r
-\r
-        void playerBufferingUpdated (int progress)\r
-        {\r
-            usesBuffering = true;\r
-\r
-            updatePlaybackState();\r
-\r
-            auto playPos = player.getPlayPosition();\r
-            auto durationMs = player.getVideoDuration();\r
-            auto playPosPercent = (int) (100 * playPos / static_cast<double> (durationMs));\r
-\r
-            bufferedRegions.addRange (Range<int> (playPosPercent, progress + 1));\r
-\r
-            String ranges;\r
-\r
-            for (auto& r : bufferedRegions.getRanges())\r
-                ranges << "[" << r.getStart() << "%, " << r.getEnd() - 1 << "%] ";\r
-\r
-            JUCE_VIDEO_LOG ("Buffering status update, seek pos: " + String (playPosPercent) + "%, buffered regions: " + ranges);\r
-        }\r
-\r
-        void playerSeekCompleted()\r
-        {\r
-            pendingSeekRequest = false;\r
-            updatePlaybackState();\r
-        }\r
-\r
-        void playerPlaybackCompleted()\r
-        {\r
-            pauseCallback();\r
-            seekToCallback ((jlong) 0);\r
-        }\r
-\r
-        void updateMetadata()\r
-        {\r
-            auto* env = getEnv();\r
-\r
-            auto metadataBuilder = LocalRef<jobject> (env->NewObject (AndroidMediaMetadataBuilder,\r
-                                                                      AndroidMediaMetadataBuilder.constructor));\r
-\r
-            auto durationMs = player.getVideoDuration();\r
-\r
-            auto jDurationKey = javaString ("android.media.metadata.DURATION");\r
-            LocalRef<jobject> (env->CallObjectMethod (metadataBuilder,\r
-                                                      AndroidMediaMetadataBuilder.putLong,\r
-                                                      jDurationKey.get(),\r
-                                                      (jlong) durationMs));\r
-\r
-            auto jNumTracksKey = javaString ("android.media.metadata.NUM_TRACKS");\r
-            LocalRef<jobject> (env->CallObjectMethod (metadataBuilder,\r
-                                                      AndroidMediaMetadataBuilder.putLong,\r
-                                                      jNumTracksKey.get(),\r
-                                                      (jlong) 1));\r
-\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setMetadata,\r
-                                 env->CallObjectMethod (metadataBuilder, AndroidMediaMetadataBuilder.build));\r
-        }\r
-\r
-        void errorOccurred (const String& errorMessage)\r
-        {\r
-            auto* env = getEnv();\r
-\r
-            // Propagate error to session controller(s) and ...\r
-            LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.setErrorMessage,\r
-                                                      javaString (errorMessage).get()));\r
-\r
-            auto state = LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.build));\r
-            env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setPlaybackState, state.get());\r
-\r
-            // ...also notify JUCE side client\r
-            owner.errorOccurred (errorMessage);\r
-        }\r
-\r
-        //==============================================================================\r
-        static jobject createAudioFocusRequestIfNecessary (int sdkVersion, const GlobalRef& audioAttributes,\r
-                                                           const GlobalRef& nativeAudioFocusChangeListener)\r
-        {\r
-            if (sdkVersion < 26)\r
-                return nullptr;\r
-\r
-            auto* env = getEnv();\r
-\r
-            auto requestBuilderClass = LocalRef<jclass> (env->FindClass ("android/media/AudioFocusRequest$Builder"));\r
-\r
-            static jmethodID constructor = env->GetMethodID (requestBuilderClass, "<init>", "(I)V");\r
-            static jmethodID buildMethod = env->GetMethodID (requestBuilderClass, "build", "()Landroid/media/AudioFocusRequest;");\r
-            static jmethodID setAudioAttributesMethod = env->GetMethodID (requestBuilderClass, "setAudioAttributes",\r
-                                                                          "(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;");\r
-            static jmethodID setOnAudioFocusChangeListenerMethod = env->GetMethodID (requestBuilderClass, "setOnAudioFocusChangeListener",\r
-                                                                                     "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder;");\r
-\r
-            static constexpr jint audioFocusGain = 1;\r
-\r
-            auto requestBuilder = LocalRef<jobject> (env->NewObject (requestBuilderClass, constructor, audioFocusGain));\r
-            LocalRef<jobject> (env->CallObjectMethod (requestBuilder, setAudioAttributesMethod, audioAttributes.get()));\r
-            LocalRef<jobject> (env->CallObjectMethod (requestBuilder, setOnAudioFocusChangeListenerMethod, nativeAudioFocusChangeListener.get()));\r
-\r
-            return env->CallObjectMethod (requestBuilder, buildMethod);\r
-        }\r
-\r
-        void requestAudioFocus()\r
-        {\r
-            static constexpr jint audioFocusGain = 1;\r
-            static constexpr jint streamMusic = 3;\r
-            static constexpr jint audioFocusRequestGranted = 1;\r
-\r
-            jint result = audioFocusRequestGranted;\r
-\r
-            if (sdkVersion >= 26)\r
-            {\r
-                static jmethodID requestAudioFocusMethod = getEnv()->GetMethodID (AndroidAudioManager, "requestAudioFocus",\r
-                                                                                  "(Landroid/media/AudioFocusRequest;)I");\r
-\r
-                result = getEnv()->CallIntMethod (audioManager, requestAudioFocusMethod, audioFocusRequest.get());\r
-            }\r
-            else\r
-            {\r
-                result = getEnv()->CallIntMethod (audioManager, AndroidAudioManager.requestAudioFocus,\r
-                                                  nativeAudioFocusChangeListener.get(), streamMusic, audioFocusGain);\r
-            }\r
-\r
-            hasAudioFocus = result == audioFocusRequestGranted;\r
-        }\r
-\r
-        void abandonAudioFocus()\r
-        {\r
-            if (! hasAudioFocus)\r
-                return;\r
-\r
-            static constexpr jint audioFocusRequestGranted = 1;\r
-\r
-            jint result = audioFocusRequestGranted;\r
-\r
-            if (sdkVersion >= 26)\r
-            {\r
-                static jmethodID abandonAudioFocusMethod = getEnv()->GetMethodID (AndroidAudioManager, "abandonAudioFocusRequest",\r
-                                                                                  "(Landroid/media/AudioFocusRequest;)I");\r
-\r
-                result = getEnv()->CallIntMethod (audioManager, abandonAudioFocusMethod, audioFocusRequest.get());\r
-            }\r
-            else\r
-            {\r
-                result = getEnv()->CallIntMethod (audioManager, AndroidAudioManager.abandonAudioFocus,\r
-                                                   nativeAudioFocusChangeListener.get());\r
-            }\r
-\r
-            // NB: granted in this case means "granted to change the focus to abandoned"...\r
-            hasAudioFocus = result != audioFocusRequestGranted;\r
-        }\r
-\r
-        void onAudioFocusChange (int changeType) override\r
-        {\r
-            static constexpr jint audioFocusGain = 1;\r
-\r
-            if (changeType == audioFocusGain)\r
-                JUCE_VIDEO_LOG ("Audio focus gained");\r
-            else\r
-                JUCE_VIDEO_LOG ("Audio focus lost");\r
-\r
-            if (changeType != audioFocusGain)\r
-            {\r
-                if (isPlaying())\r
-                {\r
-                    JUCE_VIDEO_LOG ("Received a request to abandon audio focus. Stopping playback...");\r
-                    stop();\r
-                }\r
-\r
-                abandonAudioFocus();\r
-            }\r
-        }\r
-\r
-        //==============================================================================\r
-        void playbackStarted()\r
-        {\r
-            owner.playbackStarted();\r
-        }\r
-\r
-        void playbackStopped()\r
-        {\r
-            owner.playbackStopped();\r
-        }\r
-\r
-        //==============================================================================\r
-        void resetState()\r
-        {\r
-            usesBuffering = false;\r
-            bufferedRegions.clear();\r
-            playerBufferingInProgress = false;\r
-\r
-            pendingSeekRequest = false;\r
-\r
-            playSpeedMult = 1.0;\r
-            hasAudioFocus = false;\r
-        }\r
-\r
-        //==============================================================================\r
-        static jobject getAudioAttributes()\r
-        {\r
-            auto* env = getEnv();\r
-\r
-            auto audioAttribsBuilder = LocalRef<jobject> (env->NewObject (AndroidAudioAttributesBuilder,\r
-                                                                          AndroidAudioAttributesBuilder.constructor));\r
-            static constexpr jint contentTypeMovie = 3;\r
-            static constexpr jint usageMedia = 1;\r
-\r
-            LocalRef<jobject> (env->CallObjectMethod (audioAttribsBuilder, AndroidAudioAttributesBuilder.setContentType, contentTypeMovie));\r
-            LocalRef<jobject> (env->CallObjectMethod (audioAttribsBuilder, AndroidAudioAttributesBuilder.setUsage, usageMedia));\r
-\r
-            return env->CallObjectMethod (audioAttribsBuilder, AndroidAudioAttributesBuilder.build);\r
-        }\r
-\r
-        friend void juce_mediaSessionPause (int64);\r
-        friend void juce_mediaSessionPlay (int64);\r
-        friend void juce_mediaSessionPlayFromMediaId (int64, void*, void*);\r
-        friend void juce_mediaSessionSeekTo (int64, int64);\r
-        friend void juce_mediaSessionStop (int64);\r
-\r
-        friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
-        friend void juce_mediaControllerMetadataChanged (int64, void*);\r
-        friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
-        friend void juce_mediaControllerSessionDestroyed (int64);\r
-    };\r
-\r
-   #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-    //==============================================================================\r
-    class SystemVolumeListener\r
-    {\r
-    public:\r
-        SystemVolumeListener (Pimpl& ownerToUse)\r
-            : owner (ownerToUse),\r
-              nativeObserver (LocalRef<jobject> (getEnv()->NewObject (SystemVolumeObserver,\r
-                                                                      SystemVolumeObserver.constructor,\r
-                                                                      android.activity.get(),\r
-                                                                      android.activity.get(),\r
-                                                                      reinterpret_cast<jlong> (this))))\r
-        {\r
-            setEnabled (true);\r
-        }\r
-\r
-        ~SystemVolumeListener()\r
-        {\r
-            setEnabled (false);\r
-        }\r
-\r
-        void setEnabled (bool shouldBeEnabled)\r
-        {\r
-            getEnv()->CallVoidMethod (nativeObserver, SystemVolumeObserver.setEnabled, shouldBeEnabled);\r
-\r
-            // Send first notification instantly to ensure sync.\r
-            if (shouldBeEnabled)\r
-                systemVolumeChanged();\r
-        }\r
-\r
-    private:\r
-        Pimpl& owner;\r
-        GlobalRef nativeObserver;\r
-\r
-        void systemVolumeChanged()\r
-        {\r
-            WeakReference<SystemVolumeListener> weakThis (this);\r
-\r
-            MessageManager::callAsync ([weakThis]() mutable\r
-                                       {\r
-                                           if (weakThis == nullptr)\r
-                                               return;\r
-\r
-                                           if (weakThis->owner.owner.onGlobalMediaVolumeChanged != nullptr)\r
-                                               weakThis->owner.owner.onGlobalMediaVolumeChanged();\r
-                                       });\r
-        }\r
-\r
-        friend void juce_mediaSessionSystemVolumeChanged (int64);\r
-\r
-        JUCE_DECLARE_WEAK_REFERENCEABLE (SystemVolumeListener)\r
-    };\r
-   #endif\r
-\r
-    //==============================================================================\r
-    VideoComponent& owner;\r
-\r
-    MediaSession mediaSession;\r
-    AppPausedResumedListener appPausedResumedListener;\r
-    GlobalRef appPausedResumedListenerNative;\r
-   #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-    SystemVolumeListener systemVolumeListener;\r
-   #endif\r
-\r
-    std::function<void (const URL&, Result)> loadFinishedCallback;\r
-\r
-    bool wasOpen = false;\r
-\r
-    //==============================================================================\r
-    void loadFinished()\r
-    {\r
-        owner.resized();\r
-\r
-        if (loadFinishedCallback != nullptr)\r
-        {\r
-            loadFinishedCallback (currentURL, Result::ok());\r
-            loadFinishedCallback = nullptr;\r
-        }\r
-    }\r
-\r
-    void closeVideoFinished()\r
-    {\r
-        owner.resized();\r
-    }\r
-\r
-    void errorOccurred (const String& errorMessage)\r
-    {\r
-        if (owner.onErrorOccurred != nullptr)\r
-            owner.onErrorOccurred (errorMessage);\r
-    }\r
-\r
-    void playbackStarted()\r
-    {\r
-        if (owner.onPlaybackStarted != nullptr)\r
-            owner.onPlaybackStarted();\r
-    }\r
-\r
-    void playbackStopped()\r
-    {\r
-        if (owner.onPlaybackStopped != nullptr)\r
-            owner.onPlaybackStopped();\r
-    }\r
-\r
-    void videoSurfaceChanged (jobject surfaceHolder)\r
-    {\r
-        mediaSession.setDisplay (surfaceHolder);\r
-    }\r
-\r
-    void videoSurfaceDestroyed (jobject /*surfaceHolder*/)\r
-    {\r
-        mediaSession.setDisplay (nullptr);\r
-    }\r
-\r
-    //==============================================================================\r
-    void appPaused() override\r
-    {\r
-        wasOpen = isOpen();\r
-\r
-        if (! wasOpen)\r
-            return;\r
-\r
-        JUCE_VIDEO_LOG ("App paused, releasing media player...");\r
-\r
-        mediaSession.storeState();\r
-        mediaSession.closeVideo();\r
-\r
-       #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-        systemVolumeListener.setEnabled (false);\r
-       #endif\r
-    }\r
-\r
-    void appResumed() override\r
-    {\r
-        if (! wasOpen)\r
-            return;\r
-\r
-        JUCE_VIDEO_LOG ("App resumed, restoring media player...");\r
-\r
-        loadAsync (currentURL, [this](const URL&, Result r)\r
-                   {\r
-                       if (r.wasOk())\r
-                           mediaSession.restoreState();\r
-                   });\r
-\r
-       #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-        systemVolumeListener.setEnabled (true);\r
-       #endif\r
-    }\r
-\r
-    //==============================================================================\r
-    friend void juce_surfaceChangedNativeVideo (int64, void*);\r
-    friend void juce_surfaceDestroyedNativeVideo (int64, void*);\r
-\r
-    friend void juce_mediaSessionPause (int64);\r
-    friend void juce_mediaSessionPlay (int64);\r
-    friend void juce_mediaSessionPlayFromMediaId (int64, void*, void*);\r
-    friend void juce_mediaSessionSeekTo (int64, int64);\r
-    friend void juce_mediaSessionStop (int64);\r
-\r
-    friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
-    friend void juce_mediaControllerMetadataChanged (int64, void*);\r
-    friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
-    friend void juce_mediaControllerSessionDestroyed (int64);\r
-\r
-    friend void juce_mediaSessionSystemVolumeChanged (int64);\r
-   #endif\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)\r
-};\r
-\r
-#if __ANDROID_API__ >= 21\r
-//==============================================================================\r
-void juce_surfaceChangedNativeVideo (int64 host, void* surfaceHolder)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl*> (host)->videoSurfaceChanged (static_cast<jobject> (surfaceHolder));\r
-}\r
-\r
-void juce_surfaceDestroyedNativeVideo (int64 host, void* surfaceHolder)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl*> (host)->videoSurfaceDestroyed (static_cast<jobject> (surfaceHolder));\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), dispatchDrawNativeVideo,\r
-                   void, (JNIEnv* env, jobject nativeView, jlong host, jobject canvas))\r
-{\r
-    ignoreUnused (nativeView, host, canvas);\r
-    setEnv (env);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), surfaceChangedNativeVideo,\r
-                   void, (JNIEnv* env, jobject nativeView, jlong host, jobject holder, jint format, jint width, jint height))\r
-{\r
-    ignoreUnused (nativeView, format, width, height);\r
-    setEnv (env);\r
-\r
-    JUCE_VIDEO_LOG ("video surface changed");\r
-\r
-    juce_surfaceChangedNativeVideo (host, holder);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), surfaceCreatedNativeVideo,\r
-                   void, (JNIEnv* env, jobject nativeView, jlong host, jobject holder))\r
-{\r
-    ignoreUnused (nativeView, host, holder);\r
-    setEnv (env);\r
-\r
-    JUCE_VIDEO_LOG ("video surface created");\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), surfaceDestroyedNativeVideo,\r
-                   void, (JNIEnv* env, jobject nativeView, jlong host, jobject holder))\r
-{\r
-    ignoreUnused (nativeView, host, holder);\r
-    setEnv (env);\r
-\r
-    JUCE_VIDEO_LOG ("video surface destroyed");\r
-    juce_surfaceDestroyedNativeVideo (host, holder);\r
-}\r
-\r
-//==============================================================================\r
-void juce_mediaSessionPause (int64 host)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->pauseCallback();\r
-}\r
-\r
-void juce_mediaSessionPlay (int64 host)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->playCallback();\r
-}\r
-\r
-void juce_mediaSessionPlayFromMediaId (int64 host, void* mediaId, void* extras)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->playFromMediaIdCallback ((jstring) mediaId, (jobject) extras);\r
-}\r
-\r
-void juce_mediaSessionSeekTo (int64 host, int64 pos)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->seekToCallback (pos);\r
-}\r
-\r
-void juce_mediaSessionStop (int64 host)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->stopCallback();\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionPause,\r
-                   void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host))\r
-{\r
-    setEnv (env);\r
-    juce_mediaSessionPause (host);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionPlay,\r
-                   void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host))\r
-{\r
-    setEnv (env);\r
-    juce_mediaSessionPlay (host);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionPlayFromMediaId,\r
-                   void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host, jobject mediaId, jobject extras))\r
-{\r
-    setEnv (env);\r
-    juce_mediaSessionPlayFromMediaId (host, mediaId, extras);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionSeekTo,\r
-                   void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host, jlong pos))\r
-{\r
-    setEnv (env);\r
-    juce_mediaSessionSeekTo (host, pos);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionStop,\r
-                   void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host))\r
-{\r
-    setEnv (env);\r
-    juce_mediaSessionStop (host);\r
-}\r
-\r
-//==============================================================================\r
-void juce_mediaControllerAudioInfoChanged (int64 host, void* info)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->audioInfoChanged ((jobject) info);\r
-}\r
-\r
-void juce_mediaControllerMetadataChanged (int64 host, void* metadata)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->metadataChanged ((jobject) metadata);\r
-}\r
-\r
-void juce_mediaControllerPlaybackStateChanged (int64 host, void* state)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->playbackStateChanged ((jobject) state);\r
-}\r
-\r
-void juce_mediaControllerSessionDestroyed (int64 host)\r
-{\r
-    reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->sessionDestroyed();\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerAudioInfoChanged,\r
-                   void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host, jobject playbackInfo))\r
-{\r
-    setEnv (env);\r
-    juce_mediaControllerAudioInfoChanged (host, playbackInfo);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerMetadataChanged,\r
-                   void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host, jobject metadata))\r
-{\r
-    setEnv (env);\r
-    juce_mediaControllerMetadataChanged (host, metadata);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerPlaybackStateChanged,\r
-                   void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host, jobject playbackState))\r
-{\r
-    setEnv (env);\r
-    juce_mediaControllerPlaybackStateChanged (host, playbackState);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerSessionDestroyed,\r
-                   void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host))\r
-{\r
-    setEnv (env);\r
-    juce_mediaControllerSessionDestroyed (host);\r
-}\r
-\r
-//==============================================================================\r
-void juce_mediaSessionSystemVolumeChanged (int64 host)\r
-{\r
-   #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-    reinterpret_cast<VideoComponent::Pimpl::SystemVolumeListener*> (host)->systemVolumeChanged();\r
-   #else\r
-    ignoreUnused (host);\r
-   #endif\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024SystemVolumeObserver), mediaSessionSystemVolumeChanged,\r
-                   void, (JNIEnv* env, jobject /*systemSettingsObserver*/, jlong host))\r
-{\r
-    setEnv (env);\r
-    juce_mediaSessionSystemVolumeChanged (host);\r
-}\r
-\r
-//==============================================================================\r
-constexpr VideoComponent::Pimpl::MediaSession::Player::StateInfo VideoComponent::Pimpl::MediaSession::Player::stateInfos[];\r
-#endif\r
index 233775c3de015b09e855bf8a7e1d49619b4c9238..8724b192703d1a728cd26878bae638d8f155f6a9 100644 (file)
@@ -402,7 +402,7 @@ private:
             dispatch_async (captureSessionQueue,^\r
                             {\r
                                 cameraDevice = [AVCaptureDevice deviceWithUniqueID: juceStringToNS (cameraIdToUse)];\r
-                                auto audioDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];\r
+                                auto* audioDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];\r
 \r
                                 [captureSession.get() beginConfiguration];\r
 \r
@@ -507,8 +507,8 @@ private:
         {\r
             NSError* error = nil;\r
 \r
-            auto input = [AVCaptureDeviceInput deviceInputWithDevice: device\r
-                                                               error: &error];\r
+            auto* input = [AVCaptureDeviceInput deviceInputWithDevice: device\r
+                                                                error: &error];\r
 \r
             if (error != nil)\r
                 return nsStringToJuce (error.localizedDescription);\r
@@ -629,7 +629,7 @@ private:
                     if (Pimpl::getIOSVersion().major >= 10 && [captureOutput isKindOfClass: [AVCapturePhotoOutput class]])\r
                     {\r
                         auto* photoOutput = (AVCapturePhotoOutput*) captureOutput;\r
-                        auto outputConnection = [photoOutput connectionWithMediaType: AVMediaTypeVideo];\r
+                        auto* outputConnection = [photoOutput connectionWithMediaType: AVMediaTypeVideo];\r
                         outputConnection.videoOrientation = orientationToUse;\r
 \r
                         [photoOutput capturePhotoWithSettings: [AVCapturePhotoSettings photoSettings]\r
@@ -640,7 +640,7 @@ private:
                    #endif\r
 \r
                     auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput;\r
-                    auto outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo];\r
+                    auto* outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo];\r
                     outputConnection.videoOrientation = orientationToUse;\r
 \r
                     [stillImageOutput captureStillImageAsynchronouslyFromConnection: connection completionHandler:\r
@@ -925,7 +925,7 @@ private:
                     }\r
 \r
                     NSData* origImageData = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer: imageBuffer previewPhotoSampleBuffer: imagePreviewBuffer];\r
-                    auto origImage = [UIImage imageWithData: origImageData];\r
+                    auto* origImage = [UIImage imageWithData: origImageData];\r
                     auto imageOrientation = uiImageOrientationToCGImageOrientation (origImage.imageOrientation);\r
 \r
                     auto* uiImage = getImageWithCorrectOrientation (imageOrientation, origImage.CGImage);\r
@@ -1009,10 +1009,10 @@ private:
                 if (Pimpl::getIOSVersion().major >= 10)\r
                     printVideoOutputDebugInfo (movieFileOutput);\r
 \r
-                auto url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName())\r
-                                      isDirectory: NO];\r
+                auto* url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName())\r
+                                       isDirectory: NO];\r
 \r
-                auto outputConnection = [movieFileOutput connectionWithMediaType: AVMediaTypeVideo];\r
+                auto* outputConnection = [movieFileOutput connectionWithMediaType: AVMediaTypeVideo];\r
                 outputConnection.videoOrientation = orientationToUse;\r
 \r
                 [movieFileOutput startRecordingToOutputFileURL: url recordingDelegate: delegate.get()];\r
@@ -1307,7 +1307,7 @@ struct CameraDevice::ViewerComponent  : public UIViewComponent
         // Initial size that can be overriden later.\r
         setSize (640, 480);\r
 \r
-        auto view = [cls.createInstance() init];\r
+        auto* view = [cls.createInstance() init];\r
         setView (view);\r
 \r
         auto* previewLayer = device.pimpl->captureSession.createPreviewLayer();\r
index e22e14861d2f12a97b54879fec005242715ea068..e60b59b095f1c9b497ff746b9abf2ffa8c20f8e7 100644 (file)
@@ -71,7 +71,7 @@ struct CameraDevice::Pimpl
         if (imageOutput == nil)\r
         {\r
             imageOutput = [[AVCaptureStillImageOutput alloc] init];\r
-            auto imageSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];\r
+            auto* imageSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];\r
             [imageOutput setOutputSettings: imageSettings];\r
             [imageSettings release];\r
             [session addOutput: imageOutput];\r
@@ -177,9 +177,6 @@ struct CameraDevice::Pimpl
     {\r
         const ScopedLock sl (listenerLock);\r
         listeners.call ([=] (Listener& l) { l.imageReceived (image); });\r
-\r
-        if (! listeners.isEmpty())\r
-            triggerImageCapture();\r
     }\r
 \r
     void triggerImageCapture()\r
index 8d47c1c2255a4e9183a310b7f9b826fc1ec59b23..c6d50e76ed655e5270006c00515bc55da50189d7 100644 (file)
@@ -2,7 +2,7 @@
   ==============================================================================\r
 \r
    This file is part of the JUCE library.\r
-   Copyright (c) 2018 - ROLI Ltd.\r
+   Copyright (c) 2015 - ROLI Ltd.\r
 \r
    Permission is granted to use this software under the terms of either:\r
    a) the GPL v2 (or any later version)\r
   ==============================================================================\r
 */\r
 \r
-#if JUCE_MAC\r
-using Base = NSViewComponent;\r
+#if JUCE_IOS\r
+ using BaseClass = UIViewComponent;\r
 #else\r
-using Base = UIViewComponent;\r
+ using BaseClass = NSViewComponent;\r
 #endif\r
 \r
-struct VideoComponent::Pimpl   : public Base\r
+struct VideoComponent::Pimpl   : public BaseClass\r
 {\r
-    Pimpl (VideoComponent& ownerToUse, bool useNativeControlsIfAvailable)\r
-        : owner (ownerToUse),\r
-          playerController (*this, useNativeControlsIfAvailable)\r
+    Pimpl()\r
     {\r
         setVisible (true);\r
 \r
-        auto* view = playerController.getView();\r
+       #if JUCE_MAC && JUCE_32BIT\r
+        auto view = [[NSView alloc] init];  // 32-bit builds don't have AVPlayerView, so need to use a layer\r
+        controller = [[AVPlayerLayer alloc] init];\r
         setView (view);\r
-\r
-       #if JUCE_MAC\r
         [view setNextResponder: [view superview]];\r
         [view setWantsLayer: YES];\r
+        [view setLayer: controller];\r
+        [view release];\r
+       #elif JUCE_MAC\r
+        controller = [[AVPlayerView alloc] init];\r
+        setView (controller);\r
+        [controller setNextResponder: [controller superview]];\r
+        [controller setWantsLayer: YES];\r
+       #else\r
+        controller = [[AVPlayerViewController alloc] init];\r
+        setView ([controller view]);\r
        #endif\r
     }\r
 \r
@@ -49,6 +57,7 @@ struct VideoComponent::Pimpl   : public Base
     {\r
         close();\r
         setView (nil);\r
+        [controller release];\r
     }\r
 \r
     Result load (const File& file)\r
@@ -76,49 +85,37 @@ struct VideoComponent::Pimpl   : public Base
         if (url != nil)\r
         {\r
             close();\r
-            return playerController.load (url);\r
-        }\r
 \r
-        return Result::fail ("Couldn't open movie");\r
-    }\r
-\r
-    void loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)\r
-    {\r
-        if (url.isEmpty())\r
-        {\r
-            jassertfalse;\r
-            return;\r
+            if (auto* player = [AVPlayer playerWithURL: url])\r
+            {\r
+                [controller setPlayer: player];\r
+                return Result::ok();\r
+            }\r
         }\r
 \r
-        currentURL = url;\r
-\r
-        jassert (callback != nullptr);\r
-\r
-        loadFinishedCallback = std::move (callback);\r
-\r
-        playerController.loadAsync (url);\r
+        return Result::fail ("Couldn't open movie");\r
     }\r
 \r
     void close()\r
     {\r
         stop();\r
-        playerController.close();\r
+        [controller setPlayer: nil];\r
         currentFile = File();\r
         currentURL = {};\r
     }\r
 \r
-    bool isOpen() const noexcept        { return playerController.getPlayer() != nil; }\r
+    bool isOpen() const noexcept        { return getAVPlayer() != nil; }\r
     bool isPlaying() const noexcept     { return getSpeed() != 0; }\r
 \r
-    void play() noexcept                { [playerController.getPlayer() play]; setSpeed (playSpeedMult); }\r
-    void stop() noexcept                { [playerController.getPlayer() pause]; }\r
+    void play() noexcept                { [getAVPlayer() play]; }\r
+    void stop() noexcept                { [getAVPlayer() pause]; }\r
 \r
     void setPosition (double newPosition)\r
     {\r
-        if (auto* p = playerController.getPlayer())\r
+        if (auto* p = getAVPlayer())\r
         {\r
             CMTime t = { (CMTimeValue) (100000.0 * newPosition),\r
-                         (CMTimeScale) 100000, kCMTimeFlags_Valid, {} };\r
+                         (CMTimeScale) 100000, kCMTimeFlags_Valid };\r
 \r
             [p seekToTime: t\r
           toleranceBefore: kCMTimeZero\r
@@ -128,7 +125,7 @@ struct VideoComponent::Pimpl   : public Base
 \r
     double getPosition() const\r
     {\r
-        if (auto* p = playerController.getPlayer())\r
+        if (auto* p = getAVPlayer())\r
             return toSeconds ([p currentTime]);\r
 \r
         return 0.0;\r
@@ -136,16 +133,12 @@ struct VideoComponent::Pimpl   : public Base
 \r
     void setSpeed (double newSpeed)\r
     {\r
-        playSpeedMult = newSpeed;\r
-\r
-        // Calling non 0.0 speed on a paused player would start it...\r
-        if (isPlaying())\r
-            [playerController.getPlayer() setRate: (float) playSpeedMult];\r
+        [getAVPlayer() setRate: (float) newSpeed];\r
     }\r
 \r
     double getSpeed() const\r
     {\r
-        if (auto* p = playerController.getPlayer())\r
+        if (auto* p = getAVPlayer())\r
             return [p rate];\r
 \r
         return 0.0;\r
@@ -153,9 +146,9 @@ struct VideoComponent::Pimpl   : public Base
 \r
     Rectangle<int> getNativeSize() const\r
     {\r
-        if (auto* p = playerController.getPlayer())\r
+        if (auto* player = getAVPlayer())\r
         {\r
-            auto s = [[p currentItem] presentationSize];\r
+            auto s = [[player currentItem] presentationSize];\r
             return { (int) s.width, (int) s.height };\r
         }\r
 \r
@@ -164,20 +157,20 @@ struct VideoComponent::Pimpl   : public Base
 \r
     double getDuration() const\r
     {\r
-        if (auto* p = playerController.getPlayer())\r
-            return toSeconds ([[p currentItem] duration]);\r
+        if (auto* player = getAVPlayer())\r
+            return toSeconds ([[player currentItem] duration]);\r
 \r
         return 0.0;\r
     }\r
 \r
     void setVolume (float newVolume)\r
     {\r
-        [playerController.getPlayer() setVolume: newVolume];\r
+        [getAVPlayer() setVolume: newVolume];\r
     }\r
 \r
     float getVolume() const\r
     {\r
-        if (auto* p = playerController.getPlayer())\r
+        if (auto* p = getAVPlayer())\r
             return [p volume];\r
 \r
         return 0.0f;\r
@@ -187,633 +180,20 @@ struct VideoComponent::Pimpl   : public Base
     URL currentURL;\r
 \r
 private:\r
-    //==============================================================================\r
-    template <typename Derived>\r
-    class PlayerControllerBase\r
-    {\r
-    public:\r
-        ~PlayerControllerBase()\r
-        {\r
-            detachPlayerStatusObserver();\r
-            detachPlaybackObserver();\r
-        }\r
-\r
-    protected:\r
-        //==============================================================================\r
-        struct JucePlayerStatusObserverClass : public ObjCClass<NSObject>\r
-        {\r
-            JucePlayerStatusObserverClass()    : ObjCClass<NSObject> ("JucePlayerStatusObserverClass_")\r
-            {\r
-               #pragma clang diagnostic push\r
-               #pragma clang diagnostic ignored "-Wundeclared-selector"\r
-                addMethod (@selector (observeValueForKeyPath:ofObject:change:context:), valueChanged, "v@:@@@?");\r
-               #pragma clang diagnostic pop\r
-\r
-                addIvar<PlayerAsyncInitialiser*> ("owner");\r
-\r
-                registerClass();\r
-            }\r
-\r
-            //==============================================================================\r
-            static PlayerControllerBase& getOwner (id self) { return *getIvar<PlayerControllerBase*> (self, "owner"); }\r
-            static void setOwner (id self, PlayerControllerBase* p) { object_setInstanceVariable (self, "owner", p); }\r
-\r
-        private:\r
-            static void valueChanged (id self, SEL, NSString* keyPath, id,\r
-                                      NSDictionary<NSKeyValueChangeKey, id>* change, void*)\r
-            {\r
-                auto& owner = getOwner (self);\r
-\r
-                if ([keyPath isEqualToString: nsStringLiteral ("rate")])\r
-                {\r
-                    auto oldRate = [change[NSKeyValueChangeOldKey] floatValue];\r
-                    auto newRate = [change[NSKeyValueChangeNewKey] floatValue];\r
-\r
-                    if (oldRate == 0 && newRate != 0)\r
-                        owner.playbackStarted();\r
-                    else if (oldRate != 0 && newRate == 0)\r
-                        owner.playbackStopped();\r
-                }\r
-                else if ([keyPath isEqualToString: nsStringLiteral ("status")])\r
-                {\r
-                    auto status = [change[NSKeyValueChangeNewKey] intValue];\r
-\r
-                    if (status == AVPlayerStatusFailed)\r
-                        owner.errorOccurred();\r
-                }\r
-            }\r
-        };\r
-\r
-        //==============================================================================\r
-        struct JucePlayerItemPlaybackStatusObserverClass : public ObjCClass<NSObject>\r
-        {\r
-            JucePlayerItemPlaybackStatusObserverClass()    : ObjCClass<NSObject> ("JucePlayerItemPlaybackStatusObserverClass_")\r
-            {\r
-               #pragma clang diagnostic push\r
-               #pragma clang diagnostic ignored "-Wundeclared-selector"\r
-                addMethod (@selector (processNotification:), notificationReceived, "v@:@");\r
-               #pragma clang diagnostic pop\r
-\r
-                addIvar<PlayerControllerBase*> ("owner");\r
-\r
-                registerClass();\r
-            }\r
-\r
-            //==============================================================================\r
-            static PlayerControllerBase& getOwner (id self) { return *getIvar<PlayerControllerBase*> (self, "owner"); }\r
-            static void setOwner (id self, PlayerControllerBase* p) { object_setInstanceVariable (self, "owner", p); }\r
-\r
-        private:\r
-            static void notificationReceived (id self, SEL, NSNotification* notification)\r
-            {\r
-                if ([notification.name isEqualToString: AVPlayerItemDidPlayToEndTimeNotification])\r
-                    getOwner (self).playbackReachedEndTime();\r
-            }\r
-        };\r
-\r
-        //==============================================================================\r
-        class PlayerAsyncInitialiser\r
-        {\r
-        public:\r
-            PlayerAsyncInitialiser (PlayerControllerBase& ownerToUse)\r
-                : owner (ownerToUse),\r
-                  assetKeys ([[NSArray alloc] initWithObjects: nsStringLiteral ("duration"), nsStringLiteral ("tracks"),\r
-                                                               nsStringLiteral ("playable"), nil])\r
-            {\r
-                static JucePlayerItemPreparationStatusObserverClass cls;\r
-                playerItemPreparationStatusObserver.reset ([cls.createInstance() init]);\r
-                JucePlayerItemPreparationStatusObserverClass::setOwner (playerItemPreparationStatusObserver.get(), this);\r
-            }\r
-\r
-            ~PlayerAsyncInitialiser()\r
-            {\r
-                detachPreparationStatusObserver();\r
-            }\r
-\r
-            void loadAsync (URL url)\r
-            {\r
-                auto nsUrl = [NSURL URLWithString: juceStringToNS (url.toString (true))];\r
-                asset.reset ([[AVURLAsset alloc] initWithURL: nsUrl options: nil]);\r
-\r
-                [asset.get() loadValuesAsynchronouslyForKeys: assetKeys.get()\r
-                                           completionHandler: ^() { checkAllKeysReadyFor (asset.get(), url); }];\r
-            }\r
-\r
-        private:\r
-            //==============================================================================\r
-            struct JucePlayerItemPreparationStatusObserverClass : public ObjCClass<NSObject>\r
-            {\r
-                JucePlayerItemPreparationStatusObserverClass()    : ObjCClass<NSObject> ("JucePlayerItemStatusObserverClass_")\r
-                {\r
-                   #pragma clang diagnostic push\r
-                   #pragma clang diagnostic ignored "-Wundeclared-selector"\r
-                    addMethod (@selector (observeValueForKeyPath:ofObject:change:context:), valueChanged, "v@:@@@?");\r
-                   #pragma clang diagnostic pop\r
-\r
-                    addIvar<PlayerAsyncInitialiser*> ("owner");\r
-\r
-                    registerClass();\r
-                }\r
-\r
-                //==============================================================================\r
-                static PlayerAsyncInitialiser& getOwner (id self) { return *getIvar<PlayerAsyncInitialiser*> (self, "owner"); }\r
-                static void setOwner (id self, PlayerAsyncInitialiser* p) { object_setInstanceVariable (self, "owner", p); }\r
-\r
-            private:\r
-                static void valueChanged (id self, SEL, NSString*, id object,\r
-                                          NSDictionary<NSKeyValueChangeKey, id>* change, void* context)\r
-                {\r
-                    auto& owner = getOwner (self);\r
-\r
-                    if (context == &owner)\r
-                    {\r
-                        auto* playerItem = (AVPlayerItem*) object;\r
-                        auto* urlAsset = (AVURLAsset*) playerItem.asset;\r
-\r
-                        URL url (nsStringToJuce (urlAsset.URL.absoluteString));\r
-                        auto oldStatus = [change[NSKeyValueChangeOldKey] intValue];\r
-                        auto newStatus = [change[NSKeyValueChangeNewKey] intValue];\r
-\r
-                        // Ignore spurious notifications\r
-                        if (oldStatus == newStatus)\r
-                            return;\r
-\r
-                        if (newStatus == AVPlayerItemStatusFailed)\r
-                        {\r
-                            auto errorMessage = playerItem.error != nil\r
-                                              ? nsStringToJuce (playerItem.error.localizedDescription)\r
-                                              : String();\r
-\r
-                            owner.notifyOwnerPreparationFinished (url, Result::fail (errorMessage), nullptr);\r
-                        }\r
-                        else if (newStatus == AVPlayerItemStatusReadyToPlay)\r
-                        {\r
-                            owner.notifyOwnerPreparationFinished (url, Result::ok(), owner.player.release());\r
-                        }\r
-                        else\r
-                        {\r
-                            jassertfalse;\r
-                        }\r
-                    }\r
-                }\r
-            };\r
-\r
-            //==============================================================================\r
-            PlayerControllerBase& owner;\r
-\r
-            std::unique_ptr<AVURLAsset, NSObjectDeleter> asset;\r
-            std::unique_ptr<NSArray<NSString*>, NSObjectDeleter> assetKeys;\r
-            std::unique_ptr<AVPlayerItem, NSObjectDeleter> playerItem;\r
-            std::unique_ptr<NSObject, NSObjectDeleter> playerItemPreparationStatusObserver;\r
-            std::unique_ptr<AVPlayer, NSObjectDeleter> player;\r
-\r
-            //==============================================================================\r
-            void checkAllKeysReadyFor (AVAsset* assetToCheck, const URL& url)\r
-            {\r
-                NSError* error = nil;\r
-\r
-                int successCount = 0;\r
-\r
-                for (NSString* key : assetKeys.get())\r
-                {\r
-                    switch ([assetToCheck statusOfValueForKey: key error: &error])\r
-                    {\r
-                        case AVKeyValueStatusLoaded:\r
-                        {\r
-                            ++successCount;\r
-                            break;\r
-                        }\r
-                        case AVKeyValueStatusCancelled:\r
-                        {\r
-                            notifyOwnerPreparationFinished (url, Result::fail ("Loading cancelled"), nullptr);\r
-                            return;\r
-                        }\r
-                        case AVKeyValueStatusFailed:\r
-                        {\r
-                            auto errorMessage = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
-                            notifyOwnerPreparationFinished (url, Result::fail (errorMessage), nullptr);\r
-                            return;\r
-                        }\r
-                        default:\r
-                        {}\r
-                    }\r
-                }\r
-\r
-                jassert (successCount == (int) [assetKeys.get() count]);\r
-                preparePlayerItem();\r
-            }\r
-\r
-            void preparePlayerItem()\r
-            {\r
-                playerItem.reset ([[AVPlayerItem alloc] initWithAsset: asset.get()]);\r
-\r
-                attachPreparationStatusObserver();\r
-\r
-                player.reset ([[AVPlayer alloc] initWithPlayerItem: playerItem.get()]);\r
-            }\r
-\r
-            //==============================================================================\r
-            void attachPreparationStatusObserver()\r
-            {\r
-                [playerItem.get() addObserver: playerItemPreparationStatusObserver.get()\r
-                                   forKeyPath: nsStringLiteral ("status")\r
-                                      options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew\r
-                                      context: this];\r
-            }\r
-\r
-            void detachPreparationStatusObserver()\r
-            {\r
-                if (playerItem != nullptr && playerItemPreparationStatusObserver != nullptr)\r
-                {\r
-                    [playerItem.get() removeObserver: playerItemPreparationStatusObserver.get()\r
-                                          forKeyPath: nsStringLiteral ("status")\r
-                                             context: this];\r
-                }\r
-            }\r
-\r
-            //==============================================================================\r
-            void notifyOwnerPreparationFinished (const URL& url, Result r, AVPlayer* preparedPlayer)\r
-            {\r
-                WeakReference<PlayerAsyncInitialiser> safeThis (this);\r
-\r
-                MessageManager::callAsync ([safeThis, url, r, preparedPlayer]() mutable\r
-                {\r
-                    if (safeThis != nullptr)\r
-                        safeThis->owner.playerPreparationFinished (url, r, preparedPlayer);\r
-                });\r
-            }\r
-\r
-            JUCE_DECLARE_WEAK_REFERENCEABLE (PlayerAsyncInitialiser)\r
-        };\r
-\r
-        //==============================================================================\r
-        Pimpl& owner;\r
-        bool useNativeControls;\r
-\r
-        PlayerAsyncInitialiser playerAsyncInitialiser;\r
-        std::unique_ptr<NSObject, NSObjectDeleter> playerStatusObserver;\r
-        std::unique_ptr<NSObject, NSObjectDeleter> playerItemPlaybackStatusObserver;\r
-\r
-        //==============================================================================\r
-        PlayerControllerBase (Pimpl& ownerToUse, bool useNativeControlsIfAvailable)\r
-            : owner (ownerToUse),\r
-              useNativeControls (useNativeControlsIfAvailable),\r
-              playerAsyncInitialiser (*this)\r
-        {\r
-            static JucePlayerStatusObserverClass playerObserverClass;\r
-            playerStatusObserver.reset ([playerObserverClass.createInstance() init]);\r
-            JucePlayerStatusObserverClass::setOwner (playerStatusObserver.get(), this);\r
-\r
-            static JucePlayerItemPlaybackStatusObserverClass itemObserverClass;\r
-            playerItemPlaybackStatusObserver.reset ([itemObserverClass.createInstance() init]);\r
-            JucePlayerItemPlaybackStatusObserverClass::setOwner (playerItemPlaybackStatusObserver.get(), this);\r
-        }\r
-\r
-        //==============================================================================\r
-        void attachPlayerStatusObserver()\r
-        {\r
-            [crtp().getPlayer() addObserver: playerStatusObserver.get()\r
-                                 forKeyPath: nsStringLiteral ("rate")\r
-                                    options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew\r
-                                    context: this];\r
-\r
-            [crtp().getPlayer() addObserver: playerStatusObserver.get()\r
-                                 forKeyPath: nsStringLiteral ("status")\r
-                                    options: NSKeyValueObservingOptionNew\r
-                                    context: this];\r
-        }\r
-\r
-        void detachPlayerStatusObserver()\r
-        {\r
-            if (crtp().getPlayer() != nullptr && playerStatusObserver != nullptr)\r
-            {\r
-                    [crtp().getPlayer() removeObserver: playerStatusObserver.get()\r
-                                            forKeyPath: nsStringLiteral ("rate")\r
-                                               context: this];\r
-\r
-                    [crtp().getPlayer() removeObserver: playerStatusObserver.get()\r
-                                            forKeyPath: nsStringLiteral ("status")\r
-                                               context: this];\r
-            }\r
-        }\r
-\r
-        void attachPlaybackObserver()\r
-        {\r
-           #pragma clang diagnostic push\r
-           #pragma clang diagnostic ignored "-Wundeclared-selector"\r
-            [[NSNotificationCenter defaultCenter] addObserver: playerItemPlaybackStatusObserver.get()\r
-                                                     selector: @selector (processNotification:)\r
-                                                         name: AVPlayerItemDidPlayToEndTimeNotification\r
-                                                       object: [crtp().getPlayer() currentItem]];\r
-           #pragma clang diagnostic pop\r
-        }\r
-\r
-        void detachPlaybackObserver()\r
-        {\r
-           #pragma clang diagnostic push\r
-           #pragma clang diagnostic ignored "-Wundeclared-selector"\r
-            [[NSNotificationCenter defaultCenter] removeObserver: playerItemPlaybackStatusObserver.get()];\r
-           #pragma clang diagnostic pop\r
-        }\r
-\r
-    private:\r
-        //==============================================================================\r
-        Derived& crtp() { return static_cast<Derived&> (*this); }\r
-\r
-        //==============================================================================\r
-        void playerPreparationFinished (const URL& url, Result r, AVPlayer* preparedPlayer)\r
-        {\r
-            if (preparedPlayer != nil)\r
-                crtp().setPlayer (preparedPlayer);\r
-\r
-            owner.playerPreparationFinished (url, r);\r
-        }\r
-\r
-        void playbackReachedEndTime()\r
-        {\r
-            WeakReference<PlayerControllerBase> safeThis (this);\r
-\r
-            MessageManager::callAsync ([safeThis]() mutable\r
-                                       {\r
-                                           if (safeThis != nullptr)\r
-                                               safeThis->owner.playbackReachedEndTime();\r
-                                       });\r
-        }\r
-\r
-        //==============================================================================\r
-        void errorOccurred()\r
-        {\r
-            auto errorMessage = (crtp().getPlayer() != nil && crtp().getPlayer().error != nil)\r
-                              ? nsStringToJuce (crtp().getPlayer().error.localizedDescription)\r
-                              : String();\r
-\r
-            owner.errorOccurred (errorMessage);\r
-        }\r
-\r
-        void playbackStarted()\r
-        {\r
-            owner.playbackStarted();\r
-        }\r
-\r
-        void playbackStopped()\r
-        {\r
-            owner.playbackStopped();\r
-        }\r
-\r
-        JUCE_DECLARE_WEAK_REFERENCEABLE (PlayerControllerBase)\r
-    };\r
-\r
-   #if JUCE_MAC\r
-    //==============================================================================\r
-    class PlayerController  : public PlayerControllerBase<PlayerController>\r
-    {\r
-    public:\r
-        PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable)\r
-            : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable)\r
-        {\r
-           #if JUCE_32BIT\r
-            // 32-bit builds don't have AVPlayerView, so need to use a layer\r
-            useNativeControls = false;\r
-           #endif\r
-\r
-            if (useNativeControls)\r
-            {\r
-               #if ! JUCE_32BIT\r
-                playerView = [[AVPlayerView alloc] init];\r
-               #endif\r
-            }\r
-            else\r
-            {\r
-                view = [[NSView alloc] init];\r
-                playerLayer = [[AVPlayerLayer alloc] init];\r
-                [view setLayer: playerLayer];\r
-            }\r
-        }\r
-\r
-        ~PlayerController()\r
-        {\r
-           #if JUCE_32BIT\r
-            [view release];\r
-            [playerLayer release];\r
-           #else\r
-            [playerView release];\r
-           #endif\r
-        }\r
-\r
-        NSView* getView()\r
-        {\r
-           #if ! JUCE_32BIT\r
-            if (useNativeControls)\r
-                return playerView;\r
-           #endif\r
-\r
-            return view;\r
-        }\r
-\r
-        Result load (NSURL* url)\r
-        {\r
-            if (auto player = [AVPlayer playerWithURL: url])\r
-            {\r
-                setPlayer (player);\r
-                return Result::ok();\r
-            }\r
-\r
-            return Result::fail ("Couldn't open movie");\r
-        }\r
-\r
-        void loadAsync (URL url)\r
-        {\r
-            playerAsyncInitialiser.loadAsync (url);\r
-        }\r
-\r
-        void close() { setPlayer (nil); }\r
-\r
-        void setPlayer (AVPlayer* player)\r
-        {\r
-           #if ! JUCE_32BIT\r
-            if (useNativeControls)\r
-            {\r
-                [playerView setPlayer: player];\r
-                attachPlayerStatusObserver();\r
-                attachPlaybackObserver();\r
-                return;\r
-            }\r
-           #endif\r
-\r
-            [playerLayer setPlayer: player];\r
-            attachPlayerStatusObserver();\r
-            attachPlaybackObserver();\r
-        }\r
-\r
-        AVPlayer* getPlayer() const\r
-        {\r
-           #if ! JUCE_32BIT\r
-            if (useNativeControls)\r
-                return [playerView player];\r
-           #endif\r
-\r
-            return [playerLayer player];\r
-        }\r
-\r
-    private:\r
-        NSView* view = nil;\r
-        AVPlayerLayer* playerLayer = nil;\r
-       #if ! JUCE_32BIT\r
-        // 32-bit builds don't have AVPlayerView\r
-        AVPlayerView* playerView = nil;\r
-       #endif\r
-    };\r
+   #if JUCE_IOS\r
+    AVPlayerViewController* controller = nil;\r
+   #elif JUCE_32BIT\r
+    AVPlayerLayer* controller = nil;\r
    #else\r
-    //==============================================================================\r
-    class PlayerController  : public PlayerControllerBase<PlayerController>\r
-    {\r
-    public:\r
-        PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable)\r
-            : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable)\r
-        {\r
-            if (useNativeControls)\r
-            {\r
-                playerViewController.reset ([[AVPlayerViewController alloc] init]);\r
-            }\r
-            else\r
-            {\r
-                static JuceVideoViewerClass cls;\r
-                playerView.reset ([cls.createInstance() init]);\r
-\r
-                playerLayer.reset ([[AVPlayerLayer alloc] init]);\r
-                [playerView.get().layer addSublayer: playerLayer.get()];\r
-            }\r
-        }\r
-\r
-        UIView* getView()\r
-        {\r
-            if (useNativeControls)\r
-                return [playerViewController.get() view];\r
-\r
-            // Should call getView() only once.\r
-            jassert (playerView != nil);\r
-            return playerView.release();\r
-        }\r
-\r
-        Result load (NSURL*)\r
-        {\r
-            jassertfalse;\r
-            return Result::fail ("Synchronous loading is not supported on iOS, use loadAsync()");\r
-        }\r
-\r
-        void loadAsync (URL url)\r
-        {\r
-            playerAsyncInitialiser.loadAsync (url);\r
-        }\r
-\r
-        void close() { setPlayer (nil); }\r
-\r
-        AVPlayer* getPlayer() const\r
-        {\r
-            if (useNativeControls)\r
-                return [playerViewController.get() player];\r
-\r
-            return [playerLayer.get() player];\r
-        }\r
-\r
-        void setPlayer (AVPlayer* playerToUse)\r
-        {\r
-            if (useNativeControls)\r
-                [playerViewController.get() setPlayer: playerToUse];\r
-            else\r
-                [playerLayer.get() setPlayer: playerToUse];\r
-\r
-            attachPlayerStatusObserver();\r
-            attachPlaybackObserver();\r
-        }\r
-\r
-    private:\r
-        //==============================================================================\r
-        struct JuceVideoViewerClass    : public ObjCClass<UIView>\r
-        {\r
-            JuceVideoViewerClass()  : ObjCClass<UIView> ("JuceVideoViewerClass_")\r
-            {\r
-                addMethod (@selector (layoutSubviews), layoutSubviews, "v@:");\r
-\r
-                registerClass();\r
-            }\r
-\r
-        private:\r
-            static void layoutSubviews (id self, SEL)\r
-            {\r
-                sendSuperclassMessage (self, @selector (layoutSubviews));\r
-\r
-                UIView* asUIView = (UIView*) self;\r
-\r
-                if (auto* previewLayer = getPreviewLayer (self))\r
-                    previewLayer.frame = asUIView.bounds;\r
-            }\r
-\r
-            static AVPlayerLayer* getPreviewLayer (id self)\r
-            {\r
-                UIView* asUIView = (UIView*) self;\r
-\r
-                if (asUIView.layer.sublayers != nil && [asUIView.layer.sublayers count] > 0)\r
-                    if ([asUIView.layer.sublayers[0] isKindOfClass: [AVPlayerLayer class]])\r
-                        return (AVPlayerLayer*) asUIView.layer.sublayers[0];\r
-\r
-                return nil;\r
-            }\r
-        };\r
-\r
-        //==============================================================================\r
-        std::unique_ptr<AVPlayerViewController, NSObjectDeleter> playerViewController;\r
-\r
-        std::unique_ptr<UIView, NSObjectDeleter> playerView;\r
-        std::unique_ptr<AVPlayerLayer, NSObjectDeleter> playerLayer;\r
-    };\r
+    AVPlayerView* controller = nil;\r
    #endif\r
 \r
-    //==============================================================================\r
-    VideoComponent& owner;\r
-\r
-    PlayerController playerController;\r
-\r
-    std::function<void (const URL&, Result)> loadFinishedCallback;\r
-\r
-    double playSpeedMult = 1.0;\r
+    AVPlayer* getAVPlayer() const noexcept   { return [controller player]; }\r
 \r
     static double toSeconds (const CMTime& t) noexcept\r
     {\r
         return t.timescale != 0 ? (t.value / (double) t.timescale) : 0.0;\r
     }\r
 \r
-    void playerPreparationFinished (const URL& url, Result r)\r
-    {\r
-        owner.resized();\r
-\r
-        loadFinishedCallback (url, r);\r
-        loadFinishedCallback = nullptr;\r
-    }\r
-\r
-    void errorOccurred (const String& errorMessage)\r
-    {\r
-        if (owner.onErrorOccurred != nullptr)\r
-            owner.onErrorOccurred (errorMessage);\r
-    }\r
-\r
-    void playbackStarted()\r
-    {\r
-        if (owner.onPlaybackStarted != nullptr)\r
-            owner.onPlaybackStarted();\r
-    }\r
-\r
-    void playbackStopped()\r
-    {\r
-        if (owner.onPlaybackStopped != nullptr)\r
-            owner.onPlaybackStopped();\r
-    }\r
-\r
-    void playbackReachedEndTime()\r
-    {\r
-        stop();\r
-        setPosition (0.0);\r
-    }\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)\r
 };\r
index 9f4840038c17b4c80bd0696df729062c0d981631..dc631b48216aa4c3e4d426dc86b9b2e373e065d2 100644 (file)
@@ -52,7 +52,14 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
     Pimpl (CameraDevice& ownerToUse, const String&, int index,\r
            int minWidth, int minHeight, int maxWidth, int maxHeight,\r
            bool /*highQuality*/)\r
-       : owner (ownerToUse)\r
+       : owner (ownerToUse),\r
+         isRecording (false),\r
+         openedSuccessfully (false),\r
+         imageNeedsFlipping (false),\r
+         width (0), height (0),\r
+         activeUsers (0),\r
+         recordNextFrameTime (false),\r
+         previewMaxFPS (60)\r
     {\r
         HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);\r
         if (FAILED (hr))\r
@@ -561,8 +568,8 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
     CriticalSection pictureTakenCallbackLock;\r
     std::function<void (const Image&)> pictureTakenCallback;\r
 \r
-    bool isRecording = false, openedSuccessfully = false;\r
-    int width = 0, height = 0;\r
+    bool isRecording, openedSuccessfully;\r
+    int width, height;\r
     Time firstRecordedTime;\r
 \r
     Array<ViewerComponent*> viewerComps;\r
@@ -573,16 +580,16 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
     ComSmartPtr<ISampleGrabber> sampleGrabber;\r
     ComSmartPtr<IMediaControl> mediaControl;\r
     ComSmartPtr<IPin> smartTeePreviewOutputPin, smartTeeCaptureOutputPin;\r
-    int activeUsers = 0;\r
+    int activeUsers;\r
     Array<int> widths, heights;\r
     DWORD graphRegistrationID;\r
 \r
     CriticalSection imageSwapLock;\r
-    bool imageNeedsFlipping = false;\r
+    bool imageNeedsFlipping;\r
     Image loadingImage, activeImage;\r
 \r
-    bool recordNextFrameTime = false;\r
-    int previewMaxFPS = 60;\r
+    bool recordNextFrameTime;\r
+    int previewMaxFPS;\r
 \r
     JUCE_DECLARE_WEAK_REFERENCEABLE (Pimpl)\r
 \r
@@ -622,6 +629,7 @@ private:
 \r
                     if (! duplicate)\r
                     {\r
+                        DBG ("Camera capture size: " + String (w) + ", " + String (h));\r
                         widths.add (w);\r
                         heights.add (h);\r
                     }\r
index 598a89949db05bbe2a556951d89614e90ec723c3..dd25a2ea5fbaa9fa159a859ba028019ab3091788 100644 (file)
@@ -159,13 +159,8 @@ namespace VideoRenderers
 \r
 //==============================================================================\r
 struct VideoComponent::Pimpl  : public Component\r
-                             #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                              , public ComponentPeer::ScaleFactorListener\r
-                             #endif\r
 {\r
-    Pimpl (VideoComponent& ownerToUse, bool)\r
-        : owner (ownerToUse),\r
-          videoLoaded (false)\r
+    Pimpl()  : videoLoaded (false)\r
     {\r
         setOpaque (true);\r
         context.reset (new DirectShowContext (*this));\r
@@ -177,12 +172,6 @@ struct VideoComponent::Pimpl  : public Component
         close();\r
         context = nullptr;\r
         componentWatcher = nullptr;\r
-\r
-       #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-        for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
-            if (auto* peer = ComponentPeer::getPeer (i))\r
-                peer->removeScaleFactorListener (this);\r
-       #endif\r
     }\r
 \r
     Result loadFromString (const String& fileOrURLPath)\r
@@ -211,7 +200,7 @@ struct VideoComponent::Pimpl  : public Component
 \r
     Result load (const URL& url)\r
     {\r
-        auto r = loadFromString (URL::removeEscapeChars (url.toString (true)));\r
+        auto r = loadFromString (url.toString (true));\r
 \r
         if (r.wasOk())\r
             currentURL = url;\r
@@ -268,11 +257,6 @@ struct VideoComponent::Pimpl  : public Component
             context->setSpeed (newSpeed);\r
     }\r
 \r
-    double getSpeed() const\r
-    {\r
-        return videoLoaded ? context->getSpeed() : 0.0;\r
-    }\r
-\r
     Rectangle<int> getNativeSize() const\r
     {\r
         return videoLoaded ? context->getVideoSize()\r
@@ -309,7 +293,7 @@ struct VideoComponent::Pimpl  : public Component
 \r
         if (getWidth() > 0 && getHeight() > 0)\r
             if (auto* peer = getTopLevelComponent()->getPeer())\r
-                context->updateWindowPosition ((peer->getAreaCoveredBy (*this).toDouble() * peer->getPlatformScaleFactor()).toNearestInt());\r
+                context->updateWindowPosition (peer->getAreaCoveredBy (*this));\r
     }\r
 \r
     void updateContextVisibility()\r
@@ -323,38 +307,10 @@ struct VideoComponent::Pimpl  : public Component
         repaint();\r
     }\r
 \r
-    void playbackStarted()\r
-    {\r
-        if (owner.onPlaybackStarted != nullptr)\r
-            owner.onPlaybackStarted();\r
-    }\r
-\r
-    void playbackStopped()\r
-    {\r
-        if (owner.onPlaybackStopped != nullptr)\r
-            owner.onPlaybackStopped();\r
-    }\r
-\r
-    void errorOccurred (const String& errorMessage)\r
-    {\r
-        if (owner.onErrorOccurred != nullptr)\r
-            owner.onErrorOccurred (errorMessage);\r
-    }\r
-\r
-   #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    void nativeScaleFactorChanged (double /*newScaleFactor*/) override\r
-    {\r
-        if (videoLoaded)\r
-            updateContextPosition();\r
-    }\r
-   #endif\r
-\r
     File currentFile;\r
     URL currentURL;\r
 \r
 private:\r
-    VideoComponent& owner;\r
-\r
     bool videoLoaded;\r
 \r
     //==============================================================================\r
@@ -439,15 +395,12 @@ private:
             deleteNativeWindow();\r
 \r
             mediaEvent->SetNotifyWindow (0, 0, 0);\r
-\r
             if (videoRenderer != nullptr)\r
                 videoRenderer->setVideoWindow (nullptr);\r
 \r
             createNativeWindow();\r
 \r
-            mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
             mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
-\r
             if (videoRenderer != nullptr)\r
                 videoRenderer->setVideoWindow (hwnd);\r
         }\r
@@ -557,10 +510,7 @@ private:
 \r
             // set window to receive events\r
             if (SUCCEEDED (hr))\r
-            {\r
-                mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
                 hr = mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
-            }\r
 \r
             if (SUCCEEDED (hr))\r
             {\r
@@ -636,33 +586,22 @@ private:
 \r
                 switch (ec)\r
                 {\r
-                    case EC_REPAINT:\r
-                        component.repaint();\r
-                        break;\r
-\r
-                    case EC_COMPLETE:\r
-                        component.stop();\r
-                        component.setPosition (0.0);\r
-                        break;\r
-\r
-                    case EC_ERRORABORT:\r
-                    case EC_ERRORABORTEX:\r
-                        component.errorOccurred (getErrorMessageFromResult ((HRESULT) p1).getErrorMessage());\r
-                        // intentional fallthrough\r
-                    case EC_USERABORT:\r
-                        component.close();\r
-                        break;\r
-\r
-                    case EC_STATE_CHANGE:\r
-                        switch (p1)\r
-                        {\r
-                            case State_Paused:  component.playbackStopped(); break;\r
-                            case State_Running: component.playbackStarted(); break;\r
-                            default: break;\r
-                        }\r
-\r
-                    default:\r
-                        break;\r
+                case EC_REPAINT:\r
+                    component.repaint();\r
+                    break;\r
+\r
+                case EC_COMPLETE:\r
+                    component.stop();\r
+                    break;\r
+\r
+                case EC_USERABORT:\r
+                case EC_ERRORABORT:\r
+                case EC_ERRORABORTEX:\r
+                    component.close();\r
+                    break;\r
+\r
+                default:\r
+                    break;\r
                 }\r
             }\r
         }\r
@@ -705,13 +644,6 @@ private:
             return duration;\r
         }\r
 \r
-        double getSpeed() const\r
-        {\r
-            double speed;\r
-            mediaPosition->get_Rate (&speed);\r
-            return speed;\r
-        }\r
-\r
         double getPosition() const\r
         {\r
             REFTIME seconds;\r
@@ -772,10 +704,6 @@ private:
 \r
                 hwnd = nativeWindow->hwnd;\r
 \r
-               #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-                topLevelPeer->addScaleFactorListener (&component);\r
-               #endif\r
-\r
                 if (hwnd != 0)\r
                 {\r
                     hdc = GetDC (hwnd);\r
index b6554d1ceae1e45ca3ef8440d5342dfae568947b..c83fea652a070771155ed27065cb383ad94475c3 100644 (file)
 namespace juce\r
 {\r
 \r
-#if ! (JUCE_LINUX || JUCE_PROJUCER_LIVE_BUILD)\r
+#if JUCE_MAC || JUCE_IOS || JUCE_MSVC\r
 \r
 #if JUCE_MAC || JUCE_IOS\r
  #include "../native/juce_mac_Video.h"\r
 #elif JUCE_WINDOWS\r
  #include "../native/juce_win32_Video.h"\r
-#elif JUCE_ANDROID\r
- #include "../native/juce_android_Video.h"\r
 #endif\r
 \r
 //==============================================================================\r
-VideoComponent::VideoComponent (bool useNativeControlsIfAvailable)\r
-    : pimpl (new Pimpl (*this, useNativeControlsIfAvailable))\r
+VideoComponent::VideoComponent()  : pimpl (new Pimpl())\r
 {\r
     addAndMakeVisible (pimpl.get());\r
 }\r
@@ -49,55 +46,22 @@ VideoComponent::~VideoComponent()
 \r
 Result VideoComponent::load (const File& file)\r
 {\r
-   #if JUCE_ANDROID || JUCE_IOS\r
-    ignoreUnused (file);\r
-    jassertfalse;\r
-    return Result::fail ("load() is not supported on this platform. Use loadAsync() instead.");\r
-   #else\r
     auto r = pimpl->load (file);\r
     resized();\r
     return r;\r
-   #endif\r
 }\r
 \r
 Result VideoComponent::load (const URL& url)\r
 {\r
-   #if JUCE_ANDROID || JUCE_IOS\r
-    // You need to use loadAsync on Android & iOS.\r
-    ignoreUnused (url);\r
-    jassertfalse;\r
-    return Result::fail ("load() is not supported on this platform. Use loadAsync() instead.");\r
-   #else\r
     auto r = pimpl->load (url);\r
     resized();\r
     return r;\r
-   #endif\r
-}\r
-\r
-void VideoComponent::loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)\r
-{\r
-    if (callback == nullptr)\r
-    {\r
-        jassertfalse;\r
-        return;\r
-    }\r
-\r
-   #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
-    pimpl->loadAsync (url, callback);\r
-   #else\r
-    auto result = load (url);\r
-    callback (url, result);\r
-   #endif\r
 }\r
 \r
 void VideoComponent::closeVideo()\r
 {\r
     pimpl->close();\r
-    // Closing on Android is async and resized() will be called internally by pimpl once\r
-    // close operation finished.\r
-   #if ! JUCE_ANDROID// TODO JUCE_IOS too?\r
     resized();\r
-   #endif\r
 }\r
 \r
 bool VideoComponent::isVideoOpen() const                    { return pimpl->isOpen(); }\r
@@ -117,8 +81,6 @@ void VideoComponent::setPlayPosition (double newPos)        { pimpl->setPosition
 double VideoComponent::getPlayPosition() const              { return pimpl->getPosition(); }\r
 \r
 void VideoComponent::setPlaySpeed (double newSpeed)         { pimpl->setSpeed (newSpeed); }\r
-double VideoComponent::getPlaySpeed() const                 { return pimpl->getSpeed(); }\r
-\r
 void VideoComponent::setAudioVolume (float newVolume)       { pimpl->setVolume (newVolume); }\r
 float VideoComponent::getAudioVolume() const                { return pimpl->getVolume(); }\r
 \r
index 851fded0208ea3ca5c3afff7ba348f8595506437..b960cdfbac5dfadc4755868b5576b19cfa7d74d9 100644 (file)
@@ -44,55 +44,25 @@ public:
     //==============================================================================\r
     /** Creates an empty VideoComponent.\r
 \r
-        Use the loadAsync() or load() method to open a video once you've added\r
-        this component to a parent (or put it on the desktop).\r
-\r
-        If useNativeControlsIfAvailable is enabled and a target OS has a video view with\r
-        dedicated controls for transport etc, that view will be used. In opposite\r
-        case a bare video view without any controls will be presented, allowing you to\r
-        tailor your own UI. Currently this flag is used on iOS and 64bit macOS.\r
-        Android, Windows and 32bit macOS will always use plain video views without\r
-        dedicated controls.\r
+        Use the load() method to open a video once you've added this component to\r
+        a parent (or put it on the desktop).\r
     */\r
-    VideoComponent (bool useNativeControlsIfAvailable);\r
+    VideoComponent();\r
 \r
     /** Destructor. */\r
     ~VideoComponent();\r
 \r
     //==============================================================================\r
     /** Tries to load a video from a local file.\r
-\r
-        This function is supported on macOS and Windows. For iOS and Android, use\r
-        loadAsync() instead.\r
-\r
         @returns an error if the file failed to be loaded correctly\r
-\r
-        @see loadAsync\r
     */\r
     Result load (const File& file);\r
 \r
     /** Tries to load a video from a URL.\r
-\r
-        This function is supported on macOS and Windows. For iOS and Android, use\r
-        loadAsync() instead.\r
-\r
         @returns an error if the file failed to be loaded correctly\r
-\r
-        @see loadAsync\r
     */\r
     Result load (const URL& url);\r
 \r
-    /** Tries to load a video from a URL asynchronously. When finished, invokes the\r
-        callback supplied to the function on the message thread.\r
-\r
-        This is the preferred way of loading content, since it works not only on\r
-        macOS and Windows, but also on iOS and Android. On Windows, it will internally\r
-        call load().\r
-\r
-        @see load\r
-     */\r
-    void loadAsync (const URL& url, std::function<void (const URL&, Result)> loadFinishedCallback);\r
-\r
     /** Closes the video and resets the component. */\r
     void closeVideo();\r
 \r
@@ -139,9 +109,6 @@ public:
     */\r
     void setPlaySpeed (double newSpeed);\r
 \r
-    /** Returns the current play speed of the video. */\r
-    double getPlaySpeed() const;\r
-\r
     /** Changes the video's playback volume.\r
         @param newVolume    the volume in the range 0 (silent) to 1.0 (full)\r
     */\r
@@ -152,49 +119,16 @@ public:
     */\r
     float getAudioVolume() const;\r
 \r
-   #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
-    /** Set this callback to be notified whenever OS global media volume changes.\r
-        Currently used on Android only.\r
-     */\r
-    std::function<void()> onGlobalMediaVolumeChanged;\r
-   #endif\r
-\r
-    /** Set this callback to be notified whenever the playback starts. */\r
-    std::function<void()> onPlaybackStarted;\r
-\r
-    /** Set this callback to be notified whenever the playback stops. */\r
-    std::function<void()> onPlaybackStopped;\r
-\r
-    /** Set this callback to be notified whenever an error occurs. Upon error, you\r
-        may need to load the video again. */\r
-    std::function<void (const String& /*error*/)> onErrorOccurred;\r
-\r
 private:\r
     //==============================================================================\r
     struct Pimpl;\r
+    friend struct Pimpl;\r
+    friend struct ContainerDeletePolicy<Pimpl>;\r
     std::unique_ptr<Pimpl> pimpl;\r
 \r
     void resized() override;\r
     void timerCallback() override;\r
 \r
-    #if JUCE_ANDROID\r
-    friend void juce_surfaceChangedNativeVideo (int64, void*);\r
-    friend void juce_surfaceDestroyedNativeVideo (int64, void*);\r
-\r
-    friend void juce_mediaSessionPause (int64);\r
-    friend void juce_mediaSessionPlay (int64);\r
-    friend void juce_mediaSessionPlayFromMediaId (int64, void*, void*);\r
-    friend void juce_mediaSessionSeekTo (int64, int64);\r
-    friend void juce_mediaSessionStop (int64);\r
-\r
-    friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
-    friend void juce_mediaControllerMetadataChanged (int64, void*);\r
-    friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
-    friend void juce_mediaControllerSessionDestroyed (int64);\r
-\r
-    friend void juce_mediaSessionSystemVolumeChanged (int64);\r
-    #endif\r
-\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VideoComponent)\r
 };\r
 \r